diff options
author | Tristan Gingold <tgingold@free.fr> | 2023-01-14 21:23:58 +0100 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2023-01-15 11:36:08 +0100 |
commit | ee94b3820724b653839ea7ad338b2d0d265e4066 (patch) | |
tree | 019656b5dbb9a6bdbf50dc36b1aa40edf1840b0a | |
parent | 97b9f0c7dfb61ceb924a9344a2e2b5dbba10e828 (diff) | |
download | ghdl-ee94b3820724b653839ea7ad338b2d0d265e4066.tar.gz ghdl-ee94b3820724b653839ea7ad338b2d0d265e4066.tar.bz2 ghdl-ee94b3820724b653839ea7ad338b2d0d265e4066.zip |
synth: avoid a crash on instantiation
-rw-r--r-- | src/synth/elab-vhdl_insts.adb | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/synth/elab-vhdl_insts.adb b/src/synth/elab-vhdl_insts.adb index c1a282d20..bacc53e6f 100644 --- a/src/synth/elab-vhdl_insts.adb +++ b/src/synth/elab-vhdl_insts.adb @@ -412,12 +412,14 @@ package body Elab.Vhdl_Insts is Inter : Node; Assoc : Node) return Type_Acc is + Inter_Type : constant Node := Get_Type (Inter); + Ind : Node; Marker : Mark_Type; Inter_Typ : Type_Acc; Val : Valtyp; Res : Type_Acc; begin - if not Is_Fully_Constrained_Type (Get_Type (Inter)) then + if not Is_Fully_Constrained_Type (Inter_Type) then -- TODO -- Find the association for this interface -- * if individual assoc: get type @@ -436,6 +438,9 @@ package body Elab.Vhdl_Insts is Val := Synth_Expression_With_Type (Syn_Inst, Get_Actual (Assoc), Inter_Typ); Res := Val.Typ; + if Res /= null then + Res := Unshare (Res, Global_Pool'Access); + end if; else case Iir_Kinds_Association_Element_Parameters (Get_Kind (Assoc)) is when Iir_Kinds_Association_Element_By_Actual => @@ -447,11 +452,21 @@ package body Elab.Vhdl_Insts is Res := Exec_Name_Subtype (Syn_Inst, Get_Default_Value (Inter)); end case; - end if; - if Res /= null then - Res := Unshare (Res, Global_Pool'Access); + if Res /= null then + Res := Unshare (Res, Global_Pool'Access); + end if; + + Ind := Get_Subtype_Indication (Inter); + if Res /= null + and then Ind /= Null_Iir + and then Get_Kind (Ind) in Iir_Kinds_Subtype_Definition + and then not Get_Is_Ref (Inter) + then + Create_Subtype_Object (Sub_Inst, Inter_Type, Res); + end if; end if; + Release_Expr_Pool (Marker); return Res; else |