aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/vhdl/disp_vhdl.adb8
-rw-r--r--src/vhdl/iirs.adb8
-rw-r--r--src/vhdl/iirs.ads4
-rw-r--r--src/vhdl/nodes_meta.adb10
-rw-r--r--src/vhdl/parse.adb4
-rw-r--r--src/vhdl/sem_decls.adb33
6 files changed, 31 insertions, 36 deletions
diff --git a/src/vhdl/disp_vhdl.adb b/src/vhdl/disp_vhdl.adb
index f6bde461f..4cc22f0f8 100644
--- a/src/vhdl/disp_vhdl.adb
+++ b/src/vhdl/disp_vhdl.adb
@@ -1258,7 +1258,7 @@ package body Disp_Vhdl is
procedure Disp_Signature (Sig : Iir)
is
Prefix : constant Iir := Get_Signature_Prefix (Sig);
- List : Iir_List;
+ List : constant Iir_Flist := Get_Type_Marks_List (Sig);
El : Iir;
begin
if Is_Valid (Prefix) then
@@ -1266,11 +1266,9 @@ package body Disp_Vhdl is
Disp_Name (Prefix);
end if;
Put (" [");
- List := Get_Type_Marks_List (Sig);
- if List /= Null_Iir_List then
- for I in Natural loop
+ if List /= Null_Iir_Flist then
+ for I in Flist_First .. Flist_Last (List) loop
El := Get_Nth_Element (List, I);
- exit when El = Null_Iir;
if I /= 0 then
Put (", ");
end if;
diff --git a/src/vhdl/iirs.adb b/src/vhdl/iirs.adb
index 286055d2a..e2d217f6b 100644
--- a/src/vhdl/iirs.adb
+++ b/src/vhdl/iirs.adb
@@ -5220,20 +5220,20 @@ package body Iirs is
Set_Flag5 (Target, Val);
end Set_Is_Within_Flag;
- function Get_Type_Marks_List (Target : Iir) return Iir_List is
+ function Get_Type_Marks_List (Target : Iir) return Iir_Flist is
begin
pragma Assert (Target /= Null_Iir);
pragma Assert (Has_Type_Marks_List (Get_Kind (Target)),
"no field Type_Marks_List");
- return Iir_To_Iir_List (Get_Field2 (Target));
+ return Iir_To_Iir_Flist (Get_Field2 (Target));
end Get_Type_Marks_List;
- procedure Set_Type_Marks_List (Target : Iir; List : Iir_List) is
+ procedure Set_Type_Marks_List (Target : Iir; List : Iir_Flist) is
begin
pragma Assert (Target /= Null_Iir);
pragma Assert (Has_Type_Marks_List (Get_Kind (Target)),
"no field Type_Marks_List");
- Set_Field2 (Target, Iir_List_To_Iir (List));
+ Set_Field2 (Target, Iir_Flist_To_Iir (List));
end Set_Type_Marks_List;
function Get_Implicit_Alias_Flag (Decl : Iir) return Boolean is
diff --git a/src/vhdl/iirs.ads b/src/vhdl/iirs.ads
index 119f0b3fc..f6defecc3 100644
--- a/src/vhdl/iirs.ads
+++ b/src/vhdl/iirs.ads
@@ -7245,8 +7245,8 @@ package Iirs is
-- List of type_mark for an Iir_Kind_Signature
-- Field: Field2 (uc)
- function Get_Type_Marks_List (Target : Iir) return Iir_List;
- procedure Set_Type_Marks_List (Target : Iir; List : Iir_List);
+ function Get_Type_Marks_List (Target : Iir) return Iir_Flist;
+ procedure Set_Type_Marks_List (Target : Iir; List : Iir_Flist);
-- Field: Flag1
function Get_Implicit_Alias_Flag (Decl : Iir) return Boolean;
diff --git a/src/vhdl/nodes_meta.adb b/src/vhdl/nodes_meta.adb
index aa1261220..cadc86c2a 100644
--- a/src/vhdl/nodes_meta.adb
+++ b/src/vhdl/nodes_meta.adb
@@ -306,7 +306,7 @@ package body Nodes_Meta is
Field_Has_Disconnect_Flag => Type_Boolean,
Field_Has_Active_Flag => Type_Boolean,
Field_Is_Within_Flag => Type_Boolean,
- Field_Type_Marks_List => Type_Iir_List,
+ Field_Type_Marks_List => Type_Iir_Flist,
Field_Implicit_Alias_Flag => Type_Boolean,
Field_Alias_Signature => Type_Iir,
Field_Attribute_Signature => Type_Iir,
@@ -5919,6 +5919,8 @@ package body Nodes_Meta is
return Get_Index_Constraint_List (N);
when Field_Index_List =>
return Get_Index_List (N);
+ when Field_Type_Marks_List =>
+ return Get_Type_Marks_List (N);
when others =>
raise Internal_Error;
end case;
@@ -5939,6 +5941,8 @@ package body Nodes_Meta is
Set_Index_Constraint_List (N, V);
when Field_Index_List =>
Set_Index_List (N, V);
+ when Field_Type_Marks_List =>
+ Set_Type_Marks_List (N, V);
when others =>
raise Internal_Error;
end case;
@@ -6089,8 +6093,6 @@ package body Nodes_Meta is
return Get_Guard_Sensitivity_List (N);
when Field_Instantiation_List =>
return Get_Instantiation_List (N);
- when Field_Type_Marks_List =>
- return Get_Type_Marks_List (N);
when Field_Overload_List =>
return Get_Overload_List (N);
when Field_PSL_Clock_Sensitivity =>
@@ -6129,8 +6131,6 @@ package body Nodes_Meta is
Set_Guard_Sensitivity_List (N, V);
when Field_Instantiation_List =>
Set_Instantiation_List (N, V);
- when Field_Type_Marks_List =>
- Set_Type_Marks_List (N, V);
when Field_Overload_List =>
Set_Overload_List (N, V);
when Field_PSL_Clock_Sensitivity =>
diff --git a/src/vhdl/parse.adb b/src/vhdl/parse.adb
index 1daed149f..e2c3a51f7 100644
--- a/src/vhdl/parse.adb
+++ b/src/vhdl/parse.adb
@@ -3498,12 +3498,14 @@ package body Parse is
-- List of type_marks.
if Current_Token = Tok_Identifier then
List := Create_Iir_List;
- Set_Type_Marks_List (Res, List);
loop
Append_Element (List, Parse_Type_Mark (Check_Paren => True));
exit when Current_Token /= Tok_Comma;
+
+ -- Skip ','.
Scan;
end loop;
+ Set_Type_Marks_List (Res, List_To_Flist (List));
end if;
if Current_Token = Tok_Return then
diff --git a/src/vhdl/sem_decls.adb b/src/vhdl/sem_decls.adb
index ca1351720..5fdf71c9a 100644
--- a/src/vhdl/sem_decls.adb
+++ b/src/vhdl/sem_decls.adb
@@ -2248,11 +2248,10 @@ package body Sem_Decls is
function Signature_Match (N_Entity : Iir; Sig : Iir_Signature)
return Boolean
is
- List : Iir_List;
+ List : constant Iir_Flist := Get_Type_Marks_List (Sig);
Inter : Iir;
El : Iir;
begin
- List := Get_Type_Marks_List (Sig);
case Get_Kind (N_Entity) is
when Iir_Kind_Enumeration_Literal =>
-- LRM93 2.3.2 Signatures
@@ -2264,9 +2263,9 @@ package body Sem_Decls is
if Get_Return_Type_Mark (Sig) = Null_Iir then
return False;
end if;
- return List = Null_Iir_List
- and then Get_Type (N_Entity)
- = Get_Type (Get_Return_Type_Mark (Sig));
+ return List = Null_Iir_Flist
+ and then (Get_Type (N_Entity)
+ = Get_Type (Get_Return_Type_Mark (Sig)));
when Iir_Kind_Function_Declaration
| Iir_Kind_Interface_Function_Declaration =>
-- LRM93 2.3.2 Signatures
@@ -2305,15 +2304,13 @@ package body Sem_Decls is
-- mark of the signature is the same as the base type of the
-- corresponding formal parameter of the subprogram; [and finally, ]
Inter := Get_Interface_Declaration_Chain (N_Entity);
- if List = Null_Iir_List then
+ if List = Null_Iir_Flist then
return Inter = Null_Iir;
end if;
- for I in Natural loop
+ for I in Flist_First .. Flist_Last (List) loop
El := Get_Nth_Element (List, I);
- if El = Null_Iir and Inter = Null_Iir then
- return True;
- end if;
- if El = Null_Iir or Inter = Null_Iir then
+ if Inter = Null_Iir then
+ -- More type marks in the signature than in the interface.
return False;
end if;
if Get_Base_Type (Get_Type (Inter)) /= Get_Type (El) then
@@ -2321,26 +2318,24 @@ package body Sem_Decls is
end if;
Inter := Get_Chain (Inter);
end loop;
- -- Avoid a spurious warning.
- return False;
+ -- Match only if the number of type marks is the same.
+ return Inter = Null_Iir;
end Signature_Match;
-- Extract from NAME the named entity whose profile matches with SIG.
function Sem_Signature (Name : Iir; Sig : Iir_Signature) return Iir
is
+ List : constant Iir_Flist := Get_Type_Marks_List (Sig);
Res : Iir;
El : Iir;
- List : Iir_List;
Error : Boolean;
begin
-- Sem signature.
- List := Get_Type_Marks_List (Sig);
- if List /= Null_Iir_List then
- for I in Natural loop
+ if List /= Null_Iir_Flist then
+ for I in Flist_First .. Flist_Last (List) loop
El := Get_Nth_Element (List, I);
- exit when El = Null_Iir;
El := Sem_Type_Mark (El);
- Replace_Nth_Element (List, I, El);
+ Set_Nth_Element (List, I, El);
-- Reuse the Type field of the name for the base type. This is
-- a deviation from the use of Type in a name, but restricted to