snames.ads-tmpl (Renamed): New name for the pragma argument.
authorBob Duff <duff@adacore.com>
Fri, 6 Jan 2017 11:56:16 +0000 (11:56 +0000)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 6 Jan 2017 11:56:16 +0000 (12:56 +0100)
2017-01-06  Bob Duff  <duff@adacore.com>

* snames.ads-tmpl (Renamed): New name for the pragma argument.
* par-ch2.adb: Allow the new pragma (with analysis deferred
to Sem_Prag).
* sinfo.ads, sinfo.adb (Map_Pragma_Name, Pragma_Name_Mapped):
Keep a mapping from new pragma names to old names.
* sem_prag.adb: Check legality of pragma Rename_Pragma, and
implement it by calling Map_Pragma_Name.
* checks.adb, contracts.adb, einfo.adb, errout.adb,
* exp_attr.adb, exp_ch3.adb, exp_ch6.adb, exp_ch7.adb, exp_ch9.adb,
* exp_prag.adb, exp_util.adb, freeze.adb, frontend.adb, ghost.adb,
* inline.adb, lib-writ.adb, scans.adb, scans.ads, sem_attr.adb,
* sem_aux.adb, sem_ch10.adb, sem_ch13.adb, sem_ch6.adb, sem_ch9.adb,
* sem_elab.adb, sem_res.adb, sem_util.adb, sem_util.ads,
* sem_warn.adb: Call Pragma_Name_Mapped instead of Pragma_Name
as appropriate.

From-SVN: r244144

35 files changed:
gcc/ada/ChangeLog
gcc/ada/checks.adb
gcc/ada/contracts.adb
gcc/ada/einfo.adb
gcc/ada/errout.adb
gcc/ada/exp_attr.adb
gcc/ada/exp_ch3.adb
gcc/ada/exp_ch6.adb
gcc/ada/exp_ch7.adb
gcc/ada/exp_ch9.adb
gcc/ada/exp_prag.adb
gcc/ada/exp_util.adb
gcc/ada/freeze.adb
gcc/ada/frontend.adb
gcc/ada/ghost.adb
gcc/ada/inline.adb
gcc/ada/lib-writ.adb
gcc/ada/par-ch2.adb
gcc/ada/scans.adb
gcc/ada/scans.ads
gcc/ada/sem_attr.adb
gcc/ada/sem_aux.adb
gcc/ada/sem_ch10.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_ch9.adb
gcc/ada/sem_elab.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_res.adb
gcc/ada/sem_util.adb
gcc/ada/sem_util.ads
gcc/ada/sem_warn.adb
gcc/ada/sinfo.adb
gcc/ada/sinfo.ads
gcc/ada/snames.ads-tmpl

index bd64c76aefd92030a6d6f12d1cc1cf05f852b48f..4232d36ee2ef14b90fb444c2c5e4dfad033e8706 100644 (file)
@@ -1,3 +1,21 @@
+2017-01-06  Bob Duff  <duff@adacore.com>
+
+       * snames.ads-tmpl (Renamed): New name for the pragma argument.
+       * par-ch2.adb: Allow the new pragma (with analysis deferred
+       to Sem_Prag).
+       * sinfo.ads, sinfo.adb (Map_Pragma_Name, Pragma_Name_Mapped):
+       Keep a mapping from new pragma names to old names.
+       * sem_prag.adb: Check legality of pragma Rename_Pragma, and
+       implement it by calling Map_Pragma_Name.
+       * checks.adb, contracts.adb, einfo.adb, errout.adb,
+       * exp_attr.adb, exp_ch3.adb, exp_ch6.adb, exp_ch7.adb, exp_ch9.adb,
+       * exp_prag.adb, exp_util.adb, freeze.adb, frontend.adb, ghost.adb,
+       * inline.adb, lib-writ.adb, scans.adb, scans.ads, sem_attr.adb,
+       * sem_aux.adb, sem_ch10.adb, sem_ch13.adb, sem_ch6.adb, sem_ch9.adb,
+       * sem_elab.adb, sem_res.adb, sem_util.adb, sem_util.ads,
+       * sem_warn.adb: Call Pragma_Name_Mapped instead of Pragma_Name
+       as appropriate.
+
 2017-01-06  Hristian Kirtchev  <kirtchev@adacore.com>
 
        * exp_ch9.adb: Minor reformatting.
index 61e1ad4fed977be58d1c22f8832b832c07baf30b..f9cb0ba95532056b7c78289b42a7a84c0aaf7aec 100644 (file)
@@ -2412,8 +2412,7 @@ package body Checks is
          begin
             Prag :=
               Make_Pragma (Loc,
-                Pragma_Identifier            =>
-                  Make_Identifier (Loc, Prag_Nam),
+                Chars => Prag_Nam,
                 Pragma_Argument_Associations => New_List (
                   Make_Pragma_Argument_Association (Loc,
                     Chars      => Name_Check,
index cd74cfcd8f10edf62c4fcb83311293fbd9fe0f20..7ed7e41b7ced9c1c3a6d234768a58a0474d53acb 100644 (file)
@@ -115,16 +115,14 @@ package body Contracts is
 
       --  Local variables
 
-      Prag_Nam : Name_Id;
-
-   --  Start of processing for Add_Contract_Item
-
-   begin
       --  A contract must contain only pragmas
 
       pragma Assert (Nkind (Prag) = N_Pragma);
-      Prag_Nam := Pragma_Name (Prag);
+      Prag_Nam : constant Name_Id := Pragma_Name_Mapped (Prag);
+
+   --  Start of processing for Add_Contract_Item
 
+   begin
       --  Create a new contract when adding the first item
 
       if No (Items) then
@@ -577,7 +575,7 @@ package body Contracts is
 
          Prag := Contract_Test_Cases (Items);
          while Present (Prag) loop
-            Prag_Nam := Pragma_Name (Prag);
+            Prag_Nam := Pragma_Name_Mapped (Prag);
 
             if Prag_Nam = Name_Contract_Cases then
 
@@ -606,7 +604,7 @@ package body Contracts is
 
          Prag := Classifications (Items);
          while Present (Prag) loop
-            Prag_Nam := Pragma_Name (Prag);
+            Prag_Nam := Pragma_Name_Mapped (Prag);
 
             if Prag_Nam = Name_Depends then
                Depends := Prag;
@@ -1021,7 +1019,7 @@ package body Contracts is
 
          Prag := Classifications (Items);
          while Present (Prag) loop
-            Prag_Nam := Pragma_Name (Prag);
+            Prag_Nam := Pragma_Name_Mapped (Prag);
 
             if Prag_Nam = Name_Initial_Condition then
                Init_Cond := Prag;
@@ -1787,7 +1785,7 @@ package body Contracts is
             if Present (Items) then
                Prag := Contract_Test_Cases (Items);
                while Present (Prag) loop
-                  if Pragma_Name (Prag) = Name_Contract_Cases then
+                  if Pragma_Name_Mapped (Prag) = Name_Contract_Cases then
                      Expand_Pragma_Contract_Cases
                        (CCs     => Prag,
                         Subp_Id => Subp_Id,
@@ -1840,7 +1838,7 @@ package body Contracts is
             if Present (Items) then
                Prag := Pre_Post_Conditions (Items);
                while Present (Prag) loop
-                  if Pragma_Name (Prag) = Post_Nam then
+                  if Pragma_Name_Mapped (Prag) = Post_Nam then
                      Append_Enabled_Item
                        (Item => Build_Pragma_Check_Equivalent (Prag),
                         List => Stmts);
@@ -1862,7 +1860,7 @@ package body Contracts is
                   --  Note that non-matching pragmas are skipped
 
                   if Nkind (Decl) = N_Pragma then
-                     if Pragma_Name (Decl) = Post_Nam then
+                     if Pragma_Name_Mapped (Decl) = Post_Nam then
                         Append_Enabled_Item
                           (Item => Build_Pragma_Check_Equivalent (Decl),
                            List => Stmts);
@@ -1904,7 +1902,7 @@ package body Contracts is
             if Present (Items) then
                Prag := Pre_Post_Conditions (Items);
                while Present (Prag) loop
-                  if Pragma_Name (Prag) = Name_Postcondition then
+                  if Pragma_Name_Mapped (Prag) = Name_Postcondition then
                      Append_Enabled_Item
                        (Item => Build_Pragma_Check_Equivalent (Prag),
                         List => Stmts);
@@ -1924,7 +1922,7 @@ package body Contracts is
                if Present (Items) then
                   Prag := Pre_Post_Conditions (Items);
                   while Present (Prag) loop
-                     if Pragma_Name (Prag) = Name_Postcondition
+                     if Pragma_Name_Mapped (Prag) = Name_Postcondition
                        and then Class_Present (Prag)
                      then
                         Append_Enabled_Item
@@ -2191,7 +2189,7 @@ package body Contracts is
                if Present (Items) then
                   Prag := Pre_Post_Conditions (Items);
                   while Present (Prag) loop
-                     if Pragma_Name (Prag) = Name_Precondition
+                     if Pragma_Name_Mapped (Prag) = Name_Precondition
                        and then Class_Present (Prag)
                      then
                         Check_Prag :=
@@ -2240,7 +2238,7 @@ package body Contracts is
             if Present (Items) then
                Prag := Pre_Post_Conditions (Items);
                while Present (Prag) loop
-                  if Pragma_Name (Prag) = Name_Precondition then
+                  if Pragma_Name_Mapped (Prag) = Name_Precondition then
                      Prepend_To_Decls_Or_Save (Prag);
                   end if;
 
@@ -2265,7 +2263,7 @@ package body Contracts is
                   --  Note that non-matching pragmas are skipped
 
                   if Nkind (Decl) = N_Pragma then
-                     if Pragma_Name (Decl) = Name_Precondition then
+                     if Pragma_Name_Mapped (Decl) = Name_Precondition then
                         Prepend_To_Decls_Or_Save (Decl);
                      end if;
 
index f2023c0e81a0656d909bfd3d486207dac68b5f46..0e66f426a4d0228fd87b126fb3b75d09bca5eb3d 100644 (file)
@@ -7419,7 +7419,7 @@ package body Einfo is
       Ritem := First_Rep_Item (Id);
       while Present (Ritem) loop
          if Nkind (Ritem) = N_Pragma
-           and then Pragma_Name (Ritem) = Name_Attach_Handler
+           and then Pragma_Name_Mapped (Ritem) = Name_Attach_Handler
          then
             return True;
          else
@@ -7480,7 +7480,7 @@ package body Einfo is
       Ritem := First_Rep_Item (Id);
       while Present (Ritem) loop
          if Nkind (Ritem) = N_Pragma
-           and then Pragma_Name (Ritem) = Name_Interrupt_Handler
+           and then Pragma_Name_Mapped (Ritem) = Name_Interrupt_Handler
          then
             return True;
          else
index 49aa2a7765f2fdce47ab1aa22ebab97e42a79e8a..f655452c848598f3ba68bf04e96ed2c48de25558 100644 (file)
@@ -2800,7 +2800,7 @@ package body Errout is
       --  identifiers, pragmas, and pragma argument associations.
 
       if Nkind (Node) = N_Pragma then
-         Nam := Pragma_Name (Node);
+         Nam := Pragma_Name_Mapped (Node);
          Loc := Sloc (Node);
 
       --  The other cases have Chars fields
index 57905df14593fa880a4926429842a3a28945a610..894a3f5a7059879e218387043b2ef1870527f029 100644 (file)
@@ -8100,7 +8100,7 @@ package body Exp_Attr is
       N := First_Rep_Item (Implementation_Base_Type (T));
       while Present (N) loop
          if Nkind (N) = N_Pragma
-           and then Pragma_Name (N) = Name_Stream_Convert
+           and then Pragma_Name_Mapped (N) = Name_Stream_Convert
          then
             --  For tagged types this pragma is not inherited, so we
             --  must verify that it is defined for the given type and
index 6f7ae0a002b6fed6035c9c4e4b59306d3e29415e..81eaf8c861a52f9f82d8df83c75472bf7a847bdb 100644 (file)
@@ -2758,7 +2758,7 @@ package body Exp_Ch3 is
                            --  Conversion for Priority expression
 
                            if Nam = Name_Priority then
-                              if Pragma_Name (Ritem) = Name_Priority
+                              if Pragma_Name_Mapped (Ritem) = Name_Priority
                                 and then not GNAT_Mode
                               then
                                  Exp := Convert_To (RTE (RE_Priority), Exp);
index 3f201bb979adc7c8db1c42ec068edf18244cdda6..85c381fca9b736ecef8353fa793ea1078ba83f67 100644 (file)
@@ -5618,7 +5618,7 @@ package body Exp_Ch6 is
 
          elsif Present (Next (N))
            and then Nkind (Next (N)) = N_Pragma
-           and then Get_Pragma_Id (Pragma_Name (Next (N))) = Pragma_Import
+           and then Get_Pragma_Id (Next (N)) = Pragma_Import
          then
             --  In SPARK, subprogram declarations are also permitted in
             --  declarative parts when immediately followed by a corresponding
index 031c49734e3c7be602f0152e18b8741a866acca6..ac188b490155446ed4bdbdd565bda523fc417e39 100644 (file)
@@ -4358,8 +4358,7 @@ package body Exp_Ch7 is
 
                Create_Append (Checks,
                  Make_Pragma (Ploc,
-                   Pragma_Identifier            =>
-                     Make_Identifier (Ploc, Name_Check),
+                   Chars                        => Name_Check,
                    Pragma_Argument_Associations => Assoc));
             end if;
 
@@ -4392,7 +4391,7 @@ package body Exp_Ch7 is
             Rep_Item := First_Rep_Item (T);
             while Present (Rep_Item) loop
                if Nkind (Rep_Item) = N_Pragma
-                 and then Pragma_Name (Rep_Item) = Name_Invariant
+                 and then Pragma_Name_Mapped (Rep_Item) = Name_Invariant
                then
                   --  Stop the traversal of the rep item chain once a specific
                   --  item is encountered.
index 7fba7bfb12da048b8656e064d0a318c93ff4a72a..7eb38b5e4d1a05286beb6eeb3402a6b4592e44b6 100644 (file)
@@ -1416,7 +1416,7 @@ package body Exp_Ch9 is
 
          Prag := Contract_Test_Cases (Items);
          while Present (Prag) loop
-            if Pragma_Name (Prag) = Name_Contract_Cases
+            if Pragma_Name_Mapped (Prag) = Name_Contract_Cases
               and then Is_Checked (Prag)
             then
                Has_Pragma := True;
@@ -9142,7 +9142,7 @@ package body Exp_Ch9 is
                Ritem := First_Rep_Item (Prot_Typ);
                while Present (Ritem) loop
                   if Nkind (Ritem) = N_Pragma
-                    and then Pragma_Name (Ritem) = Name_Attach_Handler
+                    and then Pragma_Name_Mapped (Ritem) = Name_Attach_Handler
                   then
                      Num_Attach_Handler := Num_Attach_Handler + 1;
                   end if;
@@ -11682,7 +11682,7 @@ package body Exp_Ch9 is
          N := First (Visible_Declarations (T));
          while Present (N) loop
             if Nkind (N) = N_Pragma
-              and then Pragma_Name (N) = Name_Relative_Deadline
+              and then Pragma_Name_Mapped (N) = Name_Relative_Deadline
             then
                return N;
             end if;
@@ -11693,7 +11693,7 @@ package body Exp_Ch9 is
          N := First (Private_Declarations (T));
          while Present (N) loop
             if Nkind (N) = N_Pragma
-              and then Pragma_Name (N) = Name_Relative_Deadline
+              and then Pragma_Name_Mapped (N) = Name_Relative_Deadline
             then
                return N;
             end if;
@@ -13706,7 +13706,7 @@ package body Exp_Ch9 is
 
                   --  Get_Rep_Item returns either priority pragma.
 
-                  if Pragma_Name (Prio_Clause) = Name_Priority then
+                  if Pragma_Name_Mapped (Prio_Clause) = Name_Priority then
                      Prio_Type := RTE (RE_Any_Priority);
                   else
                      Prio_Type := RTE (RE_Interrupt_Priority);
@@ -13940,7 +13940,7 @@ package body Exp_Ch9 is
 
             while Present (Ritem) loop
                if Nkind (Ritem) = N_Pragma
-                 and then Pragma_Name (Ritem) = Name_Attach_Handler
+                 and then Pragma_Name_Mapped (Ritem) = Name_Attach_Handler
                then
                   declare
                      Handler : constant Node_Id :=
index 62de26ba02620839ec6af5c896f895a084802db9..30284ae48776402cae21b630394e8ff709c2c3e7 100644 (file)
@@ -162,7 +162,7 @@ package body Exp_Prag is
    ---------------------
 
    procedure Expand_N_Pragma (N : Node_Id) is
-      Pname : constant Name_Id := Pragma_Name (N);
+      Pname : constant Name_Id := Pragma_Name_Mapped (N);
 
    begin
       --  Rewrite pragma ignored by Ignore_Pragma to null statement, so that
@@ -174,52 +174,48 @@ package body Exp_Prag is
          return;
       end if;
 
-      --  Note: we may have a pragma whose Pragma_Identifier field is not a
-      --  recognized pragma, and we must ignore it at this stage.
+      case Get_Pragma_Id (Pname) is
 
-      if Is_Pragma_Name (Pname) then
-         case Get_Pragma_Id (Pname) is
+         --  Pragmas requiring special expander action
 
-            --  Pragmas requiring special expander action
+         when Pragma_Abort_Defer =>
+            Expand_Pragma_Abort_Defer (N);
 
-            when Pragma_Abort_Defer =>
-               Expand_Pragma_Abort_Defer (N);
+         when Pragma_Check =>
+            Expand_Pragma_Check (N);
 
-            when Pragma_Check =>
-               Expand_Pragma_Check (N);
+         when Pragma_Common_Object =>
+            Expand_Pragma_Common_Object (N);
 
-            when Pragma_Common_Object =>
-               Expand_Pragma_Common_Object (N);
+         when Pragma_Import =>
+            Expand_Pragma_Import_Or_Interface (N);
 
-            when Pragma_Import =>
-               Expand_Pragma_Import_Or_Interface (N);
+         when Pragma_Inspection_Point =>
+            Expand_Pragma_Inspection_Point (N);
 
-            when Pragma_Inspection_Point =>
-               Expand_Pragma_Inspection_Point (N);
+         when Pragma_Interface =>
+            Expand_Pragma_Import_Or_Interface (N);
 
-            when Pragma_Interface =>
-               Expand_Pragma_Import_Or_Interface (N);
+         when Pragma_Interrupt_Priority =>
+            Expand_Pragma_Interrupt_Priority (N);
 
-            when Pragma_Interrupt_Priority =>
-               Expand_Pragma_Interrupt_Priority (N);
+         when Pragma_Loop_Variant =>
+            Expand_Pragma_Loop_Variant (N);
 
-            when Pragma_Loop_Variant =>
-               Expand_Pragma_Loop_Variant (N);
+         when Pragma_Psect_Object =>
+            Expand_Pragma_Psect_Object (N);
 
-            when Pragma_Psect_Object =>
-               Expand_Pragma_Psect_Object (N);
+         when Pragma_Relative_Deadline =>
+            Expand_Pragma_Relative_Deadline (N);
 
-            when Pragma_Relative_Deadline =>
-               Expand_Pragma_Relative_Deadline (N);
+         when Pragma_Suppress_Initialization =>
+            Expand_Pragma_Suppress_Initialization (N);
 
-            when Pragma_Suppress_Initialization =>
-               Expand_Pragma_Suppress_Initialization (N);
+         --  All other pragmas need no expander action (includes
+         --  Unknown_Pragma).
 
-            --  All other pragmas need no expander action
-
-            when others => null;
-         end case;
-      end if;
+         when others => null;
+      end case;
 
    end Expand_N_Pragma;
 
@@ -1292,7 +1288,7 @@ package body Exp_Prag is
 
       if Relaxed_RM_Semantics
         and then List_Length (Pragma_Argument_Associations (N)) = 2
-        and then Chars (Pragma_Identifier (N)) = Name_Import
+        and then Pragma_Name_Mapped (N) = Name_Import
         and then Nkind (Arg2 (N)) = N_String_Literal
       then
          Def_Id := Entity (Arg1 (N));
index c6e26d4d336ebe817d488a318609aab3481473e0..31eaf6ef095b56baf9fa21d61ac57b32412ae2d0 100644 (file)
@@ -3901,7 +3901,7 @@ package body Exp_Util is
 
       begin
          if Nkind (N) = N_Pragma
-           and then Get_Pragma_Id (Pragma_Name (N)) = Pragma_Annotate
+           and then Get_Pragma_Id (N) = Pragma_Annotate
            and then List_Length (Pragma_Argument_Associations (N)) = 2
          then
             declare
@@ -6856,7 +6856,7 @@ package body Exp_Util is
 
       return
         Make_Pragma (Loc,
-          Pragma_Identifier            => Make_Identifier (Loc, Name_Check),
+          Chars                        => Name_Check,
           Pragma_Argument_Associations => Arg_List);
    end Make_Predicate_Check;
 
index 96ae4e4c98c3d394115c1d77bed14fb9f960b697..44b306dda6fd8b1294c96834df3de8ba9ba50c04 100644 (file)
@@ -8464,7 +8464,7 @@ package body Freeze is
 
             if Present (Decl)
               and then Nkind (Decl) = N_Pragma
-              and then Pragma_Name (Decl) = Name_Import
+              and then Pragma_Name_Mapped (Decl) = Name_Import
             then
                return;
             end if;
index ff5418a13409f51f71958d7e11d3e17163683fe5..1f06614ce4f8bd306bdce0e7ed0a86e1707a4b41 100644 (file)
@@ -492,7 +492,7 @@ begin
       Item := First (Context_Items (Cunit (Main_Unit)));
       while Present (Item) loop
          if Nkind (Item) = N_Pragma
-           and then Pragma_Name (Item) = Name_Initialize_Scalars
+           and then Pragma_Name_Mapped (Item) = Name_Initialize_Scalars
          then
             Initialize_Scalars := True;
          end if;
index 26ea406f433f440e070a1e8c4ff3c2a4e5e84c2e..fd0d34edbe30c49823cba6ac87f777d0305bb612 100644 (file)
@@ -992,7 +992,7 @@ package body Ghost is
 
       while Present (Decl) loop
          if Nkind (Decl) = N_Pragma
-           and then Pragma_Name (Decl) = Name_Ghost
+           and then Pragma_Name_Mapped (Decl) = Name_Ghost
          then
             return
               Enables_Ghostness (First (Pragma_Argument_Associations (Decl)));
index 1be03ae87adf3a4821c29eef6d935dd3883c594f..4ecd11a956100bc34cbacdf3ca19847918a3795b 100644 (file)
@@ -2541,7 +2541,7 @@ package body Inline is
          --  not be posting warnings on the inlined body so it is unneeded.
 
          elsif Nkind (N) = N_Pragma
-           and then Pragma_Name (N) = Name_Unreferenced
+           and then Pragma_Name_Mapped (N) = Name_Unreferenced
          then
             Rewrite (N, Make_Null_Statement (Sloc (N)));
             return OK;
index 0cd615fd50458780883f0917771c313ff5c51509..ae6dbf750223fac530b6923defea4aa8cb40af2a 100644 (file)
@@ -672,7 +672,7 @@ package body Lib.Writ is
                   Write_Info_Initiate ('N');
                   Write_Info_Char (' ');
 
-                  case Chars (Pragma_Identifier (N)) is
+                  case Pragma_Name (N) is
                      when Name_Annotate =>
                         C := 'A';
                      when Name_Comment =>
index 06f74cdec3a90751e7745bd2a0d08d645aa494ca..fd8b963d22b6018c294ac12ecea32f07f5a6ddd8 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -279,12 +279,10 @@ package body Ch2 is
       --  Ada 2005 (AI-284): INTERFACE is a new reserved word but it is
       --  allowed as a pragma name.
 
-      if Ada_Version >= Ada_2005
-        and then Token = Tok_Interface
-      then
-         Prag_Name  := Name_Interface;
-         Ident_Node := Make_Identifier (Token_Ptr, Name_Interface);
-         Scan; -- past INTERFACE
+      if Is_Reserved_Keyword (Token) then
+         Prag_Name  := Keyword_Name (Token);
+         Ident_Node := Make_Identifier (Token_Ptr, Prag_Name);
+         Scan; -- past the keyword
       else
          Ident_Node := P_Identifier;
       end if;
@@ -490,8 +488,8 @@ package body Ch2 is
       Reserved_Words_OK : Boolean := False)
    is
       function P_Expression_Or_Reserved_Word return Node_Id;
-      --  Parse an expression or, if the token denotes one of the following
-      --  reserved words, construct an identifier with proper Chars field.
+      --  Parse an expression or, if the token is one of the following reserved
+      --  words, construct an identifier with proper Chars field.
       --    Access
       --    Delta
       --    Digits
index 121ab11a8fdd139702e7c35a55119b31ed1c84eb..461a3784b53944a008d154ebfc5a406ee330f3a2 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2013, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -143,6 +143,29 @@ package body Scans is
 
    end Initialize_Ada_Keywords;
 
+   ------------------
+   -- Keyword_Name --
+   ------------------
+
+   function Keyword_Name (Token : Token_Type) return Name_Id is
+      Tok : String := Token'Img;
+      pragma Assert (Tok (1 .. 4) = "TOK_");
+      Name : String renames Tok (5 .. Tok'Last);
+   begin
+      --  Convert to lower case. We don't want to add a dependence on a
+      --  general-purpose To_Lower routine, so we convert "by hand" here.
+      --  All keywords use 7-bit ASCII letters only, so this works.
+
+      for J in Name'Range loop
+         pragma Assert (Name (J) in 'A' .. 'Z');
+         Name (J) :=
+           Character'Val (Character'Pos (Name (J)) +
+                            (Character'Pos ('a') - Character'Pos ('A')));
+      end loop;
+
+      return Name_Find (Name);
+   end Keyword_Name;
+
    ------------------------
    -- Restore_Scan_State --
    ------------------------
index 682bb6c72fdeb9083ce0e51c69f58be62ed62d42..afbdf96aab2cddc9575ee15f3586744a7c4d8711 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2014, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2016, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -45,10 +45,6 @@ package Scans is
    --  The class column in this table indicates the token classes which
    --  apply to the token, as defined by subsequent subtype declarations.
 
-   --  Note: Namet.Is_Keyword_Name depends on the fact that the first entry in
-   --  this type declaration is *not* for a reserved word. For details on why
-   --  there is this requirement, see Initialize_Ada_Keywords below.
-
    type Token_Type is (
 
       --  Token name          Token type   Class(es)
@@ -228,6 +224,11 @@ package Scans is
       --  No_Token is used for initializing Token values to indicate that
       --  no value has been set yet.
 
+   function Keyword_Name (Token : Token_Type) return Name_Id;
+   --  Given a token that is a reserved word, return the corresponding Name_Id
+   --  in lower case. E.g. Keyword_Name (Tok_Begin) = Name_Find ("begin").
+   --  It is an error to pass any other kind of token.
+
    --  Note: in the RM, operator symbol is a special case of string literal.
    --  We distinguish at the lexical level in this compiler, since there are
    --  many syntactic situations in which only an operator symbol is allowed.
index a1e64e4311befe53d35b962fd30b25d46b01159b..393ebe90b066020e3b869df941c248495b69266f 100644 (file)
@@ -1306,7 +1306,7 @@ package body Sem_Attr is
             if Nkind (Prag) = N_Aspect_Specification then
                Prag_Nam := Chars (Identifier (Prag));
             else
-               Prag_Nam := Pragma_Name (Prag);
+               Prag_Nam := Pragma_Name_Mapped (Prag);
             end if;
 
             if Prag_Nam = Name_Check then
index c700245fef528775984542cc22cb4bd02b958d87..326cd073abe7c07d4824b86a533b7d12f1a1a3a4 100644 (file)
@@ -512,9 +512,10 @@ package body Sem_Aux is
            and then
              (Pragma_Name (N) = Nam
                or else (Nam = Name_Priority
-                         and then Pragma_Name (N) = Name_Interrupt_Priority)
+                         and then Pragma_Name_Mapped (N) =
+                           Name_Interrupt_Priority)
                or else (Nam = Name_Interrupt_Priority
-                         and then Pragma_Name (N) = Name_Priority))
+                         and then Pragma_Name_Mapped (N) = Name_Priority))
          then
             if Check_Parents then
                return N;
index e0baf7b0e49347dddcfbbb0515403b2e507a0367..9cd1489eef172a04255c905a07d66c54566d076b 100644 (file)
@@ -1332,7 +1332,7 @@ package body Sem_Ch10 is
       Item := First (Context_Items (N));
       while Present (Item)
         and then Nkind (Item) = N_Pragma
-        and then Pragma_Name (Item) in Configuration_Pragma_Names
+        and then Pragma_Name_Mapped (Item) in Configuration_Pragma_Names
       loop
          Analyze (Item);
          Next (Item);
@@ -3384,7 +3384,7 @@ package body Sem_Ch10 is
       Item := First (Context_Items (N));
       while Present (Item)
         and then Nkind (Item) = N_Pragma
-        and then Pragma_Name (Item) in Configuration_Pragma_Names
+        and then Pragma_Name_Mapped (Item) in Configuration_Pragma_Names
       loop
          Next (Item);
       end loop;
@@ -4526,7 +4526,7 @@ package body Sem_Ch10 is
                   Check_Declarations (Specification (Decl));
 
                elsif Nkind (Decl) = N_Pragma
-                 and then Pragma_Name (Decl) = Name_Import
+                 and then Pragma_Name_Mapped (Decl) = Name_Import
                then
                   Check_Pragma_Import (Decl);
                end if;
@@ -4558,7 +4558,7 @@ package body Sem_Ch10 is
                   Append_Elmt (Decl, Incomplete_Decls);
 
                elsif Nkind (Decl) = N_Pragma
-                 and then Pragma_Name (Decl) = Name_Import
+                 and then Pragma_Name_Mapped (Decl) = Name_Import
                then
                   Check_Pragma_Import (Decl);
                end if;
@@ -5826,7 +5826,7 @@ package body Sem_Ch10 is
 
             Decl := First (Decls);
             while Present (Decl) and then Nkind (Decl) = N_Pragma loop
-               if Pragma_Name (Decl) = Name_Abstract_State then
+               if Pragma_Name_Mapped (Decl) = Name_Abstract_State then
                   Process_State
                     (Get_Pragma_Arg
                        (First (Pragma_Argument_Associations (Decl))));
index 262728856ed4cc715483476e1070674bf9c841bf..1685ff3d33636ba4b04eaf3aea5b3ca8663c2f1e 100644 (file)
@@ -6868,7 +6868,7 @@ package body Sem_Ch13 is
 
             --  The only pragma of interest is Complete_Representation
 
-            if Pragma_Name (CC) = Name_Complete_Representation then
+            if Pragma_Name_Mapped (CC) = Name_Complete_Representation then
                CR_Pragma := CC;
             end if;
 
@@ -8406,7 +8406,7 @@ package body Sem_Ch13 is
          Ritem := First_Rep_Item (Typ);
          while Present (Ritem) loop
             if Nkind (Ritem) = N_Pragma
-              and then Pragma_Name (Ritem) = Name_Predicate
+              and then Pragma_Name_Mapped (Ritem) = Name_Predicate
             then
                Add_Predicate (Ritem);
 
@@ -8424,7 +8424,7 @@ package body Sem_Ch13 is
 
                begin
                   if Nkind (Prag) = N_Pragma
-                    and then Pragma_Name (Prag) = Name_Predicate
+                    and then Pragma_Name_Mapped (Prag) = Name_Predicate
                   then
                      Add_Predicate (Prag);
                   end if;
@@ -12367,7 +12367,7 @@ package body Sem_Ch13 is
 
       if Is_Overloadable (T) and then Nkind (N) = N_Pragma then
          declare
-            Pname : constant Name_Id := Pragma_Name (N);
+            Pname : constant Name_Id := Pragma_Name_Mapped (N);
          begin
             if Nam_In (Pname, Name_Convention, Name_Import,   Name_Export,
                               Name_External,   Name_Interface)
@@ -13560,7 +13560,7 @@ package body Sem_Ch13 is
 
       procedure No_Independence is
       begin
-         if Pragma_Name (N) = Name_Independent then
+         if Pragma_Name_Mapped (N) = Name_Independent then
             Error_Msg_NE ("independence cannot be guaranteed for&", N, E);
          else
             Error_Msg_NE
@@ -13691,7 +13691,7 @@ package body Sem_Ch13 is
       for J in Independence_Checks.First .. Independence_Checks.Last loop
          N  := Independence_Checks.Table (J).N;
          E  := Independence_Checks.Table (J).E;
-         IC := Pragma_Name (N) = Name_Independent_Components;
+         IC := Pragma_Name_Mapped (N) = Name_Independent_Components;
 
          --  Deal with component case
 
index 3ce683e22a65d4736eecf7aec6c3a0e84067a039..014c2d4bbb72db3c6c05eb99c3f87b7e96b8e1ab 100644 (file)
@@ -2692,7 +2692,7 @@ package body Sem_Ch6 is
                   Analyze (Prag);
                   Set_Has_Pragma_Inline (Subp);
 
-                  if Pragma_Name (Prag) = Name_Inline_Always then
+                  if Pragma_Name_Mapped (Prag) = Name_Inline_Always then
                      Set_Is_Inlined (Subp);
                      Set_Has_Pragma_Inline_Always (Subp);
                   end if;
@@ -6064,7 +6064,7 @@ package body Sem_Ch6 is
 
          begin
             if Nkind (Orig) = N_Pragma
-              and then Pragma_Name (Orig) = Name_Assert
+              and then Pragma_Name_Mapped (Orig) = Name_Assert
               and then not Error_Posted (Orig)
             then
                declare
@@ -9301,7 +9301,7 @@ package body Sem_Ch6 is
                      if Class_Present (Prag)
                        and then not Split_PPC (Prag)
                      then
-                        if Pragma_Name (Prag) = Name_Precondition then
+                        if Pragma_Name_Mapped (Prag) = Name_Precondition then
                            Error_Msg_N
                              ("info: & inherits `Pre''Class` aspect from "
                               & "#?L?", E);
index 7ccf38bdb336998aafe5cc221e2175b804ad0539..1c01f3e74a2a044f575d2f44bf476927cb48eba1 100644 (file)
@@ -498,9 +498,10 @@ package body Sem_Ch9 is
 
                      elsif Kind = N_Pragma then
                         declare
-                           Prag_Name : constant Name_Id   := Pragma_Name (N);
+                           Prag_Name : constant Name_Id   :=
+                             Pragma_Name_Mapped (N);
                            Prag_Id   : constant Pragma_Id :=
-                                         Get_Pragma_Id (Prag_Name);
+                             Get_Pragma_Id (Prag_Name);
 
                         begin
                            if Prag_Id = Pragma_Export
@@ -2148,7 +2149,7 @@ package body Sem_Ch9 is
                --  Pragma case
 
                else
-                  Error_Msg_Name_1 := Pragma_Name (Prio_Item);
+                  Error_Msg_Name_1 := Pragma_Name_Mapped (Prio_Item);
                   Error_Msg_NE
                     ("pragma% for & has no effect when Lock_Free given??",
                      Prio_Item, Id);
@@ -2188,7 +2189,7 @@ package body Sem_Ch9 is
                --  Pragma case
 
                elsif Nkind (Prio_Item) = N_Pragma
-                 and then Pragma_Name (Prio_Item) = Name_Priority
+                 and then Pragma_Name_Mapped (Prio_Item) = Name_Priority
                then
                   Error_Msg_N
                     ("pragma Interrupt_Priority is preferred in presence of "
index 7fa4845dac204e56ae5ba2efc636788242ac0729..e623262138e846158cee29e52ec0cf7746be1f55 100644 (file)
@@ -2099,7 +2099,7 @@ package body Sem_Elab is
          Par := Call;
          while Present (Par) loop
             if Nkind (Par) = N_Pragma then
-               Nam := Pragma_Name (Par);
+               Nam := Pragma_Name_Mapped (Par);
 
                --  Pragma Initial_Condition appears in its alternative from as
                --  Check (Initial_Condition, ...).
@@ -2485,7 +2485,7 @@ package body Sem_Elab is
                --  Or, in the case of an initial condition, specifically by a
                --  Check pragma specifying an Initial_Condition check.
 
-               elsif Pragma_Name (O) = Name_Check
+               elsif Pragma_Name_Mapped (O) = Name_Check
                  and then
                    Chars
                      (Expression (First (Pragma_Argument_Associations (O)))) =
@@ -3716,7 +3716,7 @@ package body Sem_Elab is
          Item := First (Context_Items (CU));
          while Present (Item) loop
             if Nkind (Item) = N_Pragma
-              and then Pragma_Name (Item) = Name_Elaborate_All
+              and then Pragma_Name_Mapped (Item) = Name_Elaborate_All
             then
                --  Return if some previous error on the pragma itself. The
                --  pragma may be unanalyzed, because of a previous error, or
index a7c1ca45754724fd75c2245247bff45fcd96a50a..a5ae0d0d39e97ecd502ad534556167eb2230f187 100644 (file)
@@ -2006,7 +2006,7 @@ package body Sem_Prag is
          return;
       end if;
 
-      Error_Msg_Name_1 := Pragma_Name (N);
+      Error_Msg_Name_1 := Pragma_Name_Mapped (N);
 
       --  An external property pragma must apply to an effectively volatile
       --  object other than a formal subprogram parameter (SPARK RM 7.1.3(2)).
@@ -5289,7 +5289,7 @@ package body Sem_Prag is
          --  previously given aspect specification or attribute definition
          --  clause for the same pragma.
 
-         P := Get_Rep_Item (E, Pragma_Name (N), Check_Parents => False);
+         P := Get_Rep_Item (E, Pragma_Name_Mapped (N), Check_Parents => False);
 
          if Present (P) then
 
@@ -5322,7 +5322,7 @@ package body Sem_Prag is
 
             --  Here we have a definite duplicate
 
-            Error_Msg_Name_1 := Pragma_Name (N);
+            Error_Msg_Name_1 := Pragma_Name_Mapped (N);
             Error_Msg_Sloc := Sloc (P);
 
             --  For a single protected or a single task object, the error is
@@ -6496,7 +6496,7 @@ package body Sem_Prag is
          if Is_Rewrite_Substitution (N)
            and then Nkind (Original_Node (N)) = N_Pragma
          then
-            Error_Msg_Name_1 := Pragma_Name (Original_Node (N));
+            Error_Msg_Name_1 := Pragma_Name_Mapped (Original_Node (N));
          end if;
 
          --  Case where pragma comes from an aspect specification
@@ -7212,7 +7212,7 @@ package body Sem_Prag is
 
                      if Nam_In (Pragma_Name (Decl), Name_Export,
                                                     Name_Convention,
-                                                    Pragma_Name (N))
+                                                    Pragma_Name_Mapped (N))
                      then
                         exit;
 
@@ -10381,7 +10381,7 @@ package body Sem_Prag is
 
       --  Deal with unrecognized pragma
 
-      Pname := Pragma_Name (N);
+      Pname := Pragma_Name_Mapped (N);
 
       if not Is_Pragma_Name (Pname) then
          if Warn_On_Unrecognized_Pragma then
@@ -13800,7 +13800,7 @@ package body Sem_Prag is
                --  Skip prior pragmas, but check for duplicates
 
                if Nkind (Stmt) = N_Pragma then
-                  if Pragma_Name (Stmt) = Pname then
+                  if Pragma_Name_Mapped (Stmt) = Pname then
                      Error_Msg_Name_1 := Pname;
                      Error_Msg_Sloc   := Sloc (Stmt);
                      Error_Msg_N ("pragma % duplicates pragma declared#", N);
@@ -15290,7 +15290,7 @@ package body Sem_Prag is
                --  Skip prior pragmas, but check for duplicates
 
                if Nkind (Stmt) = N_Pragma then
-                  if Pragma_Name (Stmt) = Pname then
+                  if Pragma_Name_Mapped (Stmt) = Pname then
                      Error_Msg_Name_1 := Pname;
                      Error_Msg_Sloc   := Sloc (Stmt);
                      Error_Msg_N ("pragma % duplicates pragma declared#", N);
@@ -16564,7 +16564,7 @@ package body Sem_Prag is
                   if Is_Imported (Def_Id)
                     and then Present (First_Rep_Item (Def_Id))
                     and then Nkind (First_Rep_Item (Def_Id)) = N_Pragma
-                    and then Pragma_Name (First_Rep_Item (Def_Id)) =
+                    and then Pragma_Name_Mapped (First_Rep_Item (Def_Id)) =
                       Name_Interface
                   then
                      null;
@@ -17604,7 +17604,7 @@ package body Sem_Prag is
             Nod := Next (N);
             while Present (Nod) loop
                if Nkind (Nod) = N_Pragma
-                 and then Pragma_Name (Nod) = Name_Main
+                 and then Pragma_Name_Mapped (Nod) = Name_Main
                then
                   Error_Msg_Name_1 := Pname;
                   Error_Msg_N ("duplicate pragma% not permitted", Nod);
@@ -17648,7 +17648,7 @@ package body Sem_Prag is
             Nod := Next (N);
             while Present (Nod) loop
                if Nkind (Nod) = N_Pragma
-                 and then Pragma_Name (Nod) = Name_Main_Storage
+                 and then Pragma_Name_Mapped (Nod) = Name_Main_Storage
                then
                   Error_Msg_Name_1 := Pname;
                   Error_Msg_N ("duplicate pragma% not permitted", Nod);
@@ -19040,20 +19040,40 @@ package body Sem_Prag is
 
          --  pragma Rename_Pragma (
          --           [New_Name =>] IDENTIFIER,
-         --           [Renames  =>] pragma_IDENTIFIER);
-
-         --  ??? this is work in progress
+         --           [Renamed  =>] pragma_IDENTIFIER);
 
          pragma Warnings (Off);
          when Pragma_Rename_Pragma => Rename_Pragma : declare
-            GNAT_Pragma_Arg : constant Node_Id := Get_Pragma_Arg (Arg2);
-            Synonym         : constant Node_Id := Get_Pragma_Arg (Arg1);
-
+            New_Name : constant Node_Id := Get_Pragma_Arg (Arg1);
+            Old_Name : constant Node_Id := Get_Pragma_Arg (Arg2);
          begin
             GNAT_Pragma;
+            Check_Valid_Configuration_Pragma;
             Check_Arg_Count (2);
             Check_Optional_Identifier (Arg1, Name_New_Name);
-            Check_Optional_Identifier (Arg2, Name_Renames);
+            Check_Optional_Identifier (Arg2, Name_Renamed);
+
+            if Nkind (New_Name) /= N_Identifier then
+               Error_Pragma_Arg ("identifier expected", Arg1);
+            end if;
+
+            if Nkind (Old_Name) /= N_Identifier then
+               Error_Pragma_Arg ("identifier expected", Arg2);
+            end if;
+
+            --  The New_Name arg should not be an existing pragma (but we allow
+            --  it; it's just a warning). The Old_Name arg must be an existing
+            --  pragma.
+
+            if Is_Pragma_Name (Chars (New_Name)) then
+               Error_Pragma_Arg ("??pragma is already defined", Arg1);
+            end if;
+
+            if not Is_Pragma_Name (Chars (Old_Name)) then
+               Error_Pragma_Arg ("existing pragma name expected", Arg1);
+            end if;
+
+            Map_Pragma_Name (From => Chars (New_Name), To => Chars (Old_Name));
          end Rename_Pragma;
          pragma Warnings (On);
 
@@ -19694,7 +19714,7 @@ package body Sem_Prag is
 
                Import :=
                  Make_Pragma (Loc,
-                   Chars                        => Name_Import,
+                   Chars => Name_Import,
                    Pragma_Argument_Associations => New_List (
                      Make_Pragma_Argument_Association (Loc,
                        Expression => Make_Identifier (Loc, Name_Intrinsic)),
@@ -21357,7 +21377,7 @@ package body Sem_Prag is
                   --  this also takes care of pragmas generated for aspects.
 
                   if Nkind (Stmt) = N_Pragma then
-                     if Pragma_Name (Stmt) = Pname then
+                     if Pragma_Name_Mapped (Stmt) = Pname then
                         Error_Msg_Name_1 := Pname;
                         Error_Msg_Sloc   := Sloc (Stmt);
                         Error_Msg_N ("pragma% duplicates pragma declared#", N);
@@ -22207,7 +22227,7 @@ package body Sem_Prag is
                if Present (Items) then
                   Prag := Contract_Test_Cases (Items);
                   while Present (Prag) loop
-                     if Pragma_Name (Prag) = Name_Test_Case
+                     if Pragma_Name_Mapped (Prag) = Name_Test_Case
                        and then Prag /= N
                        and then String_Equal
                                   (Name, Get_Name_From_CTC_Pragma (Prag))
@@ -22437,7 +22457,7 @@ package body Sem_Prag is
                Nod := Next (N);
                while Present (Nod) loop
                   if Nkind (Nod) = N_Pragma
-                    and then Pragma_Name (Nod) = Name_Time_Slice
+                    and then Pragma_Name_Mapped (Nod) = Name_Time_Slice
                   then
                      Error_Msg_Name_1 := Pname;
                      Error_Msg_N ("duplicate pragma% not permitted", Nod);
@@ -26928,7 +26948,7 @@ package body Sem_Prag is
       --  Local variables
 
       Loc          : constant Source_Ptr := Sloc (Prag);
-      Prag_Nam     : constant Name_Id    := Pragma_Name (Prag);
+      Prag_Nam     : constant Name_Id    := Pragma_Name_Mapped (Prag);
       Check_Prag   : Node_Id;
       Msg_Arg      : Node_Id;
       Nam          : Name_Id;
@@ -27964,7 +27984,9 @@ package body Sem_Prag is
          --  Skip prior pragmas, but check for duplicates
 
          if Nkind (Stmt) = N_Pragma then
-            if Do_Checks and then Pragma_Name (Stmt) = Pragma_Name (Prag) then
+            if Do_Checks
+              and then Pragma_Name_Mapped (Stmt) = Pragma_Name_Mapped (Prag)
+            then
                Duplication_Error
                  (Prag => Prag,
                   Prev => Stmt);
@@ -28171,7 +28193,7 @@ package body Sem_Prag is
       Do_Checks : Boolean := False) return Node_Id
    is
       Context  : constant Node_Id := Parent (Prag);
-      Prag_Nam : constant Name_Id := Pragma_Name (Prag);
+      Prag_Nam : constant Name_Id := Pragma_Name_Mapped (Prag);
       Stmt     : Node_Id;
 
    begin
@@ -28181,7 +28203,7 @@ package body Sem_Prag is
          --  Skip prior pragmas, but check for duplicates
 
          if Nkind (Stmt) = N_Pragma then
-            if Do_Checks and then Pragma_Name (Stmt) = Prag_Nam then
+            if Do_Checks and then Pragma_Name_Mapped (Stmt) = Prag_Nam then
                Duplication_Error
                  (Prag => Prag,
                   Prev => Stmt);
@@ -28558,7 +28580,7 @@ package body Sem_Prag is
    begin
       pragma Assert
         (Nkind (N) = N_Pragma
-          and then Pragma_Name (N) = Name_SPARK_Mode
+          and then Pragma_Name_Mapped (N) = Name_SPARK_Mode
           and then Is_List_Member (N));
 
       --  Pragma SPARK_Mode affects the elaboration of a package body when it
@@ -28930,7 +28952,7 @@ package body Sem_Prag is
    function Is_Pragma_String_Literal (Par : Node_Id) return Boolean is
       Pragn : constant Node_Id := Parent (Par);
       Assoc : constant List_Id := Pragma_Argument_Associations (Pragn);
-      Pname : constant Name_Id := Pragma_Name (Pragn);
+      Pname : constant Name_Id := Pragma_Name_Mapped (Pragn);
       Argn  : Natural;
       N     : Node_Id;
 
@@ -28992,7 +29014,7 @@ package body Sem_Prag is
    begin
       pragma Assert
         (Nkind (N) = N_Pragma
-          and then Pragma_Name (N) = Name_SPARK_Mode
+          and then Pragma_Name_Mapped (N) = Name_SPARK_Mode
           and then Is_List_Member (N));
 
       --  For pragma SPARK_Mode to be private, it has to appear in the private
index c8ca67cb6090c889c5d27fc7aee8a711b89b2657..692a00ae20b44b2fdf32b1c175890f75a93160c0 100644 (file)
@@ -10018,7 +10018,7 @@ package body Sem_Res is
             --  Special handling of Asssert pragma
 
             if Nkind (Orig) = N_Pragma
-              and then Pragma_Name (Orig) = Name_Assert
+              and then Pragma_Name_Mapped (Orig) = Name_Assert
             then
                declare
                   Expr : constant Node_Id :=
@@ -10059,7 +10059,7 @@ package body Sem_Res is
             --  Similar processing for Check pragma
 
             elsif Nkind (Orig) = N_Pragma
-              and then Pragma_Name (Orig) = Name_Check
+              and then Pragma_Name_Mapped (Orig) = Name_Check
             then
                --  Don't want to warn if original condition is explicit False
 
index cd75585ea8963c529910b87304f4ef96ebfdbe02..64cbbea3be0c096a334c8805bf43cd9c0df3d6c8 100644 (file)
@@ -1319,9 +1319,7 @@ package body Sem_Util is
 
                Stmt :=
                  Make_Pragma (Loc,
-                   Pragma_Identifier            =>
-                     Make_Identifier (Loc, Name_Check),
-
+                   Chars            => Name_Check,
                    Pragma_Argument_Associations => New_List (
                      Make_Pragma_Argument_Association (Loc,
                        Expression =>
@@ -2025,7 +2023,7 @@ package body Sem_Util is
       Par := Parent (Ref);
       while Present (Par) loop
          if Nkind (Par) = N_Pragma then
-            Prag_Nam := Pragma_Name (Par);
+            Prag_Nam := Pragma_Name_Mapped (Par);
 
             --  A concurrent constituent is allowed to appear in pragmas
             --  Initial_Condition and Initializes as this is part of the
@@ -3417,12 +3415,12 @@ package body Sem_Util is
                Check_Function_Result (Expr);
 
                if not Mentions_Post_State (Expr) then
-                  if Pragma_Name (Prag) = Name_Contract_Cases then
+                  if Pragma_Name_Mapped (Prag) = Name_Contract_Cases then
                      Error_Msg_NE
                        ("contract case does not check the outcome of calling "
                         & "&?T?", Expr, Subp_Id);
 
-                  elsif Pragma_Name (Prag) = Name_Refined_Post then
+                  elsif Pragma_Name_Mapped (Prag) = Name_Refined_Post then
                      Error_Msg_NE
                        ("refined postcondition does not check the outcome of "
                         & "calling &?T?", Prag, Subp_Id);
@@ -3534,7 +3532,7 @@ package body Sem_Util is
          Expr  : constant Node_Id :=
                    Get_Pragma_Arg
                      (First (Pragma_Argument_Associations (Prag)));
-         Nam   : constant Name_Id := Pragma_Name (Prag);
+         Nam   : constant Name_Id := Pragma_Name_Mapped (Prag);
          CCase : Node_Id;
 
       --  Start of processing for Check_Result_And_Post_State_In_Pragma
@@ -3643,7 +3641,7 @@ package body Sem_Util is
 
       Prag := Contract_Test_Cases (Items);
       while Present (Prag) loop
-         if Pragma_Name (Prag) = Name_Contract_Cases
+         if Pragma_Name_Mapped (Prag) = Name_Contract_Cases
            and then not Error_Posted (Prag)
          then
             Case_Prag := Prag;
@@ -5172,7 +5170,7 @@ package body Sem_Util is
 
       Arg : constant Node_Id :=
               Get_Pragma_Arg (First (Pragma_Argument_Associations (Prag)));
-      Nam : constant Name_Id := Pragma_Name (Prag);
+      Nam : constant Name_Id := Pragma_Name_Mapped (Prag);
 
    --  Start of processing for Contains_Refined_State
 
@@ -6984,7 +6982,7 @@ package body Sem_Util is
          Decl := Next (Unit_Declaration_Node (Subp));
          while Present (Decl) loop
             if Nkind (Decl) = N_Pragma
-              and then Pragma_Name (Decl) = Name_Extensions_Visible
+              and then Pragma_Name_Mapped (Decl) = Name_Extensions_Visible
             then
                Prag := Decl;
                exit;
@@ -10993,7 +10991,7 @@ package body Sem_Util is
       loop
          if No (P) then
             return False;
-         elsif Nkind (P) = N_Pragma and then Pragma_Name (P) = Nam then
+         elsif Nkind (P) = N_Pragma and then Pragma_Name_Mapped (P) = Nam then
             return True;
          else
             P := Parent (P);
@@ -12359,7 +12357,7 @@ package body Sem_Util is
 
             elsif Nkind (P) = N_Pragma
               and then
-                Get_Pragma_Id (Pragma_Name (P)) = Pragma_Predicate_Failure
+                Get_Pragma_Id (P) = Pragma_Predicate_Failure
             then
                return True;
             end if;
@@ -14052,7 +14050,7 @@ package body Sem_Util is
          Nam := Chars (Identifier (Item));
 
       else pragma Assert (Nkind (Item) = N_Pragma);
-         Nam := Pragma_Name (Item);
+         Nam := Pragma_Name_Mapped (Item);
       end if;
 
       return    Nam = Name_Abstract_State
@@ -14871,7 +14869,7 @@ package body Sem_Util is
          Nam := Chars (Identifier (Item));
 
       else pragma Assert (Nkind (Item) = N_Pragma);
-         Nam := Pragma_Name (Item);
+         Nam := Pragma_Name_Mapped (Item);
       end if;
 
       return    Nam = Name_Contract_Cases
index 92503fed407085315e366430d49e3282aa760046..0e95bdd3cd490105ca55420a2f51ac305bb01d98 100644 (file)
@@ -958,7 +958,7 @@ package Sem_Util is
 
    function Get_Pragma_Id (N : Node_Id) return Pragma_Id;
    pragma Inline (Get_Pragma_Id);
-   --  Obtains the Pragma_Id from the Chars field of Pragma_Identifier (N)
+   --  Obtains the Pragma_Id from Pragma_Name (N)
 
    function Get_Qualified_Name
      (Id     : Entity_Id;
index d9050959ff2427f1689a27de6b94e9058719622c..f722ada0a5672cccdd323b684935328c2977eaaf 100644 (file)
@@ -1887,7 +1887,8 @@ package body Sem_Warn is
                               P := Parent (Nod);
 
                               if Nkind (P) = N_Pragma
-                                and then Pragma_Name (P) = Name_Test_Case
+                                and then Pragma_Name_Mapped (P) =
+                                  Name_Test_Case
                                 and then Nod = Test_Case_Arg (P, Name_Ensures)
                               then
                                  return True;
index 30960b4a1b742769da9ebfc8fe35334587494d0a..4059f218b8b5f20e410599a45db9425c81ec8158 100644 (file)
@@ -6822,9 +6822,28 @@ package body Sinfo is
    -- Map_Pragma_Name --
    ---------------------
 
+   --  We don't want to introduce a dependence on some hash table package or
+   --  similar, so we use a simple array of Key => Value pairs, and do a linear
+   --  search. Linear search is plenty efficient, given that we don't expect
+   --  more than a couple of entries in the mapping.
+
+   type Name_Pair is record
+      Key   : Name_Id;
+      Value : Name_Id;
+   end record;
+
+   type Pragma_Map_Index is range 1 .. 100;
+   Pragma_Map : array (Pragma_Map_Index) of Name_Pair;
+   Last_Pair : Pragma_Map_Index'Base range 0 .. Pragma_Map_Index'Last := 0;
+
    procedure Map_Pragma_Name (From, To : Name_Id) is
    begin
-      null; -- not yet implemented
+      if Last_Pair = Pragma_Map'Last then
+         raise Too_Many_Pragma_Mappings;
+      end if;
+
+      Last_Pair := Last_Pair + 1;
+      Pragma_Map (Last_Pair) := (Key => From, Value => To);
    end Map_Pragma_Name;
 
    ------------------------
@@ -6832,8 +6851,15 @@ package body Sinfo is
    ------------------------
 
    function Pragma_Name_Mapped (N : Node_Id) return Name_Id is
+      Result : constant Name_Id := Pragma_Name (N);
    begin
-      return Pragma_Name (N);
+      for J in Pragma_Map'Range loop
+         if Result = Pragma_Map (J).Key then
+            return Pragma_Map (J).Value;
+         end if;
+      end loop;
+
+      return Result;
    end Pragma_Name_Mapped;
 
 end Sinfo;
index 4a01505dee1dc5f00d7232ee23de5494f040ae3c..1aec0869deb87e168a4d5604938282613168e712 100644 (file)
@@ -11012,10 +11012,16 @@ package Sinfo is
 
    procedure Map_Pragma_Name (From, To : Name_Id);
    --  Used in the implementation of pragma Rename_Pragma. Maps pragma name
-   --  From to pragma name To, we From can be used as a synonym for To.
+   --  From to pragma name To, so From can be used as a synonym for To.
+
+   Too_Many_Pragma_Mappings : exception;
+   --  Raised if Map_Pragma_Name is called too many times. We expect that few
+   --  programs will use it at all, and those that do will use it approximately
+   --  once or twice.
 
    function Pragma_Name_Mapped (N : Node_Id) return Name_Id;
-   --  ????Work in progress.
+   --  Same as Pragma_Name, except that if From has been mapped to To, and
+   --  Pragma_Name (N) = From, then this returns To.
 
    -----------------------------
    -- Syntactic Parent Tables --
index 0d12b6a92dd0848274f4493915fd7207096f59ac..a45b895d09ffd842291d798b23c57fbcd7c873d8 100644 (file)
@@ -796,6 +796,7 @@ package Snames is
    Name_Proof_In                       : constant Name_Id := N + $;
    Name_Reason                         : constant Name_Id := N + $;
    Name_Reference                      : constant Name_Id := N + $;
+   Name_Renamed                        : constant Name_Id := N + $;
    Name_Requires                       : constant Name_Id := N + $;
    Name_Restricted                     : constant Name_Id := N + $;
    Name_Result_Mechanism               : constant Name_Id := N + $;