diff options
author | Tristan Gingold <tgingold@free.fr> | 2022-04-15 17:57:53 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2022-04-15 18:00:28 +0200 |
commit | 61c76d59af0d2216d34f6733ee46b849fbdc18dd (patch) | |
tree | 77b20b530456f6ca84f5ef0c59b2df26f12998e1 /src | |
parent | d71a4391c20867d7e7ccc3a71a90cc4743fef610 (diff) | |
download | ghdl-61c76d59af0d2216d34f6733ee46b849fbdc18dd.tar.gz ghdl-61c76d59af0d2216d34f6733ee46b849fbdc18dd.tar.bz2 ghdl-61c76d59af0d2216d34f6733ee46b849fbdc18dd.zip |
trans-chap2.adb: adjust owner_subtype for instantiations. Fix #2026
Diffstat (limited to 'src')
-rw-r--r-- | src/vhdl/translate/trans-chap2.adb | 37 | ||||
-rw-r--r-- | src/vhdl/translate/trans.ads | 2 |
2 files changed, 39 insertions, 0 deletions
diff --git a/src/vhdl/translate/trans-chap2.adb b/src/vhdl/translate/trans-chap2.adb index 222c9d852..ff04a13b7 100644 --- a/src/vhdl/translate/trans-chap2.adb +++ b/src/vhdl/translate/trans-chap2.adb @@ -1491,6 +1491,43 @@ package body Trans.Chap2 is if Info /= null then Clean_Copy_Info (Info); end if; + + -- Adjust Subtype_Owner. + case Get_Kind (N) is + when Iir_Kind_Array_Subtype_Definition => + declare + El_Type : constant Iir := Get_Element_Subtype (N); + El_Tinfo : constant Type_Info_Acc := Get_Info (El_Type); + begin + if El_Tinfo.S.Kind in Kind_Type_Array .. Kind_Type_Record + and then El_Tinfo.S.Subtype_Owner = Orig_Info + then + pragma Assert (Info /= null); + El_Tinfo.S.Subtype_Owner := Info; + end if; + end; + when Iir_Kind_Record_Subtype_Definition => + declare + El : Iir; + El_Type : Iir; + El_Tinfo : Type_Info_Acc; + begin + El := Get_Owned_Elements_Chain (N); + while El /= Null_Iir loop + El_Type := Get_Type (El); + El_Tinfo := Get_Info (El_Type); + if El_Tinfo.S.Kind in Kind_Type_Array .. Kind_Type_Record + and then El_Tinfo.S.Subtype_Owner = Orig_Info + then + pragma Assert (Info /= null); + El_Tinfo.S.Subtype_Owner := Info; + end if; + El := Get_Chain (El); + end loop; + end; + when others => + null; + end case; end; end Instantiate_Iir_Info; diff --git a/src/vhdl/translate/trans.ads b/src/vhdl/translate/trans.ads index 3c47d94ec..6178d46a4 100644 --- a/src/vhdl/translate/trans.ads +++ b/src/vhdl/translate/trans.ads @@ -1373,6 +1373,8 @@ package Trans is -- Variable containing the layout for a constrained type. Composite_Layout : Var_Type; + -- Subtype definition that owns this subtype (as an element). + -- Used to refere to the layout. Subtype_Owner : Type_Info_Acc := null; Owner_Field : Field_Info_Acc := null; |