aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/translate/trans-chap2.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2022-04-15 17:57:53 +0200
committerTristan Gingold <tgingold@free.fr>2022-04-15 18:00:28 +0200
commit61c76d59af0d2216d34f6733ee46b849fbdc18dd (patch)
tree77b20b530456f6ca84f5ef0c59b2df26f12998e1 /src/vhdl/translate/trans-chap2.adb
parentd71a4391c20867d7e7ccc3a71a90cc4743fef610 (diff)
downloadghdl-61c76d59af0d2216d34f6733ee46b849fbdc18dd.tar.gz
ghdl-61c76d59af0d2216d34f6733ee46b849fbdc18dd.tar.bz2
ghdl-61c76d59af0d2216d34f6733ee46b849fbdc18dd.zip
trans-chap2.adb: adjust owner_subtype for instantiations. Fix #2026
Diffstat (limited to 'src/vhdl/translate/trans-chap2.adb')
-rw-r--r--src/vhdl/translate/trans-chap2.adb37
1 files changed, 37 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;