diff options
author | Tristan Gingold <tgingold@free.fr> | 2019-08-06 09:35:35 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2019-08-06 09:35:35 +0200 |
commit | 6facf7626446acce5693b257fe7643d7b565118d (patch) | |
tree | 75a4017bd33fe50350f7e62ac6d52165c0d811a4 | |
parent | c6aa6e154c8f34107526aac0a373efe1e7b76ef8 (diff) | |
download | ghdl-6facf7626446acce5693b257fe7643d7b565118d.tar.gz ghdl-6facf7626446acce5693b257fe7643d7b565118d.tar.bz2 ghdl-6facf7626446acce5693b257fe7643d7b565118d.zip |
vhdl: allow discrete subtype indication for discrete_range.
For #877
-rw-r--r-- | src/vhdl/vhdl-parse.adb | 3 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_expr.adb | 11 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_expr.ads | 4 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_names.adb | 76 | ||||
-rw-r--r-- | src/vhdl/vhdl-sem_types.adb | 4 |
5 files changed, 53 insertions, 45 deletions
diff --git a/src/vhdl/vhdl-parse.adb b/src/vhdl/vhdl-parse.adb index e5ff0292a..e182821ae 100644 --- a/src/vhdl/vhdl-parse.adb +++ b/src/vhdl/vhdl-parse.adb @@ -7650,6 +7650,9 @@ package body Vhdl.Parse is Error_Msg_Parse ("multi-dimensional slice is forbidden"); end if; + when Tok_Range => + Actual := Parse_Subtype_Indication (Actual); + when Tok_Double_Arrow => -- Check that FORMAL is a name and not an expression. Formal := Check_Formal_Form (Actual); diff --git a/src/vhdl/vhdl-sem_expr.adb b/src/vhdl/vhdl-sem_expr.adb index ef9b18c9b..4225d0802 100644 --- a/src/vhdl/vhdl-sem_expr.adb +++ b/src/vhdl/vhdl-sem_expr.adb @@ -748,9 +748,8 @@ package body Vhdl.Sem_Expr is return Res; end Sem_Range_Expression; - function Sem_Discrete_Range_Expression - (Expr: Iir; A_Type: Iir; Any_Dir : Boolean) - return Iir + function Sem_Discrete_Range (Expr: Iir; A_Type: Iir; Any_Dir : Boolean) + return Iir is Res : Iir; Res_Type : Iir; @@ -798,14 +797,14 @@ package body Vhdl.Sem_Expr is end if; return Res; - end Sem_Discrete_Range_Expression; + end Sem_Discrete_Range; function Sem_Discrete_Range_Integer (Expr: Iir) return Iir is Res : Iir; Range_Type : Iir; begin - Res := Sem_Discrete_Range_Expression (Expr, Null_Iir, True); + Res := Sem_Discrete_Range (Expr, Null_Iir, True); if Res = Null_Iir then return Null_Iir; end if; @@ -2779,7 +2778,7 @@ package body Vhdl.Sem_Expr is begin if Get_Kind (El) = Iir_Kind_Choice_By_Range then Expr := Get_Choice_Range (El); - Expr := Sem_Discrete_Range_Expression (Expr, Choice_Type, True); + Expr := Sem_Discrete_Range (Expr, Choice_Type, True); if Expr = Null_Iir then return False; end if; diff --git a/src/vhdl/vhdl-sem_expr.ads b/src/vhdl/vhdl-sem_expr.ads index 9e6531530..62fb6036a 100644 --- a/src/vhdl/vhdl-sem_expr.ads +++ b/src/vhdl/vhdl-sem_expr.ads @@ -116,8 +116,8 @@ package Vhdl.Sem_Expr is -- Analyze a discrete range. If ANY_DIR is true, the range can't be a -- null range (slice vs subtype -- used in static evaluation). A_TYPE may -- be Null_Iir. Return Null_Iir in case of error. - function Sem_Discrete_Range_Expression - (Expr: Iir; A_Type: Iir; Any_Dir: Boolean) return Iir; + function Sem_Discrete_Range (Expr: Iir; A_Type: Iir; Any_Dir: Boolean) + return Iir; -- Analyze a discrete range and convert to integer if both bounds are -- universal integer types, according to rules of LRM 3.2.1.1 diff --git a/src/vhdl/vhdl-sem_names.adb b/src/vhdl/vhdl-sem_names.adb index d6ff02da4..6cbea6f83 100644 --- a/src/vhdl/vhdl-sem_names.adb +++ b/src/vhdl/vhdl-sem_names.adb @@ -710,19 +710,20 @@ package body Vhdl.Sem_Names is Expr_Type : Iir; Staticness : Iir_Staticness; Prefix_Rng : Iir; + Suffix_Rng : Iir; begin Set_Base_Name (Name, Get_Base_Name (Prefix)); - -- LRM93 §6.5: the prefix of an indexed name must be appropriate + -- LRM93 6.5: the prefix of an indexed name must be appropriate -- for an array type. if Get_Kind (Prefix_Bt) /= Iir_Kind_Array_Type_Definition then Error_Msg_Sem (+Name, "slice can only be applied to an array"); return; end if; - -- LRM93 §6.5: - -- The prefix of a slice must be appropriate for a - -- one-dimensionnal array object. + -- LRM93 6.5: + -- The prefix of a slice must be appropriate for a + -- one-dimensionnal array object. Index_List := Get_Index_Subtype_List (Prefix_Type); if Get_Nbr_Elements (Index_List) /= 1 then Error_Msg_Sem @@ -741,28 +742,46 @@ package body Vhdl.Sem_Names is -- LRM93 6.5 -- The slice is a null slice if the discrete range is a null range. - -- LRM93 §6.5: - -- The bounds of the discrete range [...] must be of the - -- type of the index of the array. - Suffix := Sem_Discrete_Range_Expression - (Get_Suffix (Name), Index_Type, False); + -- LRM93 6.5: + -- The bounds of the discrete range [...] must be of the + -- type of the index of the array. + Suffix := Get_Suffix (Name); + Suffix := Sem_Discrete_Range (Suffix, Index_Type, False); if Suffix = Null_Iir then return; end if; - Suffix := Eval_Range_If_Static (Suffix); + case Get_Kind (Suffix) is + when Iir_Kind_Simple_Name + | Iir_Kind_Selected_Name => + -- FIXME: what about the name ? + Suffix := Get_Type (Suffix); + Staticness := Get_Type_Staticness (Suffix); + Suffix_Rng := Get_Range_Constraint (Suffix); + when Iir_Kinds_Scalar_Subtype_Definition => + Staticness := Get_Type_Staticness (Suffix); + Suffix_Rng := Get_Range_Constraint (Suffix); + when Iir_Kind_Range_Expression + | Iir_Kind_Range_Array_Attribute + | Iir_Kind_Reverse_Range_Array_Attribute => + Suffix := Eval_Range_If_Static (Suffix); + Suffix_Rng := Suffix; + Staticness := Get_Expr_Staticness (Suffix); + when others => + Error_Kind ("finish_sem_slice_name", Suffix); + end case; Set_Suffix (Name, Suffix); - -- LRM93 §6.5: - -- It is an error if the direction of the discrete range is not - -- the same as that of the index range of the array denoted - -- by the prefix of the slice name. + -- LRM93 6.5: + -- It is an error if the direction of the discrete range is not + -- the same as that of the index range of the array denoted + -- by the prefix of the slice name. - -- Check this only if the type is a constrained type. + -- Check this only if the type is a constrained type. if Get_Kind (Prefix_Type) = Iir_Kind_Array_Subtype_Definition and then Get_Index_Constraint_Flag (Prefix_Type) - and then Get_Expr_Staticness (Suffix) = Locally + and then Staticness = Locally and then Prefix_Rng /= Null_Iir - and then Get_Direction (Suffix) /= Get_Direction (Prefix_Rng) + and then Get_Direction (Suffix_Rng) /= Get_Direction (Prefix_Rng) then if False and then Flags.Vhdl_Std = Vhdl_87 then -- emit a warning for a null slice. @@ -773,20 +792,8 @@ package body Vhdl.Sem_Names is Error_Msg_Sem (+Name, "direction of the range mismatch"); end if; - -- LRM93 §7.4.1 + -- LRM93 7.4.1 -- A slice is never a locally static expression. - case Get_Kind (Suffix) is - when Iir_Kind_Simple_Name - | Iir_Kind_Selected_Name => - Suffix := Get_Type (Suffix); - Staticness := Get_Type_Staticness (Suffix); - when Iir_Kind_Range_Expression - | Iir_Kind_Range_Array_Attribute - | Iir_Kind_Reverse_Range_Array_Attribute => - Staticness := Get_Expr_Staticness (Suffix); - when others => - Error_Kind ("finish_sem_slice_name", Suffix); - end case; Set_Expr_Staticness (Name, Min (Min (Staticness, Get_Expr_Staticness (Prefix)), Globally)); Set_Name_Staticness @@ -2395,7 +2402,7 @@ package body Vhdl.Sem_Names is Set_Index_List (Res, Create_Iir_Flist (1)); Set_Nth_Element (Get_Index_List (Res), 0, Actual); when Iir_Kind_Slice_Name => - Actual := Sem_Discrete_Range_Expression (Actual, Itype, False); + Actual := Sem_Discrete_Range (Actual, Itype, False); if Actual = Null_Iir then return Null_Iir; end if; @@ -2652,12 +2659,11 @@ package body Vhdl.Sem_Names is end if; -- Decides between sliced or indexed name to actual. Slice_Index_Kind := Slice_Or_Index (Actual_Expr); - elsif Get_Kind (Actual) = Iir_Kind_Range_Expression then + elsif Get_Kind (Actual) = Iir_Kind_Range_Expression + or else Get_Kind (Actual) = Iir_Kind_Subtype_Definition + then -- This can only be a slice. Slice_Index_Kind := Iir_Kind_Slice_Name; - -- Actual_Expr := - -- Sem_Discrete_Range_Expression (Actual, Null_Iir, False); - -- Set_Actual (Assoc_Chain, Actual_Expr); else -- Any other expression: an indexed name. Slice_Index_Kind := Iir_Kind_Indexed_Name; diff --git a/src/vhdl/vhdl-sem_types.adb b/src/vhdl/vhdl-sem_types.adb index 8b09af241..3b5df21a4 100644 --- a/src/vhdl/vhdl-sem_types.adb +++ b/src/vhdl/vhdl-sem_types.adb @@ -1208,7 +1208,7 @@ package body Vhdl.Sem_Types is declare Res : Iir; begin - Res := Sem_Discrete_Range_Expression (Def, Null_Iir, True); + Res := Sem_Discrete_Range (Def, Null_Iir, True); if Res = Null_Iir then return Null_Iir; end if; @@ -1596,7 +1596,7 @@ package body Vhdl.Sem_Types is if I <= Subtype_Nbr_Dim then Subtype_Index := Get_Nth_Element (Subtype_Index_List, I - 1); - Subtype_Index := Sem_Discrete_Range_Expression + Subtype_Index := Sem_Discrete_Range (Subtype_Index, Get_Index_Type (Type_Index), True); if Subtype_Index /= Null_Iir then Subtype_Index := |