diff options
-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; |