diff options
author | Tristan Gingold <tgingold@free.fr> | 2014-10-30 20:47:22 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2014-10-30 20:47:22 +0100 |
commit | bcf093a11bc33d82c43c0b7b5fa714665b199fd4 (patch) | |
tree | f02eb66f0add9119b7fa178f66b01e1ac378cd27 /sem.adb | |
parent | e5071f1a02f16a369c504944934042fbfb09e5dc (diff) | |
download | ghdl-bcf093a11bc33d82c43c0b7b5fa714665b199fd4.tar.gz ghdl-bcf093a11bc33d82c43c0b7b5fa714665b199fd4.tar.bz2 ghdl-bcf093a11bc33d82c43c0b7b5fa714665b199fd4.zip |
Avoid crash after error on package generic association.
Diffstat (limited to 'sem.adb')
-rw-r--r-- | sem.adb | 76 |
1 files changed, 48 insertions, 28 deletions
@@ -346,8 +346,8 @@ package body Sem is -- INTER_PARENT contains generics interfaces; -- ASSOC_PARENT constains generic aspects. - procedure Sem_Generic_Association_Chain - (Inter_Parent : Iir; Assoc_Parent : Iir) + function Sem_Generic_Association_Chain + (Inter_Parent : Iir; Assoc_Parent : Iir) return Boolean is El : Iir; Match : Boolean; @@ -407,31 +407,45 @@ package body Sem is Assoc_Chain := Extract_Non_Object_Association (Assoc_Chain, Inter_Chain); Set_Generic_Map_Aspect_Chain (Assoc_Parent, Assoc_Chain); - if Sem_Actual_Of_Association_Chain (Assoc_Chain) then - Sem_Association_Chain - (Inter_Chain, Assoc_Chain, True, Miss, Assoc_Parent, Match); - Set_Generic_Map_Aspect_Chain (Assoc_Parent, Assoc_Chain); - - -- LRM 5.2.1.2 Generic map and port map aspects - -- An actual associated with a formal generic map aspect must be an - -- expression or the reserved word open; - if Match then - El := Assoc_Chain; - while El /= Null_Iir loop - case Get_Kind (El) is - when Iir_Kind_Association_Element_By_Expression => - Check_Read (Get_Actual (El)); - when Iir_Kind_Association_Element_Open - | Iir_Kind_Association_Element_By_Individual - | Iir_Kind_Association_Element_Package => - null; - when others => - Error_Kind ("sem_generic_map_association_chain(1)", El); - end case; - El := Get_Chain (El); - end loop; - end if; + if not Sem_Actual_Of_Association_Chain (Assoc_Chain) then + return False; end if; + + Sem_Association_Chain + (Inter_Chain, Assoc_Chain, True, Miss, Assoc_Parent, Match); + Set_Generic_Map_Aspect_Chain (Assoc_Parent, Assoc_Chain); + if not Match then + return False; + end if; + + -- LRM 5.2.1.2 Generic map and port map aspects + -- An actual associated with a formal generic map aspect must be an + -- expression or the reserved word open; + El := Assoc_Chain; + while El /= Null_Iir loop + case Get_Kind (El) is + when Iir_Kind_Association_Element_By_Expression => + Check_Read (Get_Actual (El)); + when Iir_Kind_Association_Element_Open + | Iir_Kind_Association_Element_By_Individual + | Iir_Kind_Association_Element_Package => + null; + when others => + Error_Kind ("sem_generic_map_association_chain(1)", El); + end case; + El := Get_Chain (El); + end loop; + + return True; + end Sem_Generic_Association_Chain; + + procedure Sem_Generic_Association_Chain + (Inter_Parent : Iir; Assoc_Parent : Iir) + is + Res : Boolean; + pragma Unreferenced (Res); + begin + Res := Sem_Generic_Association_Chain (Inter_Parent, Assoc_Parent); end Sem_Generic_Association_Chain; -- INTER_PARENT contains ports interfaces; @@ -601,6 +615,8 @@ package body Sem is procedure Sem_Generic_Port_Association_Chain (Inter_Parent : Iir; Assoc_Parent : Iir) is + Res : Boolean; + pragma Unreferenced (Res); begin Sem_Generic_Association_Chain (Inter_Parent, Assoc_Parent); Sem_Port_Association_Chain (Inter_Parent, Assoc_Parent); @@ -2469,8 +2485,12 @@ package body Sem is -- the actuals are associated with the instantiated formal. -- FIXME: do it in Instantiate_Package_Declaration ? Hdr := Get_Package_Header (Pkg); - Sem_Generic_Association_Chain (Hdr, Decl); - Sem_Inst.Instantiate_Package_Declaration (Decl, Pkg); + if Sem_Generic_Association_Chain (Hdr, Decl) then + Sem_Inst.Instantiate_Package_Declaration (Decl, Pkg); + else + -- FIXME: stop analysis here ? + null; + end if; -- FIXME: unless the parent is a package declaration library unit, the -- design unit depends on the body. |