aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/atree.adb443
-rw-r--r--gcc/ada/exp_ch6.adb292
-rw-r--r--gcc/ada/exp_util.adb43
-rw-r--r--gcc/ada/exp_util.ads19
-rw-r--r--gcc/ada/nlists.adb18
-rw-r--r--gcc/ada/nlists.ads3
-rw-r--r--gcc/ada/par-ch4.adb2
-rw-r--r--gcc/ada/sem_ch7.adb28
-rw-r--r--gcc/ada/sinfo.adb132
-rw-r--r--gcc/ada/sinfo.ads158
10 files changed, 708 insertions, 430 deletions
diff --git a/gcc/ada/atree.adb b/gcc/ada/atree.adb
index 1e8b1cc..322528c4 100644
--- a/gcc/ada/atree.adb
+++ b/gcc/ada/atree.adb
@@ -364,9 +364,6 @@ package body Atree is
Flag228 : Boolean;
Flag229 : Boolean;
Flag230 : Boolean;
-
- -- Note: flags 231-247 not in use yet
-
Flag231 : Boolean;
Flag232 : Boolean;
@@ -647,6 +644,18 @@ package body Atree is
return Nodes.Table (N).Analyzed;
end Analyzed;
+ --------------------------
+ -- Basic_Set_Convention --
+ --------------------------
+
+ procedure Basic_Set_Convention (E : Entity_Id; Val : Convention_Id) is
+ begin
+ pragma Assert (Nkind (E) in N_Entity);
+ To_Flag_Word_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (E + 2).Field12'Unrestricted_Access)).Convention := Val;
+ end Basic_Set_Convention;
+
-----------------
-- Change_Node --
-----------------
@@ -868,91 +877,6 @@ package body Atree is
end if;
end Copy_Separate_Tree;
- -----------------
- -- Delete_Node --
- -----------------
-
- procedure Delete_Node (Node : Node_Id) is
- begin
- pragma Assert (not Nodes.Table (Node).In_List);
-
- if Debug_Flag_N then
- Write_Str ("Delete node ");
- Write_Int (Int (Node));
- Write_Eol;
- end if;
-
- Nodes.Table (Node) := Default_Node;
- Nodes.Table (Node).Nkind := N_Unused_At_Start;
- Node_Count := Node_Count - 1;
-
- -- Note: for now, we are not bothering to reuse deleted nodes
-
- end Delete_Node;
-
- -----------------
- -- Delete_Tree --
- -----------------
-
- procedure Delete_Tree (Node : Node_Id) is
-
- procedure Delete_Field (F : Union_Id);
- -- Delete item pointed to by field F if it is a syntactic element
-
- procedure Delete_List (L : List_Id);
- -- Delete all elements on the given list
-
- ------------------
- -- Delete_Field --
- ------------------
-
- procedure Delete_Field (F : Union_Id) is
- begin
- if F = Union_Id (Empty) then
- return;
-
- elsif F in Node_Range
- and then Parent (Node_Id (F)) = Node
- then
- Delete_Tree (Node_Id (F));
-
- elsif F in List_Range
- and then Parent (List_Id (F)) = Node
- then
- Delete_List (List_Id (F));
-
- -- No need to test Elist case, there are no syntactic Elists
-
- else
- return;
- end if;
- end Delete_Field;
-
- -----------------
- -- Delete_List --
- -----------------
-
- procedure Delete_List (L : List_Id) is
- begin
- while Is_Non_Empty_List (L) loop
- Delete_Tree (Remove_Head (L));
- end loop;
- end Delete_List;
-
- -- Start of processing for Delete_Tree
-
- begin
- -- Delete descendents
-
- Delete_Field (Field1 (Node));
- Delete_Field (Field2 (Node));
- Delete_Field (Field3 (Node));
- Delete_Field (Field4 (Node));
- Delete_Field (Field5 (Node));
-
- -- ??? According to spec, Node itself should be deleted as well
- end Delete_Tree;
-
-----------
-- Ekind --
-----------
@@ -2275,6 +2199,94 @@ package body Atree is
return Nodes.Table (N).Nkind;
end Nkind;
+ --------------
+ -- Nkind_In --
+ --------------
+
+ function Nkind_In
+ (N : Node_Id;
+ V1 : Node_Kind;
+ V2 : Node_Kind) return Boolean
+ is
+ begin
+ return Nkind_In (Nkind (N), V1, V2);
+ end Nkind_In;
+
+ function Nkind_In
+ (N : Node_Id;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind) return Boolean
+ is
+ begin
+ return Nkind_In (Nkind (N), V1, V2, V3);
+ end Nkind_In;
+
+ function Nkind_In
+ (N : Node_Id;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind) return Boolean
+ is
+ begin
+ return Nkind_In (Nkind (N), V1, V2, V3, V4);
+ end Nkind_In;
+
+ function Nkind_In
+ (N : Node_Id;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind) return Boolean
+ is
+ begin
+ return Nkind_In (Nkind (N), V1, V2, V3, V4, V5);
+ end Nkind_In;
+
+ function Nkind_In
+ (N : Node_Id;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind) return Boolean
+ is
+ begin
+ return Nkind_In (Nkind (N), V1, V2, V3, V4, V5, V6);
+ end Nkind_In;
+
+ function Nkind_In
+ (N : Node_Id;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind;
+ V7 : Node_Kind) return Boolean
+ is
+ begin
+ return Nkind_In (Nkind (N), V1, V2, V3, V4, V5, V6, V7);
+ end Nkind_In;
+
+ function Nkind_In
+ (N : Node_Id;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind;
+ V7 : Node_Kind;
+ V8 : Node_Kind) return Boolean
+ is
+ begin
+ return Nkind_In (Nkind (N), V1, V2, V3, V4, V5, V6, V7, V8);
+ end Nkind_In;
+
--------
-- No --
--------
@@ -2443,10 +2455,6 @@ package body Atree is
-- to Rewrite if there were an intention to save the original node.
Orig_Nodes.Table (Old_Node) := Old_Node;
-
- -- Finally delete the source, since it is now copied
-
- Delete_Node (New_Node);
end Replace;
-------------
@@ -2534,19 +2542,6 @@ package body Atree is
Default_Node.Comes_From_Source := Default;
end Set_Comes_From_Source_Default;
- --------------------
- -- Set_Convention --
- --------------------
-
- procedure Set_Convention (E : Entity_Id; Val : Convention_Id) is
- begin
- pragma Assert (Nkind (E) in N_Entity);
- To_Flag_Word_Ptr
- (Union_Id_Ptr'
- (Nodes.Table (E + 2).Field12'Unrestricted_Access)).Convention :=
- Val;
- end Set_Convention;
-
---------------
-- Set_Ekind --
---------------
@@ -4865,6 +4860,108 @@ package body Atree is
return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag230;
end Flag230;
+ function Flag231 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag231;
+ end Flag231;
+
+ function Flag232 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag232;
+ end Flag232;
+
+ function Flag233 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag233;
+ end Flag233;
+
+ function Flag234 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag234;
+ end Flag234;
+
+ function Flag235 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag235;
+ end Flag235;
+
+ function Flag236 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag236;
+ end Flag236;
+
+ function Flag237 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag237;
+ end Flag237;
+
+ function Flag238 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag238;
+ end Flag238;
+
+ function Flag239 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag239;
+ end Flag239;
+
+ function Flag240 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag240;
+ end Flag240;
+
+ function Flag241 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag241;
+ end Flag241;
+
+ function Flag242 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag242;
+ end Flag242;
+
+ function Flag243 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag243;
+ end Flag243;
+
+ function Flag244 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag244;
+ end Flag244;
+
+ function Flag245 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag245;
+ end Flag245;
+
+ function Flag246 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag246;
+ end Flag246;
+
+ function Flag247 (N : Node_Id) return Boolean is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ return To_Flag_Word5 (Nodes.Table (N + 4).Field12).Flag247;
+ end Flag247;
+
procedure Set_Nkind (N : Node_Id; Val : Node_Kind) is
begin
pragma Assert (N <= Nodes.Last);
@@ -7091,6 +7188,142 @@ package body Atree is
(Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag230 := Val;
end Set_Flag230;
+ procedure Set_Flag231 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag231 := Val;
+ end Set_Flag231;
+
+ procedure Set_Flag232 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag232 := Val;
+ end Set_Flag232;
+
+ procedure Set_Flag233 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag233 := Val;
+ end Set_Flag233;
+
+ procedure Set_Flag234 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag234 := Val;
+ end Set_Flag234;
+
+ procedure Set_Flag235 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag235 := Val;
+ end Set_Flag235;
+
+ procedure Set_Flag236 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag236 := Val;
+ end Set_Flag236;
+
+ procedure Set_Flag237 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag237 := Val;
+ end Set_Flag237;
+
+ procedure Set_Flag238 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag238 := Val;
+ end Set_Flag238;
+
+ procedure Set_Flag239 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag239 := Val;
+ end Set_Flag239;
+
+ procedure Set_Flag240 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag240 := Val;
+ end Set_Flag240;
+
+ procedure Set_Flag241 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag241 := Val;
+ end Set_Flag241;
+
+ procedure Set_Flag242 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag242 := Val;
+ end Set_Flag242;
+
+ procedure Set_Flag243 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag243 := Val;
+ end Set_Flag243;
+
+ procedure Set_Flag244 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag244 := Val;
+ end Set_Flag244;
+
+ procedure Set_Flag245 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag245 := Val;
+ end Set_Flag245;
+
+ procedure Set_Flag246 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag246 := Val;
+ end Set_Flag246;
+
+ procedure Set_Flag247 (N : Node_Id; Val : Boolean) is
+ begin
+ pragma Assert (Nkind (N) in N_Entity);
+ To_Flag_Word5_Ptr
+ (Union_Id_Ptr'
+ (Nodes.Table (N + 4).Field12'Unrestricted_Access)).Flag247 := Val;
+ end Set_Flag247;
+
procedure Set_Node1_With_Parent (N : Node_Id; Val : Node_Id) is
begin
pragma Assert (N <= Nodes.Last);
diff --git a/gcc/ada/exp_ch6.adb b/gcc/ada/exp_ch6.adb
index 451fa0b..e8f5c11 100644
--- a/gcc/ada/exp_ch6.adb
+++ b/gcc/ada/exp_ch6.adb
@@ -1391,8 +1391,8 @@ package body Exp_Ch6 is
begin
loop
Set_Analyzed (Pfx, False);
- exit when Nkind (Pfx) /= N_Selected_Component
- and then Nkind (Pfx) /= N_Indexed_Component;
+ exit when
+ not Nkind_In (Pfx, N_Selected_Component, N_Indexed_Component);
Pfx := Prefix (Pfx);
end loop;
end Reset_Packed_Prefix;
@@ -1633,8 +1633,8 @@ package body Exp_Ch6 is
P : constant Node_Id := Parent (N);
begin
- pragma Assert (Nkind (P) = N_Triggering_Alternative
- or else Nkind (P) = N_Entry_Call_Alternative);
+ pragma Assert (Nkind_In (P, N_Triggering_Alternative,
+ N_Entry_Call_Alternative));
if Is_Non_Empty_List (Statements (P)) then
Insert_List_Before_And_Analyze
@@ -2023,10 +2023,7 @@ package body Exp_Ch6 is
-- form, and rewritten before analysis.
if not Analyzed (Prev_Orig)
- and then
- (Nkind (Actual) = N_Function_Call
- or else
- Nkind (Actual) = N_Identifier)
+ and then Nkind_In (Actual, N_Function_Call, N_Identifier)
then
Prev_Orig := Prev;
end if;
@@ -2087,8 +2084,8 @@ package body Exp_Ch6 is
-- as out parameter actuals on calls to stream procedures.
Act_Prev := Prev;
- while Nkind (Act_Prev) = N_Type_Conversion
- or else Nkind (Act_Prev) = N_Unchecked_Type_Conversion
+ while Nkind_In (Act_Prev, N_Type_Conversion,
+ N_Unchecked_Type_Conversion)
loop
Act_Prev := Expression (Act_Prev);
end loop;
@@ -2318,9 +2315,7 @@ package body Exp_Ch6 is
then
null;
- elsif Nkind (Prev) = N_Allocator
- or else Nkind (Prev) = N_Attribute_Reference
- then
+ elsif Nkind_In (Prev, N_Allocator, N_Attribute_Reference) then
null;
-- Suppress null checks when passing to access parameters of Java
@@ -2361,9 +2356,8 @@ package body Exp_Ch6 is
begin
Nod := Actual;
- while Nkind (Nod) = N_Indexed_Component
- or else
- Nkind (Nod) = N_Selected_Component
+ while Nkind_In (Nod, N_Indexed_Component,
+ N_Selected_Component)
loop
Set_Analyzed (Nod, False);
Nod := Prefix (Nod);
@@ -2419,11 +2413,14 @@ package body Exp_Ch6 is
Sav : Node_Id;
begin
- -- For an OUT parameter that is an assignable entity, we do not
- -- want to clobber the Last_Assignment field, since if it is
- -- set, it was precisely because it is indeed an OUT parameter!
-
- if Ekind (Formal) = E_Out_Parameter
+ -- For an OUT or IN OUT parameter that is an assignable entity,
+ -- we do not want to clobber the Last_Assignment field, since
+ -- if it is set, it was precisely because it is indeed an OUT
+ -- or IN OUT parameter!
+
+ if (Ekind (Formal) = E_Out_Parameter
+ or else
+ Ekind (Formal) = E_In_Out_Parameter)
and then Is_Assignable (Ent)
then
Sav := Last_Assignment (Ent);
@@ -2534,8 +2531,7 @@ package body Exp_Ch6 is
-- Ada 2005 (AI-251): If some formal is a class-wide interface, expand
-- it to point to the correct secondary virtual table
- if (Nkind (N) = N_Function_Call
- or else Nkind (N) = N_Procedure_Call_Statement)
+ if Nkind_In (N, N_Function_Call, N_Procedure_Call_Statement)
and then CW_Interface_Formals_Present
then
Expand_Interface_Actuals (N);
@@ -2549,8 +2545,7 @@ package body Exp_Ch6 is
-- the VM back-ends directly handle the generation of dispatching
-- calls and would have to undo any expansion to an indirect call.
- if (Nkind (N) = N_Function_Call
- or else Nkind (N) = N_Procedure_Call_Statement)
+ if Nkind_In (N, N_Function_Call, N_Procedure_Call_Statement)
and then Present (Controlling_Argument (N))
and then VM_Target = No_VM
then
@@ -2899,7 +2894,7 @@ package body Exp_Ch6 is
if (In_Extended_Main_Code_Unit (N)
or else In_Extended_Main_Code_Unit (Parent (N))
- or else Is_Always_Inlined (Subp))
+ or else Has_Pragma_Inline_Always (Subp))
and then (not In_Same_Extended_Unit (Sloc (Bod), Loc)
or else
Earlier_In_Extended_Unit (Sloc (Bod), Loc))
@@ -3036,10 +3031,6 @@ package body Exp_Ch6 is
-- If no arguments, delete entire list, this is the easy case
if No (Last_Keep_Arg) then
- while Is_Non_Empty_List (Parameter_Associations (N)) loop
- Delete_Tree (Remove_Head (Parameter_Associations (N)));
- end loop;
-
Set_Parameter_Associations (N, No_List);
Set_First_Named_Actual (N, Empty);
@@ -3050,7 +3041,7 @@ package body Exp_Ch6 is
elsif Is_List_Member (Last_Keep_Arg) then
while Present (Next (Last_Keep_Arg)) loop
- Delete_Tree (Remove_Next (Last_Keep_Arg));
+ Discard_Node (Remove_Next (Last_Keep_Arg));
end loop;
Set_First_Named_Actual (N, Empty);
@@ -3114,7 +3105,6 @@ package body Exp_Ch6 is
exit when No (Temp);
Set_Next_Named_Actual
(Passoc, Next_Named_Actual (Parent (Temp)));
- Delete_Tree (Temp);
end loop;
end;
end if;
@@ -3359,9 +3349,7 @@ package body Exp_Ch6 is
-- use a qualified expression, because an aggregate is not a
-- legal argument of a conversion.
- if Nkind (Expression (N)) = N_Aggregate
- or else Nkind (Expression (N)) = N_Null
- then
+ if Nkind_In (Expression (N), N_Aggregate, N_Null) then
Ret :=
Make_Qualified_Expression (Sloc (N),
Subtype_Mark => New_Occurrence_Of (Ret_Type, Sloc (N)),
@@ -3724,10 +3712,10 @@ package body Exp_Ch6 is
and then Formal_Is_Used_Once (F))
or else
- ((Nkind (A) = N_Real_Literal or else
- Nkind (A) = N_Integer_Literal or else
- Nkind (A) = N_Character_Literal)
- and then not Address_Taken (F))
+ (Nkind_In (A, N_Real_Literal,
+ N_Integer_Literal,
+ N_Character_Literal)
+ and then not Address_Taken (F))
then
if Etype (F) /= Etype (A) then
Set_Renamed_Object
@@ -3944,190 +3932,8 @@ package body Exp_Ch6 is
----------------------------
procedure Expand_N_Function_Call (N : Node_Id) is
- Typ : constant Entity_Id := Etype (N);
-
- function Returned_By_Reference return Boolean;
- -- If the return type is returned through the secondary stack; that is
- -- by reference, we don't want to create a temp to force stack checking.
- -- ???"sec stack" is not right -- Ada 95 return-by-reference object are
- -- returned wherever they are.
- -- Shouldn't this function be moved to exp_util???
-
- function Rhs_Of_Assign_Or_Decl (N : Node_Id) return Boolean;
- -- If the call is the right side of an assignment or the expression in
- -- an object declaration, we don't need to create a temp as the left
- -- side will already trigger stack checking if necessary.
- --
- -- If the call is a component in an extension aggregate, it will be
- -- expanded into assignments as well, so no temporary is needed. This
- -- also solves the problem of functions returning types with unknown
- -- discriminants, where it is not possible to declare an object of the
- -- type altogether.
-
- ---------------------------
- -- Returned_By_Reference --
- ---------------------------
-
- function Returned_By_Reference return Boolean is
- S : Entity_Id;
-
- begin
- if Is_Inherently_Limited_Type (Typ) then
- return True;
-
- elsif Nkind (Parent (N)) /= N_Simple_Return_Statement then
- return False;
-
- elsif Requires_Transient_Scope (Typ) then
-
- -- Verify that the return type of the enclosing function has the
- -- same constrained status as that of the expression.
-
- S := Current_Scope;
- while Ekind (S) /= E_Function loop
- S := Scope (S);
- end loop;
-
- return Is_Constrained (Typ) = Is_Constrained (Etype (S));
- else
- return False;
- end if;
- end Returned_By_Reference;
-
- ---------------------------
- -- Rhs_Of_Assign_Or_Decl --
- ---------------------------
-
- function Rhs_Of_Assign_Or_Decl (N : Node_Id) return Boolean is
- begin
- if (Nkind (Parent (N)) = N_Assignment_Statement
- and then Expression (Parent (N)) = N)
- or else
- (Nkind (Parent (N)) = N_Qualified_Expression
- and then Nkind (Parent (Parent (N))) = N_Assignment_Statement
- and then Expression (Parent (Parent (N))) = Parent (N))
- or else
- (Nkind (Parent (N)) = N_Object_Declaration
- and then Expression (Parent (N)) = N)
- or else
- (Nkind (Parent (N)) = N_Component_Association
- and then Expression (Parent (N)) = N
- and then Nkind (Parent (Parent (N))) = N_Aggregate
- and then Rhs_Of_Assign_Or_Decl (Parent (Parent (N))))
- or else
- (Nkind (Parent (N)) = N_Extension_Aggregate
- and then Is_Private_Type (Etype (Typ)))
- then
- return True;
- else
- return False;
- end if;
- end Rhs_Of_Assign_Or_Decl;
-
- -- Start of processing for Expand_N_Function_Call
-
begin
- -- A special check. If stack checking is enabled, and the return type
- -- might generate a large temporary, and the call is not the right side
- -- of an assignment, then generate an explicit temporary. We do this
- -- because otherwise gigi may generate a large temporary on the fly and
- -- this can cause trouble with stack checking.
-
- -- This is unnecessary if the call is the expression in an object
- -- declaration, or if it appears outside of any library unit. This can
- -- only happen if it appears as an actual in a library-level instance,
- -- in which case a temporary will be generated for it once the instance
- -- itself is installed.
-
- if May_Generate_Large_Temp (Typ)
- and then not Rhs_Of_Assign_Or_Decl (N)
- and then not Returned_By_Reference
- and then Current_Scope /= Standard_Standard
- then
- if Stack_Checking_Enabled then
-
- -- Note: it might be thought that it would be OK to use a call to
- -- Force_Evaluation here, but that's not good enough, because
- -- that can results in a 'Reference construct that may still need
- -- a temporary.
-
- declare
- Loc : constant Source_Ptr := Sloc (N);
- Temp_Obj : constant Entity_Id :=
- Make_Defining_Identifier (Loc,
- Chars => New_Internal_Name ('F'));
- Temp_Typ : Entity_Id := Typ;
- Decl : Node_Id;
- A : Node_Id;
- F : Entity_Id;
- Proc : Entity_Id;
-
- begin
- if Is_Tagged_Type (Typ)
- and then Present (Controlling_Argument (N))
- then
- if Nkind (Parent (N)) /= N_Procedure_Call_Statement
- and then Nkind (Parent (N)) /= N_Function_Call
- then
- -- If this is a tag-indeterminate call, the object must
- -- be classwide.
-
- if Is_Tag_Indeterminate (N) then
- Temp_Typ := Class_Wide_Type (Typ);
- end if;
-
- else
- -- If this is a dispatching call that is itself the
- -- controlling argument of an enclosing call, the
- -- nominal subtype of the object that replaces it must
- -- be classwide, so that dispatching will take place
- -- properly. If it is not a controlling argument, the
- -- object is not classwide.
-
- Proc := Entity (Name (Parent (N)));
-
- F := First_Formal (Proc);
- A := First_Actual (Parent (N));
- while A /= N loop
- Next_Formal (F);
- Next_Actual (A);
- end loop;
-
- if Is_Controlling_Formal (F) then
- Temp_Typ := Class_Wide_Type (Typ);
- end if;
- end if;
- end if;
-
- Decl :=
- Make_Object_Declaration (Loc,
- Defining_Identifier => Temp_Obj,
- Object_Definition => New_Occurrence_Of (Temp_Typ, Loc),
- Constant_Present => True,
- Expression => Relocate_Node (N));
- Set_Assignment_OK (Decl);
-
- Insert_Actions (N, New_List (Decl));
- Rewrite (N, New_Occurrence_Of (Temp_Obj, Loc));
- end;
-
- else
- -- If stack-checking is not enabled, increment serial number
- -- for internal names, so that subsequent symbols are consistent
- -- with and without stack-checking.
-
- Synchronize_Serial_Number;
-
- -- Now we can expand the call with consistent symbol names
-
- Expand_Call (N);
- end if;
-
- -- Normal case, expand the call
-
- else
- Expand_Call (N);
- end if;
+ Expand_Call (N);
end Expand_N_Function_Call;
---------------------------------------
@@ -4881,8 +4687,8 @@ package body Exp_Ch6 is
-- Step past qualification or unchecked conversion (the latter can occur
-- in cases of calls to 'Input).
- if Nkind (Exp_Node) = N_Qualified_Expression
- or else Nkind (Exp_Node) = N_Unchecked_Type_Conversion
+ if Nkind_In
+ (Exp_Node, N_Qualified_Expression, N_Unchecked_Type_Conversion)
then
Exp_Node := Expression (N);
end if;
@@ -4908,8 +4714,8 @@ package body Exp_Ch6 is
function Is_Build_In_Place_Function_Return (N : Node_Id) return Boolean is
begin
- if Nkind (N) = N_Simple_Return_Statement
- or else Nkind (N) = N_Extended_Return_Statement
+ if Nkind_In (N, N_Simple_Return_Statement,
+ N_Extended_Return_Statement)
then
return Is_Build_In_Place_Function
(Return_Applies_To (Return_Statement_Entity (N)));
@@ -4962,10 +4768,11 @@ package body Exp_Ch6 is
while Present (Iface_DT_Ptr)
and then Ekind (Node (Iface_DT_Ptr)) = E_Constant
loop
+ pragma Assert (Has_Thunks (Node (Iface_DT_Ptr)));
Expand_Interface_Thunk (Prim, Thunk_Id, Thunk_Code);
if Present (Thunk_Code) then
- Insert_Actions (N, New_List (
+ Insert_Actions_After (N, New_List (
Thunk_Code,
Build_Set_Predefined_Prim_Op_Address (Loc,
@@ -4974,10 +4781,22 @@ package body Exp_Ch6 is
Address_Node =>
Make_Attribute_Reference (Loc,
Prefix => New_Reference_To (Thunk_Id, Loc),
+ Attribute_Name => Name_Address)),
+
+ Build_Set_Predefined_Prim_Op_Address (Loc,
+ Tag_Node => New_Reference_To
+ (Node (Next_Elmt (Iface_DT_Ptr)), Loc),
+ Position => DT_Position (Prim),
+ Address_Node =>
+ Make_Attribute_Reference (Loc,
+ Prefix => New_Reference_To (Prim, Loc),
Attribute_Name => Name_Address))));
end if;
Next_Elmt (Iface_DT_Ptr);
+ pragma Assert (not Has_Thunks (Node (Iface_DT_Ptr)));
+
+ Next_Elmt (Iface_DT_Ptr);
end loop;
end Register_Predefined_DT_Entry;
@@ -4985,6 +4804,8 @@ package body Exp_Ch6 is
Subp : constant Entity_Id := Entity (N);
+ -- Start of processing for Freeze_Subprogram
+
begin
-- We suppress the initialization of the dispatch table entry when
-- VM_Target because the dispatching mechanism is handled internally
@@ -5088,8 +4909,9 @@ package body Exp_Ch6 is
-- Step past qualification or unchecked conversion (the latter can occur
-- in cases of calls to 'Input).
- if Nkind (Func_Call) = N_Qualified_Expression
- or else Nkind (Func_Call) = N_Unchecked_Type_Conversion
+ if Nkind_In (Func_Call,
+ N_Qualified_Expression,
+ N_Unchecked_Type_Conversion)
then
Func_Call := Expression (Func_Call);
end if;
@@ -5241,8 +5063,8 @@ package body Exp_Ch6 is
-- Step past qualification or unchecked conversion (the latter can occur
-- in cases of calls to 'Input).
- if Nkind (Func_Call) = N_Qualified_Expression
- or else Nkind (Func_Call) = N_Unchecked_Type_Conversion
+ if Nkind_In (Func_Call, N_Qualified_Expression,
+ N_Unchecked_Type_Conversion)
then
Func_Call := Expression (Func_Call);
end if;
@@ -5369,8 +5191,8 @@ package body Exp_Ch6 is
-- Step past qualification or unchecked conversion (the latter can occur
-- in cases of calls to 'Input).
- if Nkind (Func_Call) = N_Qualified_Expression
- or else Nkind (Func_Call) = N_Unchecked_Type_Conversion
+ if Nkind_In (Func_Call, N_Qualified_Expression,
+ N_Unchecked_Type_Conversion)
then
Func_Call := Expression (Func_Call);
end if;
@@ -5491,8 +5313,8 @@ package body Exp_Ch6 is
-- Step past qualification or unchecked conversion (the latter can occur
-- in cases of calls to 'Input).
- if Nkind (Func_Call) = N_Qualified_Expression
- or else Nkind (Func_Call) = N_Unchecked_Type_Conversion
+ if Nkind_In (Func_Call, N_Qualified_Expression,
+ N_Unchecked_Type_Conversion)
then
Func_Call := Expression (Func_Call);
end if;
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index dc181aa..f3b9ee2 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -1327,7 +1327,7 @@ package body Exp_Util is
function Find_Interface_ADT
(T : Entity_Id;
- Iface : Entity_Id) return Entity_Id
+ Iface : Entity_Id) return Elmt_Id
is
ADT : Elmt_Id;
Found : Boolean := False;
@@ -1385,6 +1385,7 @@ package body Exp_Util is
end if;
Next_Elmt (ADT);
+ Next_Elmt (ADT);
Next_Elmt (AI_Elmt);
end loop;
end if;
@@ -1423,7 +1424,7 @@ package body Exp_Util is
pragma Assert (Present (Node (ADT)));
Find_Secondary_Table (Typ);
pragma Assert (Found);
- return Node (ADT);
+ return ADT;
end Find_Interface_ADT;
------------------------
@@ -2336,14 +2337,31 @@ package body Exp_Util is
when N_And_Then | N_Or_Else =>
if N = Right_Opnd (P) then
+
+ -- We are now going to either append the actions to the
+ -- actions field of the short-circuit operation. We will
+ -- also analyze the actions now.
+
+ -- This analysis is really too early, the proper thing would
+ -- be to just park them there now, and only analyze them if
+ -- we find we really need them, and to it at the proper
+ -- final insertion point. However attempting to this proved
+ -- tricky, so for now we just kill current values before and
+ -- after the analyze call to make sure we avoid peculiar
+ -- optimizations from this out of order insertion.
+
+ Kill_Current_Values;
+
if Present (Actions (P)) then
Insert_List_After_And_Analyze
- (Last (Actions (P)), Ins_Actions);
+ (Last (Actions (P)), Ins_Actions);
else
Set_Actions (P, Ins_Actions);
Analyze_List (Actions (P));
end if;
+ Kill_Current_Values;
+
return;
end if;
@@ -2985,11 +3003,12 @@ package body Exp_Util is
or else TSS_Name = TSS_Deep_Adjust
or else TSS_Name = TSS_Deep_Finalize
or else (Ada_Version >= Ada_05
- and then (Chars (E) = Name_uDisp_Asynchronous_Select
- or else Chars (E) = Name_uDisp_Conditional_Select
- or else Chars (E) = Name_uDisp_Get_Prim_Op_Kind
- or else Chars (E) = Name_uDisp_Get_Task_Id
- or else Chars (E) = Name_uDisp_Timed_Select))
+ and then (Chars (E) = Name_uDisp_Asynchronous_Select
+ or else Chars (E) = Name_uDisp_Conditional_Select
+ or else Chars (E) = Name_uDisp_Get_Prim_Op_Kind
+ or else Chars (E) = Name_uDisp_Get_Task_Id
+ or else Chars (E) = Name_uDisp_Requeue
+ or else Chars (E) = Name_uDisp_Timed_Select))
then
return True;
end if;
@@ -3459,8 +3478,6 @@ package body Exp_Util is
elsif Nkind (N) in N_Generic_Instantiation then
Remove_Dead_Instance (N);
end if;
-
- Delete_Tree (N);
end if;
end Kill_Dead_Code;
@@ -3472,11 +3489,11 @@ package body Exp_Util is
begin
W := Warn;
if Is_Non_Empty_List (L) then
- loop
- N := Remove_Head (L);
- exit when No (N);
+ N := First (L);
+ while Present (N) loop
Kill_Dead_Code (N, W);
W := False;
+ Next (N);
end loop;
end if;
end Kill_Dead_Code;
diff --git a/gcc/ada/exp_util.ads b/gcc/ada/exp_util.ads
index 5ca346d..42c8d2a 100644
--- a/gcc/ada/exp_util.ads
+++ b/gcc/ada/exp_util.ads
@@ -338,9 +338,10 @@ package Exp_Util is
function Find_Interface_ADT
(T : Entity_Id;
- Iface : Entity_Id) return Entity_Id;
+ Iface : Entity_Id) return Elmt_Id;
-- Ada 2005 (AI-251): Given a type T implementing the interface Iface,
- -- return the Access_Disp_Table value of the interface.
+ -- return the element of Access_Disp_Table containing the tag of the
+ -- interface.
function Find_Interface_Tag
(T : Entity_Id;
@@ -483,16 +484,16 @@ package Exp_Util is
-- or is a private type whose completion is such a type.
procedure Kill_Dead_Code (N : Node_Id; Warn : Boolean := False);
- -- N represents a node for a section of code that is known to be dead. The
- -- node is deleted, and any exception handler references and warning
- -- messages relating to this code are removed. If Warn is True, a warning
- -- will be output at the start of N indicating the deletion of the code.
+ -- N represents a node for a section of code that is known to be dead. Any
+ -- exception handler references and warning messages relating to this code
+ -- are removed. If Warn is True, a warning will be output at the start of N
+ -- indicating the deletion of the code. Note that the tree for the deleted
+ -- code is left intact so that e.g. cross-reference data is still valid.
procedure Kill_Dead_Code (L : List_Id; Warn : Boolean := False);
-- Like the above procedure, but applies to every element in the given
- -- list. Each of the entries is removed from the list before killing it.
- -- If Warn is True, a warning will be output at the start of N indicating
- -- the deletion of the code.
+ -- list. If Warn is True, a warning will be output at the start of N
+ -- indicating the deletion of the code.
function Known_Non_Negative (Opnd : Node_Id) return Boolean;
-- Given a node for a subexpression, determines if it represents a value
diff --git a/gcc/ada/nlists.adb b/gcc/ada/nlists.adb
index 0745f38..b75226e 100644
--- a/gcc/ada/nlists.adb
+++ b/gcc/ada/nlists.adb
@@ -279,22 +279,6 @@ package body Nlists is
Append (Node, To);
end Append_To;
- -----------------
- -- Delete_List --
- -----------------
-
- procedure Delete_List (L : List_Id) is
- N : Node_Id;
-
- begin
- while Is_Non_Empty_List (L) loop
- N := Remove_Head (L);
- Delete_Tree (N);
- end loop;
-
- -- Should recycle list header???
- end Delete_List;
-
-----------
-- First --
-----------
@@ -315,7 +299,6 @@ package body Nlists is
function First_Non_Pragma (List : List_Id) return Node_Id is
N : constant Node_Id := First (List);
-
begin
if Nkind (N) /= N_Pragma
and then
@@ -649,7 +632,6 @@ package body Nlists is
function Last_Non_Pragma (List : List_Id) return Node_Id is
N : constant Node_Id := Last (List);
-
begin
if Nkind (N) /= N_Pragma then
return N;
diff --git a/gcc/ada/nlists.ads b/gcc/ada/nlists.ads
index fe9c941..77ae55a 100644
--- a/gcc/ada/nlists.ads
+++ b/gcc/ada/nlists.ads
@@ -333,9 +333,6 @@ package Nlists is
-- These functions return the addresses of the Next_Node and Prev_Node
-- tables (used in Back_End for Gigi).
- procedure Delete_List (L : List_Id);
- -- Removes all elements of the given list, and calls Delete_Tree on each
-
function p (U : Union_Id) return Node_Id;
-- This function is intended for use from the debugger, it determines
-- whether U is a Node_Id or List_Id, and calls the appropriate Parent
diff --git a/gcc/ada/par-ch4.adb b/gcc/ada/par-ch4.adb
index ee63c42..0db6d20 100644
--- a/gcc/ada/par-ch4.adb
+++ b/gcc/ada/par-ch4.adb
@@ -463,8 +463,6 @@ package body Ch4 is
Style.Check_Attribute_Name (False);
end if;
- Delete_Node (Token_Node);
-
-- Here for case of attribute designator is not an identifier
else
diff --git a/gcc/ada/sem_ch7.adb b/gcc/ada/sem_ch7.adb
index e7076b3..11f24ce 100644
--- a/gcc/ada/sem_ch7.adb
+++ b/gcc/ada/sem_ch7.adb
@@ -592,9 +592,9 @@ package body Sem_Ch7 is
-- the flag for outer level entities that are not
-- imported/exported, and which have no interface name.
- elsif K = N_Object_Declaration
- or else K = N_Exception_Declaration
- or else K = N_Subprogram_Declaration
+ elsif Nkind_In (K, N_Object_Declaration,
+ N_Exception_Declaration,
+ N_Subprogram_Declaration)
then
E := Defining_Entity (D);
@@ -844,8 +844,8 @@ package body Sem_Ch7 is
then
Generate_Reference (Id, Scope (Id), 'k', False);
- elsif Nkind (Unit (Cunit (Main_Unit))) /= N_Subprogram_Body
- and then Nkind (Unit (Cunit (Main_Unit))) /= N_Subunit
+ elsif not Nkind_In (Unit (Cunit (Main_Unit)), N_Subprogram_Body,
+ N_Subunit)
then
-- If current unit is an ancestor of main unit, generate
-- a reference to its own parent.
@@ -909,16 +909,16 @@ package body Sem_Ch7 is
-- with a known_discriminant_part whose full view is an
-- Unchecked_Union.
- if (Nkind (Decl) = N_Incomplete_Type_Declaration
- or else
- Nkind (Decl) = N_Private_Type_Declaration)
+ if Nkind_In (Decl, N_Incomplete_Type_Declaration,
+ N_Private_Type_Declaration)
and then Has_Discriminants (Defining_Identifier (Decl))
and then Present (Full_View (Defining_Identifier (Decl)))
- and then Is_Unchecked_Union
- (Full_View (Defining_Identifier (Decl)))
+ and then
+ Is_Unchecked_Union (Full_View (Defining_Identifier (Decl)))
then
- Error_Msg_N ("completion of discriminated partial view" &
- " cannot be an Unchecked_Union",
+ Error_Msg_N
+ ("completion of discriminated partial view "
+ & "cannot be an Unchecked_Union",
Full_View (Defining_Identifier (Decl)));
end if;
@@ -942,8 +942,8 @@ package body Sem_Ch7 is
while Present (Gen_Par) and then Is_Child_Unit (Gen_Par) loop
Inst_Node := Get_Package_Instantiation_Node (Inst_Par);
- if (Nkind (Inst_Node) = N_Package_Instantiation
- or else Nkind (Inst_Node) = N_Formal_Package_Declaration)
+ if Nkind_In (Inst_Node, N_Package_Instantiation,
+ N_Formal_Package_Declaration)
and then Nkind (Name (Inst_Node)) = N_Expanded_Name
then
Inst_Par := Entity (Prefix (Name (Inst_Node)));
diff --git a/gcc/ada/sinfo.adb b/gcc/ada/sinfo.adb
index b7bf39e..2baa94b 100644
--- a/gcc/ada/sinfo.adb
+++ b/gcc/ada/sinfo.adb
@@ -2192,6 +2192,14 @@ package body Sinfo is
return List2 (N);
end Pragma_Argument_Associations;
+ function Pragma_Identifier
+ (N : Node_Id) return Node_Id is
+ begin
+ pragma Assert (False
+ or else NT (N).Nkind = N_Pragma);
+ return Node4 (N);
+ end Pragma_Identifier;
+
function Pragmas_After
(N : Node_Id) return List_Id is
begin
@@ -4915,6 +4923,14 @@ package body Sinfo is
Set_List2_With_Parent (N, Val);
end Set_Pragma_Argument_Associations;
+ procedure Set_Pragma_Identifier
+ (N : Node_Id; Val : Node_Id) is
+ begin
+ pragma Assert (False
+ or else NT (N).Nkind = N_Pragma);
+ Set_Node4_With_Parent (N, Val);
+ end Set_Pragma_Identifier;
+
procedure Set_Pragmas_After
(N : Node_Id; Val : List_Id) is
begin
@@ -5558,4 +5574,120 @@ package body Sinfo is
UI_From_Int (Int (S) - Int (Sloc (N))));
end Set_End_Location;
+ --------------------------------
+ -- Node_Kind Membership Tests --
+ --------------------------------
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind) return Boolean
+ is
+ begin
+ return T = V1 or else
+ T = V2;
+ end Nkind_In;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind) return Boolean
+ is
+ begin
+ return T = V1 or else
+ T = V2 or else
+ T = V3;
+ end Nkind_In;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind) return Boolean
+ is
+ begin
+ return T = V1 or else
+ T = V2 or else
+ T = V3 or else
+ T = V4;
+ end Nkind_In;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind) return Boolean
+ is
+ begin
+ return T = V1 or else
+ T = V2 or else
+ T = V3 or else
+ T = V4 or else
+ T = V5;
+ end Nkind_In;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind) return Boolean
+ is
+ begin
+ return T = V1 or else
+ T = V2 or else
+ T = V3 or else
+ T = V4 or else
+ T = V5 or else
+ T = V6;
+ end Nkind_In;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind;
+ V7 : Node_Kind) return Boolean
+ is
+ begin
+ return T = V1 or else
+ T = V2 or else
+ T = V3 or else
+ T = V4 or else
+ T = V5 or else
+ T = V6 or else
+ T = V7;
+ end Nkind_In;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind;
+ V7 : Node_Kind;
+ V8 : Node_Kind) return Boolean
+ is
+ begin
+ return T = V1 or else
+ T = V2 or else
+ T = V3 or else
+ T = V4 or else
+ T = V5 or else
+ T = V6 or else
+ T = V7 or else
+ T = V8;
+ end Nkind_In;
+
end Sinfo;
diff --git a/gcc/ada/sinfo.ads b/gcc/ada/sinfo.ads
index 61a1400..d1f2017 100644
--- a/gcc/ada/sinfo.ads
+++ b/gcc/ada/sinfo.ads
@@ -549,9 +549,11 @@ package Sinfo is
-- Acts_As_Spec (Flag4-Sem)
-- A flag set in the N_Subprogram_Body node for a subprogram body which
- -- is acting as its own spec. This flag also appears in the compilation
- -- unit node at the library level for such a subprogram (see further
- -- description in spec of Lib package).
+ -- is acting as its own spec, except in the case of a library level
+ -- subprogram, in which case the flag is set on the parent compilation
+ -- unit node instead (see further description in spec of Lib package).
+ -- ??? Above note about Lib is dubious since lib.ads does not mention
+ -- Acts_As_Spec at all.
-- Actual_Designated_Subtype (Node4-Sem)
-- Present in N_Free_Statement and N_Explicit_Dereference nodes. If gigi
@@ -907,27 +909,36 @@ package Sinfo is
-- processing of the variant part of a record type.
-- Entity (Node4-Sem)
- -- Appears in all direct names (identifier, character literal, operator
- -- symbol), as well as expanded names, and attributes that denote
- -- entities, such as 'Class. Points to the entity for the corresponding
- -- defining occurrence. Set after name resolution. In the case of
- -- identifiers in a WITH list, the corresponding defining occurrence is
- -- in a separately compiled file, and this pointer must be set using the
- -- library Load procedure. Note that during name resolution, the value in
- -- Entity may be temporarily incorrect (e.g. during overload resolution,
- -- Entity is initially set to the first possible correct interpretation,
- -- and then later modified if necessary to contain the correct value
- -- after resolution). Note that this field overlaps Associated_Node,
- -- which is used during generic processing (see Sem_Ch12 for details).
- -- Note also that in generic templates, this means that the Entity field
- -- does not always point to an Entity. Since the back end is expected to
- -- ignore generic templates, this is harmless. Note that this field also
- -- appears in N_Attribute_Definition_Clause nodes. It is used only for
- -- stream attributes definition clauses. In this case, it denotes a
- -- (possibly dummy) subprogram entity that is conceptually declared at
- -- the point of the clause. Thus the visibility of the attribute
- -- definition clause (in the sense of 8.3(23) as amended by AI-195) can
- -- be checked by testing the visibility of that subprogram.
+ -- Appears in all direct names (identifiers, character literals, and
+ -- operator symbols), as well as expanded names, and attributes that
+ -- denote entities, such as 'Class. Points to entity for corresponding
+ -- defining occurrence. Set after name resolution. For identifiers in a
+ -- WITH list, the corresponding defining occurrence is in a separately
+ -- compiled file, and Entity must be set by the library Load procedure.
+ --
+ -- Note: During name resolution, the value in Entity may be temporarily
+ -- incorrect (e.g. during overload resolution, Entity is initially set to
+ -- the first possible correct interpretation, and then later modified if
+ -- necessary to contain the correct value after resolution).
+ --
+ -- Note: This field overlaps Associated_Node, which is used during
+ -- generic processing (see Sem_Ch12 for details). Note also that in
+ -- generic templates, this means that the Entity field does not always
+ -- point to an Entity. Since the back end is expected to ignore generic
+ -- templates, this is harmless.
+ --
+ -- Note: This field also appears in N_Attribute_Definition_Clause nodes.
+ -- It is used only for stream attributes definition clauses. In this
+ -- case, it denotes a (possibly dummy) subprogram entity that is declared
+ -- conceptually at the point of the clause. Thus the visibility of the
+ -- attribute definition clause (in the sense of 8.3(23) as amended by
+ -- AI-195) can be checked by testing the visibility of that subprogram.
+ --
+ -- Note: Normally the Entity field of an identifier points to the entity
+ -- for the corresponding defining identifier, and hence the Chars field
+ -- of an identifier will match the Chars field of the entity. However,
+ -- there is no requirement that these match, and there are obscure cases
+ -- of generated code where they do not match.
-- Entity_Or_Associated_Node (Node4-Sem)
-- A synonym for both Entity and Associated_Node. Used by convention in
@@ -1070,7 +1081,7 @@ package Sinfo is
-- in the non-generic package case if it determines that no elaboration
-- code is generated. Note that this flag is not related to the
-- Is_Preelaborated status, there can be preelaborated packages that
- -- generate elaboration code, and non- preelaborated packages which do
+ -- generate elaboration code, and non-preelaborated packages which do
-- not generate elaboration code.
-- Has_Priority_Pragma (Flag6-Sem)
@@ -1864,10 +1875,11 @@ package Sinfo is
-- which are explicitly documented.
-- N_Pragma
- -- Sloc points to PRAGMA
+ -- Sloc points to pragma identifier
-- Chars (Name1) identifier name from pragma identifier
-- Pragma_Argument_Associations (List2) (set to No_List if none)
-- Debug_Statement (Node3) (set to Empty if not Debug, Assert)
+ -- Pragma_Identifier (Node4)
-- Next_Rep_Item (Node5-Sem)
-- Note: we should have a section on what pragmas are passed on to
@@ -1875,6 +1887,13 @@ package Sinfo is
-- Psect_Object is always converted to Common_Object, but there are
-- undoubtedly many other similar notes required ???
+ -- Note: we don't really need the Chars field, since it can trivially
+ -- be obtained as Chars (Pragma_Identifier (Node)). However, it is
+ -- convenient to have this directly available, and historically the
+ -- Chars field has been around for ever, whereas the Pragma_Identifier
+ -- field was added much later (when we found the need to be able to get
+ -- the Sloc of the pragma identifier).
+
--------------------------------------
-- 2.8 Pragma Argument Association --
--------------------------------------
@@ -3232,9 +3251,9 @@ package Sinfo is
-- component_SELECTOR_NAME {| component_SELECTOR_NAME}
-- | others
- -- The entries of a component choice list appear in the Choices list
- -- of the associated N_Component_Association, as either selector
- -- names, or as an N_Others_Choice node.
+ -- The entries of a component choice list appear in the Choices list of
+ -- the associated N_Component_Association, as either selector names, or
+ -- as an N_Others_Choice node.
--------------------------------
-- 4.3.2 Extension Aggregate --
@@ -7385,7 +7404,7 @@ package Sinfo is
subtype N_Unit_Body is Node_Kind range
N_Package_Body ..
- N_Subprogram_Body;
+ N_Subprogram_Body;
---------------------------
-- Node Access Functions --
@@ -8071,6 +8090,9 @@ package Sinfo is
function Pragma_Argument_Associations
(N : Node_Id) return List_Id; -- List2
+ function Pragma_Identifier
+ (N : Node_Id) return Node_Id; -- Node4
+
function Pragmas_After
(N : Node_Id) return List_Id; -- List5
@@ -8935,6 +8957,9 @@ package Sinfo is
procedure Set_Pragma_Argument_Associations
(N : Node_Id; Val : List_Id); -- List2
+ procedure Set_Pragma_Identifier
+ (N : Node_Id; Val : Node_Id); -- Node4
+
procedure Set_Pragmas_After
(N : Node_Id; Val : List_Id); -- List5
@@ -9144,6 +9169,75 @@ package Sinfo is
-- other words, End_Span is set to the difference between S and
-- Sloc (N), the starting location.
+ --------------------------------
+ -- Node_Kind Membership Tests --
+ --------------------------------
+
+ -- The following functions allow a convenient notation for testing wheter
+ -- a Node_Kind value matches any one of a list of possible values. In each
+ -- case True is returned if the given T argument is equal to any of the V
+ -- arguments. Note that there is a similar set of functions defined in
+ -- Atree where the first argument is a Node_Id whose Nkind field is tested.
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind) return Boolean;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind) return Boolean;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind) return Boolean;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind) return Boolean;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind) return Boolean;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind;
+ V7 : Node_Kind) return Boolean;
+
+ function Nkind_In
+ (T : Node_Kind;
+ V1 : Node_Kind;
+ V2 : Node_Kind;
+ V3 : Node_Kind;
+ V4 : Node_Kind;
+ V5 : Node_Kind;
+ V6 : Node_Kind;
+ V7 : Node_Kind;
+ V8 : Node_Kind) return Boolean;
+
+ pragma Inline (Nkind_In);
+ -- Inline all above functions
+
-----------------------------
-- Syntactic Parent Tables --
-----------------------------
@@ -9198,7 +9292,7 @@ package Sinfo is
(1 => True, -- Chars (Name1)
2 => True, -- Pragma_Argument_Associations (List2)
3 => True, -- Debug_Statement (Node3)
- 4 => False, -- Entity (Node4-Sem)
+ 4 => True, -- Pragma_Identifier (Node4)
5 => False), -- Next_Rep_Item (Node5-Sem)
N_Pragma_Argument_Association =>
@@ -10912,6 +11006,7 @@ package Sinfo is
pragma Inline (Parent_Spec);
pragma Inline (Position);
pragma Inline (Pragma_Argument_Associations);
+ pragma Inline (Pragma_Identifier);
pragma Inline (Pragmas_After);
pragma Inline (Pragmas_Before);
pragma Inline (Prefix);
@@ -11196,6 +11291,7 @@ package Sinfo is
pragma Inline (Set_Parent_Spec);
pragma Inline (Set_Position);
pragma Inline (Set_Pragma_Argument_Associations);
+ pragma Inline (Set_Pragma_Identifier);
pragma Inline (Set_Pragmas_After);
pragma Inline (Set_Pragmas_Before);
pragma Inline (Set_Prefix);