diff options
| author | Tristan Gingold <tgingold@free.fr> | 2022-11-30 21:26:43 +0100 | 
|---|---|---|
| committer | Tristan Gingold <tgingold@free.fr> | 2022-11-30 21:26:43 +0100 | 
| commit | 844089aa1ab3fa52a0dc363bdd9cd48e3082655a (patch) | |
| tree | 469e6bd1c9f8afa3e35e1f8ff46866c13fa1e48a | |
| parent | d74e7a232bb4778ac2da6fbb27735bafe4ca9f81 (diff) | |
| download | ghdl-844089aa1ab3fa52a0dc363bdd9cd48e3082655a.tar.gz ghdl-844089aa1ab3fa52a0dc363bdd9cd48e3082655a.tar.bz2 ghdl-844089aa1ab3fa52a0dc363bdd9cd48e3082655a.zip  | |
vhdl: fix use clause of a package with interface subprograms.
Fix #2250
| -rw-r--r-- | src/vhdl/vhdl-sem_assocs.adb | 3 | ||||
| -rw-r--r-- | src/vhdl/vhdl-sem_inst.adb | 3 | ||||
| -rw-r--r-- | src/vhdl/vhdl-sem_scopes.adb | 70 | ||||
| -rw-r--r-- | src/vhdl/vhdl-sem_scopes.ads | 3 | ||||
| -rw-r--r-- | src/vhdl/vhdl-sem_stmts.adb | 4 | 
5 files changed, 63 insertions, 20 deletions
diff --git a/src/vhdl/vhdl-sem_assocs.adb b/src/vhdl/vhdl-sem_assocs.adb index 3bf51c400..a28ebe12e 100644 --- a/src/vhdl/vhdl-sem_assocs.adb +++ b/src/vhdl/vhdl-sem_assocs.adb @@ -2468,7 +2468,8 @@ package body Vhdl.Sem_Assocs is           Warn_Hide_Enabled := Is_Warning_Enabled (Warnid_Hide);           Enable_Warning (Warnid_Hide, False); -         Sem_Scopes.Add_Declarations_From_Interface_Chain (Interface_Chain); +         Sem_Scopes.Add_Declarations_From_Interface_Chain +           (Interface_Chain, False);           Enable_Warning (Warnid_Hide, Warn_Hide_Enabled); diff --git a/src/vhdl/vhdl-sem_inst.adb b/src/vhdl/vhdl-sem_inst.adb index d8f2728ab..4c250d2f4 100644 --- a/src/vhdl/vhdl-sem_inst.adb +++ b/src/vhdl/vhdl-sem_inst.adb @@ -1026,6 +1026,9 @@ package body Vhdl.Sem_Inst is                      Get_Named_Entity (Get_Actual (Assoc));                 begin                    Set_Instance (Get_Origin (Assoc_Formal), Actual_Subprg); +                  --  Also set the associated subprogram to the interface +                  --  subprogram, so that it can referenced through its name. +                  Set_Associated_Subprogram (Assoc_Formal, Actual_Subprg);                 end;              end if;           when others => diff --git a/src/vhdl/vhdl-sem_scopes.adb b/src/vhdl/vhdl-sem_scopes.adb index fd690f364..fcc2707fa 100644 --- a/src/vhdl/vhdl-sem_scopes.adb +++ b/src/vhdl/vhdl-sem_scopes.adb @@ -1007,8 +1007,7 @@ package body Vhdl.Sem_Scopes is        Set_Visible_Flag (Decl, True);     end Name_Visible; -   procedure Iterator_Decl (Decl : Iir; Arg : Arg_Type) -   is +   procedure Iterator_Decl (Decl : Iir; Arg : Arg_Type) is     begin        case Get_Kind (Decl) is           when Iir_Kind_Subtype_Declaration @@ -1229,23 +1228,57 @@ package body Vhdl.Sem_Scopes is     procedure Add_Declarations_List is new Iterator_Decl_List       (Arg_Type => Boolean, Handle_Decl => Add_Declaration); -   procedure Add_Declarations_From_Interface_Chain (Chain : Iir) +   procedure Add_Declarations_From_Interface_Chain +     (Chain : Iir; Potentially : Boolean)     is -      El : Iir; +      Inter : Iir; +      Assoc : Iir;        Id : Name_Id;     begin -      El := Chain; -      while El /= Null_Iir loop -         Id := Get_Identifier (El); +      Inter := Chain; +      while Inter /= Null_Iir loop +         Id := Get_Identifier (Inter);           --  The chain may be from an implicitely declared subprograms, with           --  anonymous identifiers.  In that case, all interfaces are           --  anonymous and there is no need to iterate.           exit when Id = Null_Identifier; -         Add_Declaration (El, False); +         --  Not very different from Add_Declaration, except for interface +         --  subprograms. +         case Iir_Kinds_Interface_Declaration (Get_Kind (Inter)) is +            when Iir_Kinds_Interface_Object_Declaration +              | Iir_Kind_Interface_Package_Declaration +              | Iir_Kind_Interface_Terminal_Declaration => +               Add_Name (Inter, Id, Potentially); +            when Iir_Kinds_Interface_Subprogram_Declaration => +               if Potentially then +                  --  The normal case: an interface subprogram in a package +                  --  is visible through a use clause.  But in fact it refer +                  --  to the associated subprogram. +                  Assoc := Get_Associated_Subprogram (Inter); +                  pragma Assert (Assoc /= Null_Iir); +                  Add_Name (Assoc, Id, Potentially); +               else +                  --  Called only when resolving associations (the identifiers +                  --  of the interfaces are put in the name table). +                  --  TODO: add a flag or create a different procedure ? +                  Add_Name (Inter, Id, Potentially); +               end if; +            when Iir_Kind_Interface_Type_Declaration => +               Add_Name (Inter, Id, Potentially); +               declare +                  El : Iir; +               begin +                  El := Get_Interface_Type_Subprograms (Inter); +                  while El /= Null_Iir loop +                     Add_Name (El, Get_Identifier (El), Potentially); +                     El := Get_Chain (El); +                  end loop; +               end; +         end case; -         El := Get_Chain (El); +         Inter := Get_Chain (Inter);        end loop;     end Add_Declarations_From_Interface_Chain; @@ -1278,8 +1311,10 @@ package body Vhdl.Sem_Scopes is        --  Temporarly disable hide warning to avoid spurious messages.        Enable_Warning (Warnid_Hide, False); -      Add_Declarations_From_Interface_Chain (Get_Generic_Chain (Entity)); -      Add_Declarations_From_Interface_Chain (Get_Port_Chain (Entity)); +      Add_Declarations_From_Interface_Chain +        (Get_Generic_Chain (Entity), False); +      Add_Declarations_From_Interface_Chain +        (Get_Port_Chain (Entity), False);        Add_Declarations (Get_Declaration_Chain (Entity), False);        Add_Declarations_Of_Concurrent_Statement (Entity); @@ -1314,7 +1349,8 @@ package body Vhdl.Sem_Scopes is        --  LRM08 4.9 Package instantiation declarations        --  The package instantiation declaration is equivalent to declaration of        --  a generic-mapped package, consisting of a package declaration [...] -      Add_Declarations (Get_Generic_Chain (Decl), Potentially); +      Add_Declarations_From_Interface_Chain +        (Get_Generic_Chain (Decl), Potentially);        Add_Declarations (Get_Declaration_Chain (Decl), Potentially);     end Add_Package_Instantiation_Declarations; @@ -1325,11 +1361,13 @@ package body Vhdl.Sem_Scopes is        Add_Package_Declarations (Decl, False);     end Add_Package_Declarations; -   procedure Add_Component_Declarations (Component: Iir_Component_Declaration) -   is +   procedure Add_Component_Declarations +     (Component: Iir_Component_Declaration) is     begin -      Add_Declarations_From_Interface_Chain (Get_Generic_Chain (Component)); -      Add_Declarations_From_Interface_Chain (Get_Port_Chain (Component)); +      Add_Declarations_From_Interface_Chain +        (Get_Generic_Chain (Component), False); +      Add_Declarations_From_Interface_Chain +        (Get_Port_Chain (Component), False);     end Add_Component_Declarations;     procedure Add_Protected_Type_Declarations diff --git a/src/vhdl/vhdl-sem_scopes.ads b/src/vhdl/vhdl-sem_scopes.ads index b20e224b0..4622ee1a5 100644 --- a/src/vhdl/vhdl-sem_scopes.ads +++ b/src/vhdl/vhdl-sem_scopes.ads @@ -161,7 +161,8 @@ package Vhdl.Sem_Scopes is     --  Add declarations of interface chain CHAIN into the current     --  declarative region. -   procedure Add_Declarations_From_Interface_Chain (Chain : Iir); +   procedure Add_Declarations_From_Interface_Chain +     (Chain : Iir; Potentially : Boolean);     --  Add all declarations for concurrent statements declared in PARENT.     procedure Add_Declarations_Of_Concurrent_Statement (Parent : Iir); diff --git a/src/vhdl/vhdl-sem_stmts.adb b/src/vhdl/vhdl-sem_stmts.adb index c06c3e097..ad0a4bccc 100644 --- a/src/vhdl/vhdl-sem_stmts.adb +++ b/src/vhdl/vhdl-sem_stmts.adb @@ -2099,8 +2099,8 @@ package body Vhdl.Sem_Stmts is           --  ... and reopen-it.           Open_Declarative_Region;           Set_Is_Within_Flag (Stmt, True); -         Add_Declarations_From_Interface_Chain (Generic_Chain); -         Add_Declarations_From_Interface_Chain (Port_Chain); +         Add_Declarations_From_Interface_Chain (Generic_Chain, False); +         Add_Declarations_From_Interface_Chain (Port_Chain, False);        end if;        --  LRM93 9.1  | 
