diff options
author | Tristan Gingold <tgingold@free.fr> | 2021-08-06 03:02:37 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2021-08-06 03:02:37 +0200 |
commit | 75b92a00db2dce6478b68c31ddb08e10c784ee60 (patch) | |
tree | a40c0568813ce40278b779d9899c920d48da5dd9 | |
parent | 2d74a05dd686dce11c0f4584e2524ec76ed7ecf6 (diff) | |
download | ghdl-75b92a00db2dce6478b68c31ddb08e10c784ee60.tar.gz ghdl-75b92a00db2dce6478b68c31ddb08e10c784ee60.tar.bz2 ghdl-75b92a00db2dce6478b68c31ddb08e10c784ee60.zip |
vhdl-sem_expr.adb: check matching subtype of array aggregate elements.
When the subtype of the aggregate is not known by the context.
Fix #1723
-rw-r--r-- | src/vhdl/vhdl-sem_expr.adb | 98 |
1 files changed, 67 insertions, 31 deletions
diff --git a/src/vhdl/vhdl-sem_expr.adb b/src/vhdl/vhdl-sem_expr.adb index 091bf0a0b..59a167500 100644 --- a/src/vhdl/vhdl-sem_expr.adb +++ b/src/vhdl/vhdl-sem_expr.adb @@ -3590,13 +3590,63 @@ package body Vhdl.Sem_Expr is end loop; end Sem_Array_Aggregate_Extract_Element_Subtype; - -- Move ownership of array aggregate element subtype from the element to - -- the aggregate. - procedure Sem_Array_Aggregate_Move_Element_Subtype_Owner (Aggr_Type : Iir; - El_Subtype : Iir; - Aggr : Iir; - Dim : Natural; - Nbr_Dim : Natural) + procedure Check_Matching_Subtype (Expr : Iir; St : Iir) + is + Et : constant Iir := Get_Type (Expr); + begin + case Get_Kind (St) is + when Iir_Kind_Array_Subtype_Definition => + if Get_Kind (Et) /= Iir_Kind_Array_Subtype_Definition then + return; + end if; + -- Fast check. + if Et = St then + return; + end if; + + -- Check indexes. + if Get_Index_Constraint_Flag (St) + and then Get_Index_Constraint_Flag (Et) + then + declare + Eil : constant Iir_Flist := Get_Index_Subtype_List (Et); + Sil : constant Iir_Flist := Get_Index_Subtype_List (St); + Ei, Si : Iir; + begin + for I in Flist_First .. Flist_Last (Eil) loop + Ei := Get_Nth_Element (Eil, I); + Si := Get_Nth_Element (Sil, I); + if Get_Type_Staticness (Ei) = Locally + and then Get_Type_Staticness (Si) = Locally + and then (Eval_Discrete_Type_Length (Si) + /= Eval_Discrete_Type_Length (Ei)) + then + Warning_Msg_Sem + (Warnid_Runtime_Error, +Expr, + "expression subtype doesn't match " + & "aggregate element subtype"); + return; + end if; + end loop; + end; + end if; + + -- TODO: element array element ? + when Iir_Kind_Record_Subtype_Definition => + -- TODO + null; + when others => + null; + end case; + end Check_Matching_Subtype; + + -- Check the subtype of all elements of AGGR match EL_SUBTYPE. + -- Used only if the aggregate element subtype is extracted from an + -- element of the aggregate. In that case, we should check the match. + procedure Sem_Array_Aggregate_Check_Element_Subtype (El_Subtype : Iir; + Aggr : Iir; + Dim : Natural; + Nbr_Dim : Natural) is Assoc : Iir; Sub_Aggr : Iir; @@ -3609,30 +3659,16 @@ package body Vhdl.Sem_Expr is -- If a string is a proper subaggregate, then the element -- subtype must be fully bounded. pragma Assert (Get_Kind (Sub_Aggr) = Iir_Kind_Aggregate); - Sem_Array_Aggregate_Move_Element_Subtype_Owner - (Aggr_Type, El_Subtype, Sub_Aggr, Dim + 1, Nbr_Dim); - if Get_Array_Element_Constraint (Aggr_Type) /= Null_Iir then - -- Done. - return; - end if; + Sem_Array_Aggregate_Check_Element_Subtype + (El_Subtype, Sub_Aggr, Dim + 1, Nbr_Dim); else - case Get_Kind (Sub_Aggr) is - when Iir_Kind_Aggregate - | Iir_Kind_String_Literal8 => - if Get_Literal_Subtype (Sub_Aggr) = El_Subtype then - -- Transfer ownership. - Set_Array_Element_Constraint (Aggr_Type, El_Subtype); - Set_Literal_Subtype (Sub_Aggr, Null_Iir); - return; - end if; - when others => - null; - end case; + -- TODO: only report the first error ? + Check_Matching_Subtype (Sub_Aggr, El_Subtype); end if; end if; Assoc := Get_Chain (Assoc); end loop; - end Sem_Array_Aggregate_Move_Element_Subtype_Owner; + end Sem_Array_Aggregate_Check_Element_Subtype; -- Analyze an array aggregate AGGR of *base type* A_TYPE. -- The type of the array is computed into A_SUBTYPE. @@ -4091,11 +4127,9 @@ package body Vhdl.Sem_Expr is else A_Subtype := Create_Array_Subtype (Base_Type, Get_Location (Aggr)); Set_Element_Subtype (A_Subtype, El_Subtype); - if False and then El_Subtype /= El_Type then - -- If the element subtype is defined by an element of the - -- aggregate, move the ownership to the aggregate type. - Sem_Array_Aggregate_Move_Element_Subtype_Owner - (A_Subtype, El_Subtype, Aggr, 1, Nbr_Dim); + if El_Subtype /= El_Type then + Sem_Array_Aggregate_Check_Element_Subtype + (El_Subtype, Aggr, 1, Nbr_Dim); end if; Type_Staticness := Min (Type_Staticness, Get_Type_Staticness (El_Subtype)); @@ -4162,6 +4196,8 @@ package body Vhdl.Sem_Expr is then A_Subtype := Create_Array_Subtype (Base_Type, Get_Location (Aggr)); Set_Element_Subtype (A_Subtype, El_Subtype); + Sem_Array_Aggregate_Check_Element_Subtype + (El_Subtype, Aggr, 1, Nbr_Dim); Type_Staticness := Get_Type_Staticness (El_Subtype); if Get_Index_Constraint_Flag (Aggr_Type) then declare |