[Ada] Refactor pragma argument getters

Message ID 20200727080552.GA36423@adacore.com
State New
Headers show
Series
  • [Ada] Refactor pragma argument getters
Related show

Commit Message

Pierre-Marie de Rodat July 27, 2020, 8:05 a.m.
This refactoring replaces exp_prag.adb's Arg1, Arg2 and Arg3 functions
with a new function Arg_N which enables fetching any pragma arguments.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* exp_prag.adb (Arg1, Arg2, Arg3): Removed.
	(Arg_N): New function.

Patch

diff --git a/gcc/ada/exp_prag.adb b/gcc/ada/exp_prag.adb
--- a/gcc/ada/exp_prag.adb
+++ b/gcc/ada/exp_prag.adb
@@ -61,9 +61,7 @@  package body Exp_Prag is
    -- Local Subprograms --
    -----------------------
 
-   function Arg1 (N : Node_Id) return Node_Id;
-   function Arg2 (N : Node_Id) return Node_Id;
-   function Arg3 (N : Node_Id) return Node_Id;
+   function Arg_N (N : Node_Id; Arg_Number : Positive) return Node_Id;
    --  Obtain specified pragma argument expression
 
    procedure Expand_Pragma_Abort_Defer             (N : Node_Id);
@@ -84,13 +82,24 @@  package body Exp_Prag is
    --  these cases we want no initialization to occur, but we have already done
    --  the initialization by the time we see the pragma, so we have to undo it.
 
-   ----------
-   -- Arg1 --
-   ----------
+   -----------
+   -- Arg_N --
+   -----------
 
-   function Arg1 (N : Node_Id) return Node_Id is
-      Arg : constant Node_Id := First (Pragma_Argument_Associations (N));
+   function Arg_N (N : Node_Id; Arg_Number : Positive) return Node_Id is
+      Arg : Node_Id := First (Pragma_Argument_Associations (N));
    begin
+      if No (Arg) then
+         return Empty;
+      end if;
+
+      for J in 2 .. Arg_Number loop
+         Next (Arg);
+         if No (Arg) then
+            return Empty;
+         end if;
+      end loop;
+
       if Present (Arg)
         and then Nkind (Arg) = N_Pragma_Argument_Association
       then
@@ -98,66 +107,7 @@  package body Exp_Prag is
       else
          return Arg;
       end if;
-   end Arg1;
-
-   ----------
-   -- Arg2 --
-   ----------
-
-   function Arg2 (N : Node_Id) return Node_Id is
-      Arg1 : constant Node_Id := First (Pragma_Argument_Associations (N));
-
-   begin
-      if No (Arg1) then
-         return Empty;
-
-      else
-         declare
-            Arg : constant Node_Id := Next (Arg1);
-         begin
-            if Present (Arg)
-              and then Nkind (Arg) = N_Pragma_Argument_Association
-            then
-               return Expression (Arg);
-            else
-               return Arg;
-            end if;
-         end;
-      end if;
-   end Arg2;
-
-   ----------
-   -- Arg3 --
-   ----------
-
-   function Arg3 (N : Node_Id) return Node_Id is
-      Arg1 : constant Node_Id := First (Pragma_Argument_Associations (N));
-
-   begin
-      if No (Arg1) then
-         return Empty;
-
-      else
-         declare
-            Arg : Node_Id := Next (Arg1);
-         begin
-            if No (Arg) then
-               return Empty;
-
-            else
-               Next (Arg);
-
-               if Present (Arg)
-                 and then Nkind (Arg) = N_Pragma_Argument_Association
-               then
-                  return Expression (Arg);
-               else
-                  return Arg;
-               end if;
-            end if;
-         end;
-      end if;
-   end Arg3;
+   end Arg_N;
 
    ---------------------
    -- Expand_N_Pragma --
@@ -317,8 +267,8 @@  package body Exp_Prag is
    --------------------------
 
    procedure Expand_Pragma_Check (N : Node_Id) is
-      Cond : constant Node_Id := Arg2 (N);
-      Nam  : constant Name_Id := Chars (Arg1 (N));
+      Cond : constant Node_Id := Arg_N (N, 2);
+      Nam  : constant Name_Id := Chars (Arg_N (N, 1));
       Msg  : Node_Id;
 
       Loc : constant Source_Ptr := Sloc (First_Node (Cond));
@@ -477,7 +427,7 @@  package body Exp_Prag is
       if ((Debug_Flag_Dot_G
             or else Restriction_Active (No_Exception_Propagation))
            and then Present (Find_Local_Handler (RTE (RE_Assert_Failure), N)))
-        or else (Opt.Exception_Locations_Suppressed and then No (Arg3 (N)))
+        or else (Opt.Exception_Locations_Suppressed and then No (Arg_N (N, 3)))
       then
          Rewrite (N,
            Make_If_Statement (Loc,
@@ -491,8 +441,8 @@  package body Exp_Prag is
       else
          --  If we have a message given, use it
 
-         if Present (Arg3 (N)) then
-            Msg := Get_Pragma_Arg (Arg3 (N));
+         if Present (Arg_N (N, 3)) then
+            Msg := Get_Pragma_Arg (Arg_N (N, 3));
 
          --  Here we have no string, so prepare one
 
@@ -615,8 +565,8 @@  package body Exp_Prag is
    procedure Expand_Pragma_Common_Object (N : Node_Id) is
       Loc : constant Source_Ptr := Sloc (N);
 
-      Internal : constant Node_Id := Arg1 (N);
-      External : constant Node_Id := Arg2 (N);
+      Internal : constant Node_Id := Arg_N (N, 1);
+      External : constant Node_Id := Arg_N (N, 2);
 
       Psect : Node_Id;
       --  Psect value upper cased as string literal
@@ -1380,11 +1330,11 @@  package body Exp_Prag is
       if Relaxed_RM_Semantics
         and then List_Length (Pragma_Argument_Associations (N)) = 2
         and then Pragma_Name (N) = Name_Import
-        and then Nkind (Arg2 (N)) = N_String_Literal
+        and then Nkind (Arg_N (N, 2)) = N_String_Literal
       then
-         Def_Id := Entity (Arg1 (N));
+         Def_Id := Entity (Arg_N (N, 1));
       else
-         Def_Id := Entity (Arg2 (N));
+         Def_Id := Entity (Arg_N (N, 2));
       end if;
 
       --  Variable case (we have to undo any initialization already done)
@@ -1401,7 +1351,7 @@  package body Exp_Prag is
 
          declare
             Loc          : constant Source_Ptr := Sloc (N);
-            Rtti_Name    : constant Node_Id    := Arg3 (N);
+            Rtti_Name    : constant Node_Id    := Arg_N (N, 3);
             Dum          : constant Entity_Id  := Make_Temporary (Loc, 'D');
             Exdata       : List_Id;
             Lang_Char    : Node_Id;
@@ -2219,7 +2169,9 @@  package body Exp_Prag is
                           (Make_Function_Call
                              (Loc, New_Occurrence_Of (RTE (RE_Clock), Loc)))),
                     Right_Opnd  =>
-                      Unchecked_Convert_To (Standard_Duration, Arg1 (N)))))));
+                      Unchecked_Convert_To (
+                        Standard_Duration,
+                        Arg_N (N, 1)))))));
 
          Analyze (N);
       end if;
@@ -2230,7 +2182,7 @@  package body Exp_Prag is
    -------------------------------------------
 
    procedure Expand_Pragma_Suppress_Initialization (N : Node_Id) is
-      Def_Id : constant Entity_Id  := Entity (Arg1 (N));
+      Def_Id : constant Entity_Id  := Entity (Arg_N (N, 1));
 
    begin
       --  Variable case (we have to undo any initialization already done)