par-prag.adb (Prag): Add dummy entry for pragma Compile_Time_Error
authorRobert Dewar <dewar@adacore.com>
Fri, 6 Apr 2007 09:25:05 +0000 (11:25 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Fri, 6 Apr 2007 09:25:05 +0000 (11:25 +0200)
2007-04-06  Robert Dewar  <dewar@adacore.com>
    Javier Miranda  <miranda@adacore.com>
    Bob Duff  <duff@adacore.com>
    Vincent Celier  <celier@adacore.com>

* par-prag.adb (Prag): Add dummy entry for pragma Compile_Time_Error
(Extensions_Allowed): No longer sets Ada_Version
Entry for pragma Unreferenced_Objects

* sem_prag.adb (Analyze_Pragma, case Priority): Force with of
system.tasking if pragma priority used in a procedure
(Analyze_Pragma, case Warning): Handle dot warning switches
(Process_Compile_Time_Warning_Or_Error): New procedure
(Analyze_Pragma): Add processing for Compile_Time_Error
Add support for extra arguments External_Name and Link_Name.
Remove code associated with pragmas CPP_Virtual and CPP_Vtable.
(Process_Import_Or_Interface): Add support for the use of pragma Import
with tagged types.
(Extensions_Allowed): No longer affects Ada_Version
(Analyze_Pragma): Split Is_Abstract flag into Is_Abstract_Subprogram and
Is_Abstract_Type. Make sure these are called only when appropriate.
Add processing for pragma Unreferenced_Objects

* snames.h, snames.ads, snames.adb: Add entry for pragma
Compile_Time_Error
Add new standard name Minimum_Binder_Options for new gprmake
Add new standard names for gprmake: Archive_Suffix,
Library_Auto_Init_Supported, Library_Major_Minor_Id_Supported,
Library_Support, Library_Version_Options,
Shared_Library_Minimum_Options,
Shared_Library_Prefix, Shared_Library_Suffix, Symbolic_Link_Supported.
Change Name_Call to Name_uCall so that it cannot clash with a legal
subprogram name.
Add new standard names Mapping_Spec_Suffix and Mapping_Body_Suffix
Append C_Plus_Plus to convention identifiers as synonym for CPP
Add new standard names Stack and Builder_Switches
Add new standard names: Compiler_Minimum_Options, Global_Config_File,
Library_Builder, Local_Config_File, Objects_Path, Objects_Path_File,
Run_Path_Option, Toolchain_Version.
Entry for pragma Unreferenced_Objects

* switch-c.adb (Scan_Front_End_Switches): Store correct -gnateD
switches, without repetition of "eD". Make sure that last character of
-gnatep= switch is not taken as -gnat switch character.
Complete rewrite of circuit for handling saving compilation options
Occasioned by need to support dot switchs for -gnatw, but cleans up
things in general.
-gnatX does not affect Ada_Version
Include -gnatyA in -gnatg style switches

* sem_warn.ads, sem_warn.adb (Output_Unreferenced_Messages): Exclude
warnings on return objects.
(Warn_On_Useless_Assignment): Exclude warnings on return objects
(Set_Dot_Warning_Switch): New procedure
(Check_References): Add missing case of test for
Has_Pragma_Unreferenced_Objects
(Output_Unreferenced_Messages): Implement effect of new pragma
Unreferenced_Objects, remove special casing of limited controlled
variables.

From-SVN: r123588

gcc/ada/par-prag.adb
gcc/ada/sem_prag.adb
gcc/ada/sem_warn.adb
gcc/ada/sem_warn.ads
gcc/ada/snames.adb
gcc/ada/snames.ads
gcc/ada/snames.h
gcc/ada/switch-c.adb

index eb56fc2..c9afda4 100644 (file)
@@ -376,14 +376,10 @@ begin
 
          if Chars (Expression (Arg1)) = Name_On then
             Extensions_Allowed := True;
-            Ada_Version := Ada_Version_Type'Last;
          else
             Extensions_Allowed := False;
-            Ada_Version := Ada_Version_Type'Min (Ada_Version, Ada_95);
          end if;
 
-         Ada_Version_Explicit := Ada_Version;
-
       ----------------
       -- List (2.8) --
       ----------------
@@ -1058,6 +1054,7 @@ begin
            Pragma_Atomic                        |
            Pragma_Atomic_Components             |
            Pragma_Attach_Handler                |
+           Pragma_Compile_Time_Error            |
            Pragma_Compile_Time_Warning          |
            Pragma_Convention_Identifier         |
            Pragma_CPP_Class                     |
@@ -1179,6 +1176,7 @@ begin
            Pragma_Unimplemented_Unit            |
            Pragma_Universal_Data                |
            Pragma_Unreferenced                  |
+           Pragma_Unreferenced_Objects          |
            Pragma_Unreserve_All_Interrupts      |
            Pragma_Unsuppress                    |
            Pragma_Use_VADS_Size                 |
index aa994a4..9ad244c 100644 (file)
@@ -35,7 +35,6 @@ with Casing;   use Casing;
 with Csets;    use Csets;
 with Debug;    use Debug;
 with Einfo;    use Einfo;
-with Elists;   use Elists;
 with Errout;   use Errout;
 with Exp_Dist; use Exp_Dist;
 with Hostparm; use Hostparm;
@@ -54,7 +53,6 @@ with Sem;      use Sem;
 with Sem_Ch3;  use Sem_Ch3;
 with Sem_Ch8;  use Sem_Ch8;
 with Sem_Ch13; use Sem_Ch13;
-with Sem_Disp; use Sem_Disp;
 with Sem_Dist; use Sem_Dist;
 with Sem_Elim; use Sem_Elim;
 with Sem_Eval; use Sem_Eval;
@@ -513,6 +511,9 @@ package body Sem_Prag is
       --  Shared is an obsolete Ada 83 pragma, treated as being identical
       --  in effect to pragma Atomic.
 
+      procedure Process_Compile_Time_Warning_Or_Error;
+      --  Common processing for Compile_Time_Error and Compile_Time_Warning
+
       procedure Process_Convention (C : out Convention_Id; E : out Entity_Id);
       --  Common procesing for Convention, Interface, Import and Export.
       --  Checks first two arguments of pragma, and sets the appropriate
@@ -1985,6 +1986,78 @@ package body Sem_Prag is
          end if;
       end Process_Atomic_Shared_Volatile;
 
+      -------------------------------------------
+      -- Process_Compile_Time_Warning_Or_Error --
+      -------------------------------------------
+
+      procedure Process_Compile_Time_Warning_Or_Error is
+         Arg1x : constant Node_Id := Get_Pragma_Arg (Arg1);
+
+      begin
+         GNAT_Pragma;
+         Check_Arg_Count (2);
+         Check_No_Identifiers;
+         Check_Arg_Is_Static_Expression (Arg2, Standard_String);
+         Analyze_And_Resolve (Arg1x, Standard_Boolean);
+
+         if Compile_Time_Known_Value (Arg1x) then
+            if Is_True (Expr_Value (Get_Pragma_Arg (Arg1))) then
+               declare
+                  Str   : constant String_Id :=
+                            Strval (Get_Pragma_Arg (Arg2));
+                  Len   : constant Int := String_Length (Str);
+                  Cont  : Boolean;
+                  Ptr   : Nat;
+                  CC    : Char_Code;
+                  C     : Character;
+
+               begin
+                  Cont := False;
+                  Ptr := 1;
+
+                  --  Loop through segments of message separated by line
+                  --  feeds. We output these segments as separate messages
+                  --  with continuation marks for all but the first.
+
+                  loop
+                     Error_Msg_Strlen := 0;
+
+                     --  Loop to copy characters from argument to error
+                     --  message string buffer.
+
+                     loop
+                        exit when Ptr > Len;
+                        CC := Get_String_Char (Str, Ptr);
+                        Ptr := Ptr + 1;
+
+                        --  Ignore wide chars ??? else store character
+
+                        if In_Character_Range (CC) then
+                           C := Get_Character (CC);
+                           exit when C = ASCII.LF;
+                           Error_Msg_Strlen := Error_Msg_Strlen + 1;
+                           Error_Msg_String (Error_Msg_Strlen) := C;
+                        end if;
+                     end loop;
+
+                     --  Here with one line ready to go
+
+                     Error_Msg_Warn := Prag_Id = Pragma_Compile_Time_Warning;
+
+                     if Cont = False then
+                        Error_Msg_N ("<~", Arg1);
+                        Cont := True;
+                     else
+                        Error_Msg_N ("\<~", Arg1);
+                     end if;
+
+                     exit when Ptr > Len;
+                  end loop;
+               end;
+            end if;
+         end if;
+      end Process_Compile_Time_Warning_Or_Error;
+
       ------------------------
       -- Process_Convention --
       ------------------------
@@ -2247,7 +2320,7 @@ package body Sem_Prag is
             --  Treat a pragma Import as an implicit body, for GPS use
 
             if Prag_Id = Pragma_Import then
-                  Generate_Reference (E, Id, 'b');
+               Generate_Reference (E, Id, 'b');
             end if;
 
             E1 := E;
@@ -3175,6 +3248,19 @@ package body Sem_Prag is
             Set_Is_Public (Def_Id);
             Process_Interface_Name (Def_Id, Arg3, Arg4);
 
+         --  Import a CPP class
+
+         elsif Is_Record_Type (Def_Id)
+           and then C = Convention_CPP
+         then
+            if not Is_Tagged_Type (Def_Id) then
+               Error_Msg_Sloc := Sloc (Def_Id);
+               Error_Pragma_Arg ("imported 'C'P'P type must be tagged", Arg2);
+            else
+               Set_Is_CPP_Class (Def_Id);
+               Set_Is_Limited_Record (Def_Id);
+            end if;
+
          else
             Error_Pragma_Arg
               ("second argument of pragma% must be object or subprogram",
@@ -5035,6 +5121,16 @@ package body Sem_Prag is
 
          --  Processing for this pragma is shared with Psect_Object
 
+         ------------------------
+         -- Compile_Time_Error --
+         ------------------------
+
+         --  pragma Compile_Time_Error
+         --    (boolean_EXPRESSION, static_string_EXPRESSION);
+
+         when Pragma_Compile_Time_Error =>
+            Process_Compile_Time_Warning_Or_Error;
+
          --------------------------
          -- Compile_Time_Warning --
          --------------------------
@@ -5042,71 +5138,8 @@ package body Sem_Prag is
          --  pragma Compile_Time_Warning
          --    (boolean_EXPRESSION, static_string_EXPRESSION);
 
-         when Pragma_Compile_Time_Warning => Compile_Time_Warning : declare
-            Arg1x : constant Node_Id := Get_Pragma_Arg (Arg1);
-
-         begin
-            GNAT_Pragma;
-            Check_Arg_Count (2);
-            Check_No_Identifiers;
-            Check_Arg_Is_Static_Expression (Arg2, Standard_String);
-            Analyze_And_Resolve (Arg1x, Standard_Boolean);
-
-            if Compile_Time_Known_Value (Arg1x) then
-               if Is_True (Expr_Value (Get_Pragma_Arg (Arg1))) then
-                  declare
-                     Str   : constant String_Id :=
-                               Strval (Get_Pragma_Arg (Arg2));
-                     Len   : constant Int := String_Length (Str);
-                     Cont  : Boolean;
-                     Ptr   : Nat;
-                     CC    : Char_Code;
-                     C     : Character;
-
-                  begin
-                     Cont := False;
-                     Ptr := 1;
-
-                     --  Loop through segments of message separated by line
-                     --  feeds. We output these segments as separate messages
-                     --  with continuation marks for all but the first.
-
-                     loop
-                        Error_Msg_Strlen := 0;
-
-                        --  Loop to copy characters from argument to error
-                        --  message string buffer.
-
-                        loop
-                           exit when Ptr > Len;
-                           CC := Get_String_Char (Str, Ptr);
-                           Ptr := Ptr + 1;
-
-                           --  Ignore wide chars ??? else store character
-
-                           if In_Character_Range (CC) then
-                              C := Get_Character (CC);
-                              exit when C = ASCII.LF;
-                              Error_Msg_Strlen := Error_Msg_Strlen + 1;
-                              Error_Msg_String (Error_Msg_Strlen) := C;
-                           end if;
-                        end loop;
-
-                        --  Here with one line ready to go
-
-                        if Cont = False then
-                           Error_Msg_N ("?~", Arg1);
-                           Cont := True;
-                        else
-                           Error_Msg_N ("\?~", Arg1);
-                        end if;
-
-                        exit when Ptr > Len;
-                     end loop;
-                  end;
-               end if;
-            end if;
-         end Compile_Time_Warning;
+         when Pragma_Compile_Time_Warning =>
+            Process_Compile_Time_Warning_Or_Error;
 
          -----------------------------
          -- Complete_Representation --
@@ -5346,14 +5379,16 @@ package body Sem_Prag is
          --  pragma CPP_Class ([Entity =>] local_NAME)
 
          when Pragma_CPP_Class => CPP_Class : declare
-            Arg         : Node_Id;
-            Typ         : Entity_Id;
-            Default_DTC : Entity_Id := Empty;
-            VTP_Type    : constant Entity_Id  := RTE (RE_Vtable_Ptr);
-            C           : Entity_Id;
-            Tag_C       : Entity_Id;
+            Arg : Node_Id;
+            Typ : Entity_Id;
 
          begin
+            if Warn_On_Obsolescent_Feature then
+               Error_Msg_N
+                 ("'G'N'A'T pragma cpp'_class is now obsolete; replace it" &
+                  " by pragma import?", N);
+            end if;
+
             GNAT_Pragma;
             Check_Arg_Count (1);
             Check_Optional_Identifier (Arg1, Name_Entity);
@@ -5374,79 +5409,22 @@ package body Sem_Prag is
 
             Typ := Entity (Arg);
 
-            if not Is_Record_Type (Typ) then
-               Error_Pragma_Arg ("pragma% applicable to a record, "
-                 & "tagged record or record extension", Arg1);
-            end if;
-
-            Default_DTC := First_Component (Typ);
-            while Present (Default_DTC)
-              and then Etype (Default_DTC) /= VTP_Type
-            loop
-               Next_Component (Default_DTC);
-            end loop;
-
-            --  Case of non tagged type
-
             if not Is_Tagged_Type (Typ) then
-               Set_Is_CPP_Class (Typ);
-
-               if Present (Default_DTC) then
-                  Error_Pragma_Arg
-                    ("only tagged records can contain vtable pointers", Arg1);
-               end if;
-
-            --  Case of tagged type with no user-defined vtable ptr. In this
-            --  case, because of our C++ ABI compatibility, the programmer
-            --  does not need to specify the tag component.
-
-            elsif Is_Tagged_Type (Typ)
-              and then No (Default_DTC)
-            then
-               Set_Is_CPP_Class (Typ);
-               Set_Is_Limited_Record (Typ);
-
-            --  Tagged type that has a vtable ptr
-
-            elsif Present (Default_DTC) then
-               Set_Is_CPP_Class (Typ);
-               Set_Is_Limited_Record (Typ);
-               Set_Is_Tag (Default_DTC);
-               Set_DT_Entry_Count (Default_DTC, No_Uint);
-
-               --  Since a CPP type has no direct link to its associated tag
-               --  most tags checks cannot be performed
-
-               Set_Kill_Tag_Checks (Typ);
-               Set_Kill_Tag_Checks (Class_Wide_Type (Typ));
-
-               --  Get rid of the _tag component when there was one.
-               --  It is only useful for regular tagged types
-
-               if Expander_Active and then Typ = Root_Type (Typ) then
-
-                  Tag_C := First_Tag_Component (Typ);
-                  C := First_Entity (Typ);
-
-                  if C = Tag_C then
-                     Set_First_Entity (Typ, Next_Entity (Tag_C));
-
-                  else
-                     while Next_Entity (C) /= Tag_C loop
-                        Next_Entity (C);
-                     end loop;
-
-                     Set_Next_Entity (C, Next_Entity (Tag_C));
-                  end if;
-               end if;
+               Error_Pragma_Arg ("pragma% applicable to tagged types ", Arg1);
             end if;
+
+            Set_Is_CPP_Class      (Typ);
+            Set_Is_Limited_Record (Typ);
+            Set_Convention        (Typ, Convention_CPP);
          end CPP_Class;
 
          ---------------------
          -- CPP_Constructor --
          ---------------------
 
-         --  pragma CPP_Constructor ([Entity =>] LOCAL_NAME);
+         --  pragma CPP_Constructor ([Entity =>] LOCAL_NAME
+         --    [, [External_Name =>] static_string_EXPRESSION ]
+         --    [, [Link_Name     =>] static_string_EXPRESSION ]);
 
          when Pragma_CPP_Constructor => CPP_Constructor : declare
             Id     : Entity_Id;
@@ -5454,7 +5432,8 @@ package body Sem_Prag is
 
          begin
             GNAT_Pragma;
-            Check_Arg_Count (1);
+            Check_At_Least_N_Arguments (1);
+            Check_At_Most_N_Arguments (3);
             Check_Optional_Identifier (Arg1, Name_Entity);
             Check_Arg_Is_Local_Name (Arg1);
 
@@ -5473,10 +5452,9 @@ package body Sem_Prag is
               and then Is_Class_Wide_Type (Etype (Def_Id))
               and then Is_CPP_Class (Etype (Etype (Def_Id)))
             then
-               --  What the heck is this??? this pragma allows only 1 arg
-
                if Arg_Count >= 2 then
-                  Check_At_Most_N_Arguments (3);
+                  Set_Imported (Def_Id);
+                  Set_Is_Public (Def_Id);
                   Process_Interface_Name (Def_Id, Arg2, Arg3);
                end if;
 
@@ -5499,119 +5477,12 @@ package body Sem_Prag is
          -- CPP_Virtual --
          -----------------
 
-         --  pragma CPP_Virtual
-         --      [Entity =>]       LOCAL_NAME
-         --    [ [Vtable_Ptr =>]   LOCAL_NAME,
-         --      [Position =>]     static_integer_EXPRESSION]);
-
          when Pragma_CPP_Virtual => CPP_Virtual : declare
-            Arg      : Node_Id;
-            Typ      : Entity_Id;
-            Subp     : Entity_Id;
-            VTP_Type : constant Entity_Id  := RTE (RE_Vtable_Ptr);
-            DTC      : Entity_Id;
-            V        : Uint;
-
          begin
-            GNAT_Pragma;
-            Check_Arg_Order ((Name_Entity, Name_Vtable_Ptr, Name_Position));
-
-            if Arg_Count = 3 then
-               Check_Optional_Identifier (Arg2, Name_Vtable_Ptr);
-
-               --  We allow Entry_Count as well as Position for the third
-               --  parameter for back compatibility with versions of GNAT
-               --  before version 3.12. The documentation has always said
-               --  Position, but the code up to 3.12 said Entry_Count.
-
-               if Chars (Arg3) /= Name_Entry_Count then
-                  Check_Optional_Identifier (Arg3, Name_Position);
-               end if;
-
-            else
-               Check_Arg_Count (1);
-            end if;
-
-            Check_Optional_Identifier (Arg1, Name_Entity);
-            Check_Arg_Is_Local_Name (Arg1);
-
-            --  First argument must be a subprogram name
-
-            Arg := Expression (Arg1);
-            Find_Program_Unit_Name (Arg);
-
-            if Etype (Arg) = Any_Type then
-               return;
-            else
-               Subp := Entity (Arg);
-            end if;
-
-            if not (Is_Subprogram (Subp)
-                     and then Is_Dispatching_Operation (Subp))
-            then
-               Error_Pragma_Arg
-                 ("pragma% must reference a primitive operation", Arg1);
-            end if;
-
-            Typ := Find_Dispatching_Type (Subp);
-
-            --  If only one Argument defaults are :
-            --    . DTC_Entity is the default Vtable pointer
-            --    . DT_Position will be set at the freezing point
-
-            if Arg_Count = 1 then
-               Set_DTC_Entity (Subp, First_Tag_Component (Typ));
-               return;
-            end if;
-
-            --  Second argument is a component name of type Vtable_Ptr
-
-            Arg := Expression (Arg2);
-
-            if Nkind (Arg) /= N_Identifier then
-               Error_Msg_NE ("must be a& component name", Arg, Typ);
-               raise Pragma_Exit;
-            end if;
-
-            DTC := First_Component (Typ);
-            while Present (DTC) and then Chars (DTC) /= Chars (Arg) loop
-               Next_Component (DTC);
-            end loop;
-
-            --  Case of tagged type with no user-defined vtable ptr
-
-            if No (DTC) then
-               Error_Msg_NE ("must be a& component name", Arg, Typ);
-               raise Pragma_Exit;
-
-            elsif Etype (DTC) /= VTP_Type then
-               Wrong_Type (Arg, VTP_Type);
-               return;
-            end if;
-
-            --  Third argument is an integer (DT_Position)
-
-            Arg := Expression (Arg3);
-            Analyze_And_Resolve (Arg, Any_Integer);
-
-            if not Is_Static_Expression (Arg) then
-               Flag_Non_Static_Expr
-                 ("third argument of pragma CPP_Virtual must be static!",
-                  Arg3);
-               raise Pragma_Exit;
-
-            else
-               V := Expr_Value (Expression (Arg3));
-
-               if V <= 0 then
-                  Error_Pragma_Arg
-                    ("third argument of pragma% must be positive",
-                     Arg3);
-
-               else
-                  Set_DTC_Entity (Subp, DTC);
-                  Set_DT_Position (Subp, V);
-               end if;
+            if Warn_On_Obsolescent_Feature then
+               Error_Msg_N
+                 ("'G'N'A'T pragma cpp'_virtual is now obsolete and has " &
+                  "no effect?", N);
             end if;
          end CPP_Virtual;
 
@@ -5619,110 +5490,12 @@ package body Sem_Prag is
          -- CPP_Vtable --
          ----------------
 
-         --  pragma CPP_Vtable (
-         --    [Entity =>]       LOCAL_NAME
-         --    [Vtable_Ptr =>]   LOCAL_NAME,
-         --    [Entry_Count =>]  static_integer_EXPRESSION);
-
          when Pragma_CPP_Vtable => CPP_Vtable : declare
-            Arg      : Node_Id;
-            Typ      : Entity_Id;
-            VTP_Type : constant Entity_Id  := RTE (RE_Vtable_Ptr);
-            DTC      : Entity_Id;
-            V        : Uint;
-            Elmt     : Elmt_Id;
-
          begin
-            GNAT_Pragma;
-            Check_Arg_Order ((Name_Entity, Name_Vtable_Ptr, Name_Entry_Count));
-            Check_Arg_Count (3);
-            Check_Optional_Identifier (Arg1, Name_Entity);
-            Check_Optional_Identifier (Arg2, Name_Vtable_Ptr);
-            Check_Optional_Identifier (Arg3, Name_Entry_Count);
-            Check_Arg_Is_Local_Name (Arg1);
-
-            --  First argument is a record type name
-
-            Arg := Expression (Arg1);
-            Analyze (Arg);
-
-            if Etype (Arg) = Any_Type then
-               return;
-            else
-               Typ := Entity (Arg);
-            end if;
-
-            if not (Is_Tagged_Type (Typ) and then Is_CPP_Class (Typ)) then
-               Error_Pragma_Arg ("'C'P'P_Class tagged type expected", Arg1);
-            end if;
-
-            --  Second argument is a component name of type Vtable_Ptr
-
-            Arg := Expression (Arg2);
-
-            if Nkind (Arg) /= N_Identifier then
-               Error_Msg_NE ("must be a& component name", Arg, Typ);
-               raise Pragma_Exit;
-            end if;
-
-            DTC := First_Component (Typ);
-            while Present (DTC) and then Chars (DTC) /= Chars (Arg) loop
-               Next_Component (DTC);
-            end loop;
-
-            if No (DTC) then
-               Error_Msg_NE ("must be a& component name", Arg, Typ);
-               raise Pragma_Exit;
-
-            elsif Etype (DTC) /= VTP_Type then
-               Wrong_Type (DTC, VTP_Type);
-               return;
-
-            --  If it is the first pragma Vtable, This becomes the default tag
-
-            elsif (not Is_Tag (DTC))
-              and then DT_Entry_Count (First_Tag_Component (Typ)) = No_Uint
-            then
-               Set_Is_Tag (First_Tag_Component (Typ), False);
-               Set_Is_Tag (DTC, True);
-               Set_DT_Entry_Count (DTC, No_Uint);
-            end if;
-
-            --  Those pragmas must appear before any primitive operation
-            --  definition (except inherited ones) otherwise the default
-            --  may be wrong
-
-            Elmt := First_Elmt (Primitive_Operations (Typ));
-            while Present (Elmt) loop
-               if No (Alias (Node (Elmt))) then
-                  Error_Msg_Sloc := Sloc (Node (Elmt));
-                  Error_Pragma
-                    ("pragma% must appear before this primitive operation");
-               end if;
-
-               Next_Elmt (Elmt);
-            end loop;
-
-            --  Third argument is an integer (DT_Entry_Count)
-
-            Arg := Expression (Arg3);
-            Analyze_And_Resolve (Arg, Any_Integer);
-
-            if not Is_Static_Expression (Arg) then
-               Flag_Non_Static_Expr
-                 ("entry count for pragma CPP_Vtable must be a static " &
-                  "expression!", Arg3);
-               raise Pragma_Exit;
-
-            else
-               V := Expr_Value (Expression (Arg3));
-
-               if V <= 0 then
-                  Error_Pragma_Arg
-                    ("entry count for pragma% must be positive", Arg3);
-               else
-                  Set_DT_Entry_Count (DTC, V);
-               end if;
+            if Warn_On_Obsolescent_Feature then
+               Error_Msg_N
+                 ("'G'N'A'T pragma cpp'_vtable is now obsolete and has " &
+                  "no effect?", N);
             end if;
          end CPP_Vtable;
 
@@ -6560,14 +6333,10 @@ package body Sem_Prag is
 
             if Chars (Expression (Arg1)) = Name_On then
                Extensions_Allowed := True;
-               Ada_Version := Ada_Version_Type'Last;
             else
                Extensions_Allowed := False;
-               Ada_Version := Ada_Version_Type'Min (Ada_Version, Ada_95);
             end if;
 
-            Ada_Version_Explicit := Ada_Version;
-
          --------------
          -- External --
          --------------
@@ -7674,7 +7443,7 @@ package body Sem_Prag is
             --  java.lang.Object.Typ and that all primitives of the type
             --  should be declared abstract. ???
 
-            if not Is_Tagged_Type (Typ) or else not Is_Abstract (Typ) then
+            if not Is_Tagged_Type (Typ) or else not Is_Abstract_Type (Typ) then
                Error_Pragma_Arg ("pragma% requires an abstract "
                  & "tagged type", Arg1);
 
@@ -8927,7 +8696,19 @@ package body Sem_Prag is
                end if;
 
                Set_Main_Priority
-                 (Current_Sem_Unit, UI_To_Int (Expr_Value (Arg)));
+                    (Current_Sem_Unit, UI_To_Int (Expr_Value (Arg)));
+
+               --  Load an arbitrary entity from System.Tasking to make sure
+               --  this package is implicitly with'ed, since we need to have
+               --  the tasking run-time active for the pragma Priority to have
+               --  any effect.
+
+               declare
+                  Discard : Entity_Id;
+                  pragma Warnings (Off, Discard);
+               begin
+                  Discard := RTE (RE_Task_List);
+               end;
 
             --  Task or Protected, must be of type Integer
 
@@ -10586,7 +10367,7 @@ package body Sem_Prag is
                Get_Name_String (Chars (Cunitent));
                Set_Casing (Mixed_Case);
                Write_Str (Name_Buffer (1 .. Name_Len));
-               Write_Str (" is not implemented");
+               Write_Str (" is not supported in this configuration");
                Write_Eol;
                raise Unrecoverable_Error;
             end if;
@@ -10709,6 +10490,38 @@ package body Sem_Prag is
             end if;
          end Unreferenced;
 
+         --------------------------
+         -- Unreferenced_Objects --
+         --------------------------
+
+         --  pragma Unreferenced_Objects (local_Name {, local_Name});
+
+         when Pragma_Unreferenced_Objects => Unreferenced_Objects : declare
+            Arg_Node : Node_Id;
+            Arg_Expr : Node_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_At_Least_N_Arguments (1);
+
+            Arg_Node := Arg1;
+            while Present (Arg_Node) loop
+               Check_No_Identifier (Arg_Node);
+               Check_Arg_Is_Local_Name (Arg_Node);
+               Arg_Expr := Get_Pragma_Arg (Arg_Node);
+
+               if not Is_Entity_Name (Arg_Expr)
+                 or else not Is_Type (Entity (Arg_Expr))
+               then
+                  Error_Pragma_Arg
+                    ("argument for pragma% must be type or subtype", Arg_Node);
+               end if;
+
+               Set_Has_Pragma_Unreferenced_Objects (Entity (Arg_Expr));
+               Next (Arg_Node);
+            end loop;
+         end Unreferenced_Objects;
+
          ------------------------------
          -- Unreserve_All_Interrupts --
          ------------------------------
@@ -10862,20 +10675,48 @@ package body Sem_Prag is
                      declare
                         Lit : constant Node_Id   := Expr_Value_S (Argx);
                         Str : constant String_Id := Strval (Lit);
+                        Len : constant Nat       := String_Length (Str);
                         C   : Char_Code;
+                        J   : Nat;
+                        OK  : Boolean;
+                        Chr : Character;
 
                      begin
-                        for J in 1 .. String_Length (Str) loop
+                        J := 1;
+                        while J <= Len loop
                            C := Get_String_Char (Str, J);
+                           OK := In_Character_Range (C);
 
-                           if In_Character_Range (C)
-                             and then Set_Warning_Switch (Get_Character (C))
-                           then
-                              null;
-                           else
+                           if OK then
+                              Chr := Get_Character (C);
+
+                              --  Dot case
+
+                              if J < Len and then Chr = '.' then
+                                 J := J + 1;
+                                 C := Get_String_Char (Str, J);
+                                 Chr := Get_Character (C);
+
+                                 if not Set_Dot_Warning_Switch (Chr) then
+                                    Error_Pragma_Arg
+                                      ("invalid warning switch character " &
+                                       '.' & Chr, Arg1);
+                                 end if;
+
+                              --  Non-Dot case
+
+                              else
+                                 OK := Set_Warning_Switch (Chr);
+                              end if;
+                           end if;
+
+                           if not OK then
                               Error_Pragma_Arg
-                                ("invalid warning switch character", Arg1);
+                                ("invalid warning switch character " & Chr,
+                                 Arg1);
                            end if;
+
+                           J := J + 1;
                         end loop;
                      end;
                   end if;
@@ -10953,7 +10794,7 @@ package body Sem_Prag is
                         if Is_Configuration_Pragma then
                            if Chars (Argx) = Name_On then
                               Error_Pragma
-                                ("pragma Warnings (Off, string) cannot be " &
+                                ("pragma Warnings (On, string) cannot be " &
                                  "used as configuration pragma");
 
                            else
@@ -11178,6 +11019,7 @@ package body Sem_Prag is
       Pragma_C_Pass_By_Copy                =>  0,
       Pragma_Comment                       =>  0,
       Pragma_Common_Object                 => -1,
+      Pragma_Compile_Time_Error            => -1,
       Pragma_Compile_Time_Warning          => -1,
       Pragma_Complete_Representation       =>  0,
       Pragma_Complex_Representation        =>  0,
@@ -11302,6 +11144,7 @@ package body Sem_Prag is
       Pragma_Unimplemented_Unit            => -1,
       Pragma_Universal_Data                => -1,
       Pragma_Unreferenced                  => -1,
+      Pragma_Unreferenced_Objects          => -1,
       Pragma_Unreserve_All_Interrupts      => -1,
       Pragma_Unsuppress                    =>  0,
       Pragma_Use_VADS_Size                 => -1,
index 530f0af..af50d9c 100644 (file)
@@ -392,6 +392,7 @@ package body Sem_Warn is
                      --  or if it is a parameter, to the corresponding spec.
 
                      if Has_Pragma_Unreferenced (E1)
+                       or else Has_Pragma_Unreferenced_Objects (Etype (E1))
                        or else (Is_Formal (E1)
                                   and then Present (Spec_Entity (E1))
                                   and then
@@ -1641,6 +1642,7 @@ package body Sem_Warn is
                   then
                      if Warn_On_Modified_Unread
                        and then not Is_Imported (E)
+                       and then not Is_Return_Object (E)
 
                         --  Suppress message for aliased or renamed variables,
                         --  since there may be other entities that read the
@@ -1658,20 +1660,12 @@ package body Sem_Warn is
                   --  Normal case of neither assigned nor read
 
                   else
-                     --  We suppress the message for limited controlled types,
-                     --  to catch the common design pattern (known as RAII, or
-                     --  Resource Acquisition Is Initialization) which uses
-                     --  such types solely for their initialization and
-                     --  finalization semantics.
-
-                     if Is_Controlled (Etype (E))
-                       and then Is_Limited_Type (Etype (E))
-                     then
-                        null;
+                     --  We suppress the message for types for which a valid
+                     --  pragma Unreferenced_Objects has been given, otherwise
+                     --  we go ahead and give the message.
 
-                     --  Normal case where we want to give message
+                     if not Has_Pragma_Unreferenced_Objects (Etype (E)) then
 
-                     else
                         --  Distinguish renamed case in message
 
                         if Present (Renamed_Object (E))
@@ -1740,6 +1734,26 @@ package body Sem_Warn is
       end loop;
    end Output_Unreferenced_Messages;
 
+   ----------------------------
+   -- Set_Dot_Warning_Switch --
+   ----------------------------
+
+   function Set_Dot_Warning_Switch (C : Character) return Boolean is
+   begin
+      case C is
+         when 'x' =>
+            Warn_On_Non_Local_Exception         := True;
+
+         when 'X' =>
+            Warn_On_Non_Local_Exception         := False;
+
+         when others =>
+            return False;
+      end case;
+
+      return True;
+   end Set_Dot_Warning_Switch;
+
    ------------------------
    -- Set_Warning_Switch --
    ------------------------
@@ -1761,6 +1775,7 @@ package body Sem_Warn is
             Warn_On_Export_Import               := True;
             Warn_On_Modified_Unread             := True;
             Warn_On_No_Value_Assigned           := True;
+            Warn_On_Non_Local_Exception         := True;
             Warn_On_Obsolescent_Feature         := True;
             Warn_On_Questionable_Missing_Parens := True;
             Warn_On_Redundant_Constructs        := True;
@@ -1784,8 +1799,9 @@ package body Sem_Warn is
             Warn_On_Hiding                      := False;
             Warn_On_Modified_Unread             := False;
             Warn_On_No_Value_Assigned           := False;
+            Warn_On_Non_Local_Exception         := False;
             Warn_On_Obsolescent_Feature         := False;
-            Warn_On_Questionable_Missing_Parens := True;
+            Warn_On_Questionable_Missing_Parens := False;
             Warn_On_Redundant_Constructs        := False;
             Warn_On_Unchecked_Conversion        := False;
             Warn_On_Unrecognized_Pragma         := False;
@@ -2409,11 +2425,12 @@ package body Sem_Warn is
    --  Start of processing for Warn_On_Useless_Assignment
 
    begin
-      --  Check if this is a case we want to warn on, a variable with
-      --  the last assignment field set, with warnings enabled, and
-      --  which is not imported or exported.
+      --  Check if this is a case we want to warn on, a variable with the
+      --  last assignment field set, with warnings enabled, and which is
+      --  not imported or exported.
 
       if Ekind (Ent) = E_Variable
+        and then not Is_Return_Object (Ent)
         and then Present (Last_Assignment (Ent))
         and then not Warnings_Off (Ent)
         and then not Has_Pragma_Unreferenced (Ent)
index 25dafaa..efc747c 100644 (file)
@@ -37,9 +37,16 @@ package Sem_Warn is
    --------------------
 
    function Set_Warning_Switch (C : Character) return Boolean;
-   --  This function sets the warning switch or switches corresponding to
-   --  the given character. It is used for processing a -gnatw switch on the
-   --  command line, or a string literal in pragma Warnings.
+   --  This function sets the warning switch or switches corresponding to the
+   --  given character. It is used to process a -gnatw switch on the command
+   --  line, or a character in a string literal in pragma Warnings. Returns
+   --  True for valid warning character C, False for invalid character.
+
+   function Set_Dot_Warning_Switch (C : Character) return Boolean;
+   --  This function sets the warning switch or switches corresponding to the
+   --  given character preceded by a dot. Used to process a -gnatw. switch on
+   --  the command line or .C in a string literal in pragma Warnings. Returns
+   --  True for valid warning character C, False for invalid character.
 
    ------------------------------------------
    -- Routines to Handle Unused References --
index 96ae94a..9981725 100644 (file)
@@ -139,7 +139,7 @@ package body Snames is
      "partition#" &
      "partition_interface#" &
      "ras#" &
-     "call#" &
+     "_call#" &
      "rci_name#" &
      "receiver#" &
      "result#" &
@@ -178,6 +178,7 @@ package body Snames is
      "ada_2005#" &
      "assertion_policy#" &
      "c_pass_by_copy#" &
+     "compile_time_error#" &
      "compile_time_warning#" &
      "component_alignment#" &
      "convention_identifier#" &
@@ -317,6 +318,7 @@ package body Snames is
      "unchecked_union#" &
      "unimplemented_unit#" &
      "unreferenced#" &
+     "unreferenced_objects#" &
      "unreserve_all_interrupts#" &
      "volatile#" &
      "volatile_components#" &
@@ -333,6 +335,7 @@ package body Snames is
      "asm#" &
      "assembly#" &
      "default#" &
+     "c_plus_plus#" &
      "dll#" &
      "win32#" &
      "as_is#" &
@@ -664,13 +667,16 @@ package body Snames is
      "ada_roots#" &
      "archive_builder#" &
      "archive_indexer#" &
+     "archive_suffix#" &
      "binder#" &
      "binder_driver#" &
      "body_suffix#" &
      "builder#" &
+     "builder_switches#" &
      "compiler#" &
      "compiler_driver#" &
      "compiler_kind#" &
+     "compiler_minimum_options#" &
      "compiler_pic_option#" &
      "compute_dependency#" &
      "config_body_file_name#" &
@@ -695,6 +701,7 @@ package body Snames is
      "finder#" &
      "global_compiler_switches#" &
      "global_configuration_pragmas#" &
+     "global_config_file#" &
      "gnatls#" &
      "gnatstub#" &
      "implementation#" &
@@ -707,32 +714,47 @@ package body Snames is
      "language_processing#" &
      "languages#" &
      "library_ali_dir#" &
-     "library_dir#" &
      "library_auto_init#" &
+     "library_auto_init_supported#" &
+     "library_builder#" &
+     "library_dir#" &
      "library_gcc#" &
      "library_interface#" &
      "library_kind#" &
      "library_name#" &
+     "library_major_minor_id_supported#" &
      "library_options#" &
      "library_reference_symbol_file#" &
      "library_src_dir#" &
+     "library_support#" &
      "library_symbol_file#" &
      "library_symbol_policy#" &
      "library_version#" &
+     "library_version_options#" &
      "linker#" &
      "linker_executable_option#" &
      "linker_lib_dir_option#" &
      "linker_lib_name_option#" &
+     "local_config_file#" &
      "local_configuration_pragmas#" &
      "locally_removed_files#" &
      "mapping_file_switches#" &
+     "mapping_spec_suffix#" &
+     "mapping_body_suffix#" &
      "metrics#" &
+     "minimum_binder_options#" &
      "naming#" &
+     "objects_path#" &
+     "objects_path_file#" &
      "object_dir#" &
      "pretty_printer#" &
      "project#" &
      "roots#" &
+     "run_path_option#" &
      "runtime_project#" &
+     "shared_library_minimum_options#" &
+     "shared_library_prefix#" &
+     "shared_library_suffix#" &
      "separate_suffix#" &
      "source_dirs#" &
      "source_files#" &
@@ -742,7 +764,10 @@ package body Snames is
      "specification#" &
      "specification_exceptions#" &
      "specification_suffix#" &
+     "stack#" &
      "switches#" &
+     "symbolic_link_supported#" &
+     "toolchain_version#" &
      "unaligned_valid#" &
      "interface#" &
      "overriding#" &
@@ -976,14 +1001,16 @@ package body Snames is
 
       Convention_Identifiers.Init;
 
-      Convention_Identifiers.Append ((Name_Asm,      Convention_Assembler));
-      Convention_Identifiers.Append ((Name_Assembly, Convention_Assembler));
+      Convention_Identifiers.Append ((Name_Asm,         Convention_Assembler));
+      Convention_Identifiers.Append ((Name_Assembly,    Convention_Assembler));
+
+      Convention_Identifiers.Append ((Name_Default,     Convention_C));
+      Convention_Identifiers.Append ((Name_External,    Convention_C));
 
-      Convention_Identifiers.Append ((Name_Default,  Convention_C));
-      Convention_Identifiers.Append ((Name_External, Convention_C));
+      Convention_Identifiers.Append ((Name_C_Plus_Plus, Convention_CPP));
 
-      Convention_Identifiers.Append ((Name_DLL,      Convention_Stdcall));
-      Convention_Identifiers.Append ((Name_Win32,    Convention_Stdcall));
+      Convention_Identifiers.Append ((Name_DLL,         Convention_Stdcall));
+      Convention_Identifiers.Append ((Name_Win32,       Convention_Stdcall));
    end Initialize;
 
    -----------------------
index 0c6af6e..3ff606e 100644 (file)
@@ -267,7 +267,7 @@ package Snames is
    Name_Partition                      : constant Name_Id := N + 078;
    Name_Partition_Interface            : constant Name_Id := N + 079;
    Name_Ras                            : constant Name_Id := N + 080;
-   Name_Call                           : constant Name_Id := N + 081;
+   Name_uCall                          : constant Name_Id := N + 081;
    Name_RCI_Name                       : constant Name_Id := N + 082;
    Name_Receiver                       : constant Name_Id := N + 083;
    Name_Result                         : constant Name_Id := N + 084;
@@ -339,58 +339,59 @@ package Snames is
    Name_Ada_2005                       : constant Name_Id := N + 117; -- GNAT
    Name_Assertion_Policy               : constant Name_Id := N + 118; -- Ada 05
    Name_C_Pass_By_Copy                 : constant Name_Id := N + 119; -- GNAT
-   Name_Compile_Time_Warning           : constant Name_Id := N + 120; -- GNAT
-   Name_Component_Alignment            : constant Name_Id := N + 121; -- GNAT
-   Name_Convention_Identifier          : constant Name_Id := N + 122; -- GNAT
-   Name_Debug_Policy                   : constant Name_Id := N + 123; -- GNAT
-   Name_Detect_Blocking                : constant Name_Id := N + 124; -- Ada 05
-   Name_Discard_Names                  : constant Name_Id := N + 125;
-   Name_Elaboration_Checks             : constant Name_Id := N + 126; -- GNAT
-   Name_Eliminate                      : constant Name_Id := N + 127; -- GNAT
-   Name_Explicit_Overriding            : constant Name_Id := N + 128; -- Ada 05
-   Name_Extend_System                  : constant Name_Id := N + 129; -- GNAT
-   Name_Extensions_Allowed             : constant Name_Id := N + 130; -- GNAT
-   Name_External_Name_Casing           : constant Name_Id := N + 131; -- GNAT
-   Name_Float_Representation           : constant Name_Id := N + 132; -- GNAT
-   Name_Initialize_Scalars             : constant Name_Id := N + 133; -- GNAT
-   Name_Interrupt_State                : constant Name_Id := N + 134; -- GNAT
-   Name_License                        : constant Name_Id := N + 135; -- GNAT
-   Name_Locking_Policy                 : constant Name_Id := N + 136;
-   Name_Long_Float                     : constant Name_Id := N + 137; -- VMS
-   Name_No_Run_Time                    : constant Name_Id := N + 138; -- GNAT
-   Name_No_Strict_Aliasing             : constant Name_Id := N + 139; -- GNAT
-   Name_Normalize_Scalars              : constant Name_Id := N + 140;
-   Name_Polling                        : constant Name_Id := N + 141; -- GNAT
-   Name_Persistent_BSS                 : constant Name_Id := N + 142; -- GNAT
-   Name_Priority_Specific_Dispatching  : constant Name_Id := N + 143; -- Ada 05
-   Name_Profile                        : constant Name_Id := N + 144; -- Ada 05
-   Name_Profile_Warnings               : constant Name_Id := N + 145; -- GNAT
-   Name_Propagate_Exceptions           : constant Name_Id := N + 146; -- GNAT
-   Name_Queuing_Policy                 : constant Name_Id := N + 147;
-   Name_Ravenscar                      : constant Name_Id := N + 148; -- Ada 05
-   Name_Restricted_Run_Time            : constant Name_Id := N + 149; -- GNAT
-   Name_Restrictions                   : constant Name_Id := N + 150;
-   Name_Restriction_Warnings           : constant Name_Id := N + 151; -- GNAT
-   Name_Reviewable                     : constant Name_Id := N + 152;
-   Name_Source_File_Name               : constant Name_Id := N + 153; -- GNAT
-   Name_Source_File_Name_Project       : constant Name_Id := N + 154; -- GNAT
-   Name_Style_Checks                   : constant Name_Id := N + 155; -- GNAT
-   Name_Suppress                       : constant Name_Id := N + 156;
-   Name_Suppress_Exception_Locations   : constant Name_Id := N + 157; -- GNAT
-   Name_Task_Dispatching_Policy        : constant Name_Id := N + 158;
-   Name_Universal_Data                 : constant Name_Id := N + 159; -- AAMP
-   Name_Unsuppress                     : constant Name_Id := N + 160; -- GNAT
-   Name_Use_VADS_Size                  : constant Name_Id := N + 161; -- GNAT
-   Name_Validity_Checks                : constant Name_Id := N + 162; -- GNAT
-   Name_Warnings                       : constant Name_Id := N + 163; -- GNAT
-   Name_Wide_Character_Encoding        : constant Name_Id := N + 164; -- GNAT
-   Last_Configuration_Pragma_Name      : constant Name_Id := N + 164;
+   Name_Compile_Time_Error             : constant Name_Id := N + 120; -- GNAT
+   Name_Compile_Time_Warning           : constant Name_Id := N + 121; -- GNAT
+   Name_Component_Alignment            : constant Name_Id := N + 122; -- GNAT
+   Name_Convention_Identifier          : constant Name_Id := N + 123; -- GNAT
+   Name_Debug_Policy                   : constant Name_Id := N + 124; -- GNAT
+   Name_Detect_Blocking                : constant Name_Id := N + 125; -- Ada 05
+   Name_Discard_Names                  : constant Name_Id := N + 126;
+   Name_Elaboration_Checks             : constant Name_Id := N + 127; -- GNAT
+   Name_Eliminate                      : constant Name_Id := N + 128; -- GNAT
+   Name_Explicit_Overriding            : constant Name_Id := N + 129; -- Ada 05
+   Name_Extend_System                  : constant Name_Id := N + 130; -- GNAT
+   Name_Extensions_Allowed             : constant Name_Id := N + 131; -- GNAT
+   Name_External_Name_Casing           : constant Name_Id := N + 132; -- GNAT
+   Name_Float_Representation           : constant Name_Id := N + 133; -- GNAT
+   Name_Initialize_Scalars             : constant Name_Id := N + 134; -- GNAT
+   Name_Interrupt_State                : constant Name_Id := N + 135; -- GNAT
+   Name_License                        : constant Name_Id := N + 136; -- GNAT
+   Name_Locking_Policy                 : constant Name_Id := N + 137;
+   Name_Long_Float                     : constant Name_Id := N + 138; -- VMS
+   Name_No_Run_Time                    : constant Name_Id := N + 139; -- GNAT
+   Name_No_Strict_Aliasing             : constant Name_Id := N + 140; -- GNAT
+   Name_Normalize_Scalars              : constant Name_Id := N + 141;
+   Name_Polling                        : constant Name_Id := N + 142; -- GNAT
+   Name_Persistent_BSS                 : constant Name_Id := N + 143; -- GNAT
+   Name_Priority_Specific_Dispatching  : constant Name_Id := N + 144; -- Ada 05
+   Name_Profile                        : constant Name_Id := N + 145; -- Ada 05
+   Name_Profile_Warnings               : constant Name_Id := N + 146; -- GNAT
+   Name_Propagate_Exceptions           : constant Name_Id := N + 147; -- GNAT
+   Name_Queuing_Policy                 : constant Name_Id := N + 148;
+   Name_Ravenscar                      : constant Name_Id := N + 149; -- Ada 05
+   Name_Restricted_Run_Time            : constant Name_Id := N + 150; -- GNAT
+   Name_Restrictions                   : constant Name_Id := N + 151;
+   Name_Restriction_Warnings           : constant Name_Id := N + 152; -- GNAT
+   Name_Reviewable                     : constant Name_Id := N + 153;
+   Name_Source_File_Name               : constant Name_Id := N + 154; -- GNAT
+   Name_Source_File_Name_Project       : constant Name_Id := N + 155; -- GNAT
+   Name_Style_Checks                   : constant Name_Id := N + 156; -- GNAT
+   Name_Suppress                       : constant Name_Id := N + 157;
+   Name_Suppress_Exception_Locations   : constant Name_Id := N + 158; -- GNAT
+   Name_Task_Dispatching_Policy        : constant Name_Id := N + 159;
+   Name_Universal_Data                 : constant Name_Id := N + 160; -- AAMP
+   Name_Unsuppress                     : constant Name_Id := N + 161; -- GNAT
+   Name_Use_VADS_Size                  : constant Name_Id := N + 162; -- GNAT
+   Name_Validity_Checks                : constant Name_Id := N + 163; -- GNAT
+   Name_Warnings                       : constant Name_Id := N + 164; -- GNAT
+   Name_Wide_Character_Encoding        : constant Name_Id := N + 165; -- GNAT
+   Last_Configuration_Pragma_Name      : constant Name_Id := N + 165;
 
    --  Remaining pragma names
 
-   Name_Abort_Defer                    : constant Name_Id := N + 165; -- GNAT
-   Name_All_Calls_Remote               : constant Name_Id := N + 166;
-   Name_Annotate                       : constant Name_Id := N + 167; -- GNAT
+   Name_Abort_Defer                    : constant Name_Id := N + 166; -- GNAT
+   Name_All_Calls_Remote               : constant Name_Id := N + 167;
+   Name_Annotate                       : constant Name_Id := N + 168; -- GNAT
 
    --  Note: AST_Entry is not in this list because its name matches the
    --  name of the corresponding attribute. However, it is included in the
@@ -398,72 +399,72 @@ package Snames is
    --  and Check_Pragma_Id correctly recognize and process Name_AST_Entry.
    --  AST_Entry is a VMS specific pragma.
 
-   Name_Assert                         : constant Name_Id := N + 168; -- Ada 05
-   Name_Asynchronous                   : constant Name_Id := N + 169;
-   Name_Atomic                         : constant Name_Id := N + 170;
-   Name_Atomic_Components              : constant Name_Id := N + 171;
-   Name_Attach_Handler                 : constant Name_Id := N + 172;
-   Name_Comment                        : constant Name_Id := N + 173; -- GNAT
-   Name_Common_Object                  : constant Name_Id := N + 174; -- GNAT
-   Name_Complete_Representation        : constant Name_Id := N + 175; -- GNAT
-   Name_Complex_Representation         : constant Name_Id := N + 176; -- GNAT
-   Name_Controlled                     : constant Name_Id := N + 177;
-   Name_Convention                     : constant Name_Id := N + 178;
-   Name_CPP_Class                      : constant Name_Id := N + 179; -- GNAT
-   Name_CPP_Constructor                : constant Name_Id := N + 180; -- GNAT
-   Name_CPP_Virtual                    : constant Name_Id := N + 181; -- GNAT
-   Name_CPP_Vtable                     : constant Name_Id := N + 182; -- GNAT
-   Name_Debug                          : constant Name_Id := N + 183; -- GNAT
-   Name_Elaborate                      : constant Name_Id := N + 184; -- Ada 83
-   Name_Elaborate_All                  : constant Name_Id := N + 185;
-   Name_Elaborate_Body                 : constant Name_Id := N + 186;
-   Name_Export                         : constant Name_Id := N + 187;
-   Name_Export_Exception               : constant Name_Id := N + 188; -- VMS
-   Name_Export_Function                : constant Name_Id := N + 189; -- GNAT
-   Name_Export_Object                  : constant Name_Id := N + 190; -- GNAT
-   Name_Export_Procedure               : constant Name_Id := N + 191; -- GNAT
-   Name_Export_Value                   : constant Name_Id := N + 192; -- GNAT
-   Name_Export_Valued_Procedure        : constant Name_Id := N + 193; -- GNAT
-   Name_External                       : constant Name_Id := N + 194; -- GNAT
-   Name_Finalize_Storage_Only          : constant Name_Id := N + 195; -- GNAT
-   Name_Ident                          : constant Name_Id := N + 196; -- VMS
-   Name_Import                         : constant Name_Id := N + 197;
-   Name_Import_Exception               : constant Name_Id := N + 198; -- VMS
-   Name_Import_Function                : constant Name_Id := N + 199; -- GNAT
-   Name_Import_Object                  : constant Name_Id := N + 200; -- GNAT
-   Name_Import_Procedure               : constant Name_Id := N + 201; -- GNAT
-   Name_Import_Valued_Procedure        : constant Name_Id := N + 202; -- GNAT
-   Name_Inline                         : constant Name_Id := N + 203;
-   Name_Inline_Always                  : constant Name_Id := N + 204; -- GNAT
-   Name_Inline_Generic                 : constant Name_Id := N + 205; -- GNAT
-   Name_Inspection_Point               : constant Name_Id := N + 206;
-   Name_Interface_Name                 : constant Name_Id := N + 207; -- GNAT
-   Name_Interrupt_Handler              : constant Name_Id := N + 208;
-   Name_Interrupt_Priority             : constant Name_Id := N + 209;
-   Name_Java_Constructor               : constant Name_Id := N + 210; -- GNAT
-   Name_Java_Interface                 : constant Name_Id := N + 211; -- GNAT
-   Name_Keep_Names                     : constant Name_Id := N + 212; -- GNAT
-   Name_Link_With                      : constant Name_Id := N + 213; -- GNAT
-   Name_Linker_Alias                   : constant Name_Id := N + 214; -- GNAT
-   Name_Linker_Constructor             : constant Name_Id := N + 215; -- GNAT
-   Name_Linker_Destructor              : constant Name_Id := N + 216; -- GNAT
-   Name_Linker_Options                 : constant Name_Id := N + 217;
-   Name_Linker_Section                 : constant Name_Id := N + 218; -- GNAT
-   Name_List                           : constant Name_Id := N + 219;
-   Name_Machine_Attribute              : constant Name_Id := N + 220; -- GNAT
-   Name_Main                           : constant Name_Id := N + 221; -- GNAT
-   Name_Main_Storage                   : constant Name_Id := N + 222; -- GNAT
-   Name_Memory_Size                    : constant Name_Id := N + 223; -- Ada 83
-   Name_No_Return                      : constant Name_Id := N + 224; -- GNAT
-   Name_Obsolescent                    : constant Name_Id := N + 225; -- GNAT
-   Name_Optimize                       : constant Name_Id := N + 226;
-   Name_Optional_Overriding            : constant Name_Id := N + 227; -- Ada 05
-   Name_Pack                           : constant Name_Id := N + 228;
-   Name_Page                           : constant Name_Id := N + 229;
-   Name_Passive                        : constant Name_Id := N + 230; -- GNAT
-   Name_Preelaborable_Initialization   : constant Name_Id := N + 231; -- Ada 05
-   Name_Preelaborate                   : constant Name_Id := N + 232;
-   Name_Preelaborate_05                : constant Name_Id := N + 233; -- GNAT
+   Name_Assert                         : constant Name_Id := N + 169; -- Ada 05
+   Name_Asynchronous                   : constant Name_Id := N + 170;
+   Name_Atomic                         : constant Name_Id := N + 171;
+   Name_Atomic_Components              : constant Name_Id := N + 172;
+   Name_Attach_Handler                 : constant Name_Id := N + 173;
+   Name_Comment                        : constant Name_Id := N + 174; -- GNAT
+   Name_Common_Object                  : constant Name_Id := N + 175; -- GNAT
+   Name_Complete_Representation        : constant Name_Id := N + 176; -- GNAT
+   Name_Complex_Representation         : constant Name_Id := N + 177; -- GNAT
+   Name_Controlled                     : constant Name_Id := N + 178;
+   Name_Convention                     : constant Name_Id := N + 179;
+   Name_CPP_Class                      : constant Name_Id := N + 180; -- GNAT
+   Name_CPP_Constructor                : constant Name_Id := N + 181; -- GNAT
+   Name_CPP_Virtual                    : constant Name_Id := N + 182; -- GNAT
+   Name_CPP_Vtable                     : constant Name_Id := N + 183; -- GNAT
+   Name_Debug                          : constant Name_Id := N + 184; -- GNAT
+   Name_Elaborate                      : constant Name_Id := N + 185; -- Ada 83
+   Name_Elaborate_All                  : constant Name_Id := N + 186;
+   Name_Elaborate_Body                 : constant Name_Id := N + 187;
+   Name_Export                         : constant Name_Id := N + 188;
+   Name_Export_Exception               : constant Name_Id := N + 189; -- VMS
+   Name_Export_Function                : constant Name_Id := N + 190; -- GNAT
+   Name_Export_Object                  : constant Name_Id := N + 191; -- GNAT
+   Name_Export_Procedure               : constant Name_Id := N + 192; -- GNAT
+   Name_Export_Value                   : constant Name_Id := N + 193; -- GNAT
+   Name_Export_Valued_Procedure        : constant Name_Id := N + 194; -- GNAT
+   Name_External                       : constant Name_Id := N + 195; -- GNAT
+   Name_Finalize_Storage_Only          : constant Name_Id := N + 196; -- GNAT
+   Name_Ident                          : constant Name_Id := N + 197; -- VMS
+   Name_Import                         : constant Name_Id := N + 198;
+   Name_Import_Exception               : constant Name_Id := N + 199; -- VMS
+   Name_Import_Function                : constant Name_Id := N + 200; -- GNAT
+   Name_Import_Object                  : constant Name_Id := N + 201; -- GNAT
+   Name_Import_Procedure               : constant Name_Id := N + 202; -- GNAT
+   Name_Import_Valued_Procedure        : constant Name_Id := N + 203; -- GNAT
+   Name_Inline                         : constant Name_Id := N + 204;
+   Name_Inline_Always                  : constant Name_Id := N + 205; -- GNAT
+   Name_Inline_Generic                 : constant Name_Id := N + 206; -- GNAT
+   Name_Inspection_Point               : constant Name_Id := N + 207;
+   Name_Interface_Name                 : constant Name_Id := N + 208; -- GNAT
+   Name_Interrupt_Handler              : constant Name_Id := N + 209;
+   Name_Interrupt_Priority             : constant Name_Id := N + 210;
+   Name_Java_Constructor               : constant Name_Id := N + 211; -- GNAT
+   Name_Java_Interface                 : constant Name_Id := N + 212; -- GNAT
+   Name_Keep_Names                     : constant Name_Id := N + 213; -- GNAT
+   Name_Link_With                      : constant Name_Id := N + 214; -- GNAT
+   Name_Linker_Alias                   : constant Name_Id := N + 215; -- GNAT
+   Name_Linker_Constructor             : constant Name_Id := N + 216; -- GNAT
+   Name_Linker_Destructor              : constant Name_Id := N + 217; -- GNAT
+   Name_Linker_Options                 : constant Name_Id := N + 218;
+   Name_Linker_Section                 : constant Name_Id := N + 219; -- GNAT
+   Name_List                           : constant Name_Id := N + 220;
+   Name_Machine_Attribute              : constant Name_Id := N + 221; -- GNAT
+   Name_Main                           : constant Name_Id := N + 222; -- GNAT
+   Name_Main_Storage                   : constant Name_Id := N + 223; -- GNAT
+   Name_Memory_Size                    : constant Name_Id := N + 224; -- Ada 83
+   Name_No_Return                      : constant Name_Id := N + 225; -- GNAT
+   Name_Obsolescent                    : constant Name_Id := N + 226; -- GNAT
+   Name_Optimize                       : constant Name_Id := N + 227;
+   Name_Optional_Overriding            : constant Name_Id := N + 228; -- Ada 05
+   Name_Pack                           : constant Name_Id := N + 229;
+   Name_Page                           : constant Name_Id := N + 230;
+   Name_Passive                        : constant Name_Id := N + 231; -- GNAT
+   Name_Preelaborable_Initialization   : constant Name_Id := N + 232; -- Ada 05
+   Name_Preelaborate                   : constant Name_Id := N + 233;
+   Name_Preelaborate_05                : constant Name_Id := N + 234; -- GNAT
 
    --  Note: Priority is not in this list because its name matches the
    --  name of the corresponding attribute. However, it is included in the
@@ -471,15 +472,15 @@ package Snames is
    --  and Check_Pragma_Id correctly recognize and process Priority.
    --  Priority is a standard Ada 95 pragma.
 
-   Name_Psect_Object                   : constant Name_Id := N + 234; -- VMS
-   Name_Pure                           : constant Name_Id := N + 235;
-   Name_Pure_05                        : constant Name_Id := N + 236; -- GNAT
-   Name_Pure_Function                  : constant Name_Id := N + 237; -- GNAT
-   Name_Remote_Call_Interface          : constant Name_Id := N + 238;
-   Name_Remote_Types                   : constant Name_Id := N + 239;
-   Name_Share_Generic                  : constant Name_Id := N + 240; -- GNAT
-   Name_Shared                         : constant Name_Id := N + 241; -- Ada 83
-   Name_Shared_Passive                 : constant Name_Id := N + 242;
+   Name_Psect_Object                   : constant Name_Id := N + 235; -- VMS
+   Name_Pure                           : constant Name_Id := N + 236;
+   Name_Pure_05                        : constant Name_Id := N + 237; -- GNAT
+   Name_Pure_Function                  : constant Name_Id := N + 238; -- GNAT
+   Name_Remote_Call_Interface          : constant Name_Id := N + 239;
+   Name_Remote_Types                   : constant Name_Id := N + 240;
+   Name_Share_Generic                  : constant Name_Id := N + 241; -- GNAT
+   Name_Shared                         : constant Name_Id := N + 242; -- Ada 83
+   Name_Shared_Passive                 : constant Name_Id := N + 243;
 
    --  Note: Storage_Size is not in this list because its name matches the
    --  name of the corresponding attribute. However, it is included in the
@@ -489,27 +490,28 @@ package Snames is
    --  Note: Storage_Unit is also omitted from the list because of a clash
    --  with an attribute name, and is treated similarly.
 
-   Name_Source_Reference               : constant Name_Id := N + 243; -- GNAT
-   Name_Stream_Convert                 : constant Name_Id := N + 244; -- GNAT
-   Name_Subtitle                       : constant Name_Id := N + 245; -- GNAT
-   Name_Suppress_All                   : constant Name_Id := N + 246; -- GNAT
-   Name_Suppress_Debug_Info            : constant Name_Id := N + 247; -- GNAT
-   Name_Suppress_Initialization        : constant Name_Id := N + 248; -- GNAT
-   Name_System_Name                    : constant Name_Id := N + 249; -- Ada 83
-   Name_Task_Info                      : constant Name_Id := N + 250; -- GNAT
-   Name_Task_Name                      : constant Name_Id := N + 251; -- GNAT
-   Name_Task_Storage                   : constant Name_Id := N + 252; -- VMS
-   Name_Thread_Body                    : constant Name_Id := N + 253; -- GNAT
-   Name_Time_Slice                     : constant Name_Id := N + 254; -- GNAT
-   Name_Title                          : constant Name_Id := N + 255; -- GNAT
-   Name_Unchecked_Union                : constant Name_Id := N + 256; -- GNAT
-   Name_Unimplemented_Unit             : constant Name_Id := N + 257; -- GNAT
-   Name_Unreferenced                   : constant Name_Id := N + 258; -- GNAT
-   Name_Unreserve_All_Interrupts       : constant Name_Id := N + 259; -- GNAT
-   Name_Volatile                       : constant Name_Id := N + 260;
-   Name_Volatile_Components            : constant Name_Id := N + 261;
-   Name_Weak_External                  : constant Name_Id := N + 262; -- GNAT
-   Last_Pragma_Name                    : constant Name_Id := N + 262;
+   Name_Source_Reference               : constant Name_Id := N + 244; -- GNAT
+   Name_Stream_Convert                 : constant Name_Id := N + 245; -- GNAT
+   Name_Subtitle                       : constant Name_Id := N + 246; -- GNAT
+   Name_Suppress_All                   : constant Name_Id := N + 247; -- GNAT
+   Name_Suppress_Debug_Info            : constant Name_Id := N + 248; -- GNAT
+   Name_Suppress_Initialization        : constant Name_Id := N + 249; -- GNAT
+   Name_System_Name                    : constant Name_Id := N + 250; -- Ada 83
+   Name_Task_Info                      : constant Name_Id := N + 251; -- GNAT
+   Name_Task_Name                      : constant Name_Id := N + 252; -- GNAT
+   Name_Task_Storage                   : constant Name_Id := N + 253; -- VMS
+   Name_Thread_Body                    : constant Name_Id := N + 254; -- GNAT
+   Name_Time_Slice                     : constant Name_Id := N + 255; -- GNAT
+   Name_Title                          : constant Name_Id := N + 256; -- GNAT
+   Name_Unchecked_Union                : constant Name_Id := N + 257; -- GNAT
+   Name_Unimplemented_Unit             : constant Name_Id := N + 258; -- GNAT
+   Name_Unreferenced                   : constant Name_Id := N + 259; -- GNAT
+   Name_Unreferenced_Objects           : constant Name_Id := N + 260; -- GNAT
+   Name_Unreserve_All_Interrupts       : constant Name_Id := N + 261; -- GNAT
+   Name_Volatile                       : constant Name_Id := N + 262;
+   Name_Volatile_Components            : constant Name_Id := N + 263;
+   Name_Weak_External                  : constant Name_Id := N + 264; -- GNAT
+   Last_Pragma_Name                    : constant Name_Id := N + 264;
 
    --  Language convention names for pragma Convention/Export/Import/Interface
    --  Note that Name_C is not included in this list, since it was already
@@ -520,114 +522,118 @@ package Snames is
    --  Entry and Protected, this is because these conventions cannot be
    --  specified by a pragma.
 
-   First_Convention_Name               : constant Name_Id := N + 263;
-   Name_Ada                            : constant Name_Id := N + 263;
-   Name_Assembler                      : constant Name_Id := N + 264;
-   Name_COBOL                          : constant Name_Id := N + 265;
-   Name_CPP                            : constant Name_Id := N + 266;
-   Name_Fortran                        : constant Name_Id := N + 267;
-   Name_Intrinsic                      : constant Name_Id := N + 268;
-   Name_Java                           : constant Name_Id := N + 269;
-   Name_Stdcall                        : constant Name_Id := N + 270;
-   Name_Stubbed                        : constant Name_Id := N + 271;
-   Last_Convention_Name                : constant Name_Id := N + 271;
+   First_Convention_Name               : constant Name_Id := N + 265;
+   Name_Ada                            : constant Name_Id := N + 265;
+   Name_Assembler                      : constant Name_Id := N + 266;
+   Name_COBOL                          : constant Name_Id := N + 267;
+   Name_CPP                            : constant Name_Id := N + 268;
+   Name_Fortran                        : constant Name_Id := N + 269;
+   Name_Intrinsic                      : constant Name_Id := N + 270;
+   Name_Java                           : constant Name_Id := N + 271;
+   Name_Stdcall                        : constant Name_Id := N + 272;
+   Name_Stubbed                        : constant Name_Id := N + 273;
+   Last_Convention_Name                : constant Name_Id := N + 273;
 
    --  The following names are preset as synonyms for Assembler
 
-   Name_Asm                            : constant Name_Id := N + 272;
-   Name_Assembly                       : constant Name_Id := N + 273;
+   Name_Asm                            : constant Name_Id := N + 274;
+   Name_Assembly                       : constant Name_Id := N + 275;
 
    --  The following names are preset as synonyms for C
 
-   Name_Default                        : constant Name_Id := N + 274;
+   Name_Default                        : constant Name_Id := N + 276;
    --  Name_Exernal (previously defined as pragma)
 
+   --  The following names are preset as synonyms for CPP
+
+   Name_C_Plus_Plus                    : constant Name_Id := N + 277;
+
    --  The following names are present as synonyms for Stdcall
 
-   Name_DLL                            : constant Name_Id := N + 275;
-   Name_Win32                          : constant Name_Id := N + 276;
+   Name_DLL                            : constant Name_Id := N + 278;
+   Name_Win32                          : constant Name_Id := N + 279;
 
    --  Other special names used in processing pragmas
 
-   Name_As_Is                          : constant Name_Id := N + 277;
-   Name_Attribute_Name                 : constant Name_Id := N + 278;
-   Name_Body_File_Name                 : constant Name_Id := N + 279;
-   Name_Boolean_Entry_Barriers         : constant Name_Id := N + 280;
-   Name_Check                          : constant Name_Id := N + 281;
-   Name_Casing                         : constant Name_Id := N + 282;
-   Name_Code                           : constant Name_Id := N + 283;
-   Name_Component                      : constant Name_Id := N + 284;
-   Name_Component_Size_4               : constant Name_Id := N + 285;
-   Name_Copy                           : constant Name_Id := N + 286;
-   Name_D_Float                        : constant Name_Id := N + 287;
-   Name_Descriptor                     : constant Name_Id := N + 288;
-   Name_Dot_Replacement                : constant Name_Id := N + 289;
-   Name_Dynamic                        : constant Name_Id := N + 290;
-   Name_Entity                         : constant Name_Id := N + 291;
-   Name_Entry_Count                    : constant Name_Id := N + 292;
-   Name_External_Name                  : constant Name_Id := N + 293;
-   Name_First_Optional_Parameter       : constant Name_Id := N + 294;
-   Name_Form                           : constant Name_Id := N + 295;
-   Name_G_Float                        : constant Name_Id := N + 296;
-   Name_Gcc                            : constant Name_Id := N + 297;
-   Name_Gnat                           : constant Name_Id := N + 298;
-   Name_GPL                            : constant Name_Id := N + 299;
-   Name_IEEE_Float                     : constant Name_Id := N + 300;
-   Name_Ignore                         : constant Name_Id := N + 301;
-   Name_Info                           : constant Name_Id := N + 302;
-   Name_Internal                       : constant Name_Id := N + 303;
-   Name_Link_Name                      : constant Name_Id := N + 304;
-   Name_Lowercase                      : constant Name_Id := N + 305;
-   Name_Max_Entry_Queue_Depth          : constant Name_Id := N + 306;
-   Name_Max_Entry_Queue_Length         : constant Name_Id := N + 307;
-   Name_Max_Size                       : constant Name_Id := N + 308;
-   Name_Mechanism                      : constant Name_Id := N + 309;
-   Name_Message                        : constant Name_Id := N + 310;
-   Name_Mixedcase                      : constant Name_Id := N + 311;
-   Name_Modified_GPL                   : constant Name_Id := N + 312;
-   Name_Name                           : constant Name_Id := N + 313;
-   Name_NCA                            : constant Name_Id := N + 314;
-   Name_No                             : constant Name_Id := N + 315;
-   Name_No_Dependence                  : constant Name_Id := N + 316;
-   Name_No_Dynamic_Attachment          : constant Name_Id := N + 317;
-   Name_No_Dynamic_Interrupts          : constant Name_Id := N + 318;
-   Name_No_Requeue                     : constant Name_Id := N + 319;
-   Name_No_Requeue_Statements          : constant Name_Id := N + 320;
-   Name_No_Task_Attributes             : constant Name_Id := N + 321;
-   Name_No_Task_Attributes_Package     : constant Name_Id := N + 322;
-   Name_On                             : constant Name_Id := N + 323;
-   Name_Parameter_Types                : constant Name_Id := N + 324;
-   Name_Reference                      : constant Name_Id := N + 325;
-   Name_Restricted                     : constant Name_Id := N + 326;
-   Name_Result_Mechanism               : constant Name_Id := N + 327;
-   Name_Result_Type                    : constant Name_Id := N + 328;
-   Name_Runtime                        : constant Name_Id := N + 329;
-   Name_SB                             : constant Name_Id := N + 330;
-   Name_Secondary_Stack_Size           : constant Name_Id := N + 331;
-   Name_Section                        : constant Name_Id := N + 332;
-   Name_Semaphore                      : constant Name_Id := N + 333;
-   Name_Simple_Barriers                : constant Name_Id := N + 334;
-   Name_Spec_File_Name                 : constant Name_Id := N + 335;
-   Name_State                          : constant Name_Id := N + 336;
-   Name_Static                         : constant Name_Id := N + 337;
-   Name_Stack_Size                     : constant Name_Id := N + 338;
-   Name_Subunit_File_Name              : constant Name_Id := N + 339;
-   Name_Task_Stack_Size_Default        : constant Name_Id := N + 340;
-   Name_Task_Type                      : constant Name_Id := N + 341;
-   Name_Time_Slicing_Enabled           : constant Name_Id := N + 342;
-   Name_Top_Guard                      : constant Name_Id := N + 343;
-   Name_UBA                            : constant Name_Id := N + 344;
-   Name_UBS                            : constant Name_Id := N + 345;
-   Name_UBSB                           : constant Name_Id := N + 346;
-   Name_Unit_Name                      : constant Name_Id := N + 347;
-   Name_Unknown                        : constant Name_Id := N + 348;
-   Name_Unrestricted                   : constant Name_Id := N + 349;
-   Name_Uppercase                      : constant Name_Id := N + 350;
-   Name_User                           : constant Name_Id := N + 351;
-   Name_VAX_Float                      : constant Name_Id := N + 352;
-   Name_VMS                            : constant Name_Id := N + 353;
-   Name_Vtable_Ptr                     : constant Name_Id := N + 354;
-   Name_Working_Storage                : constant Name_Id := N + 355;
+   Name_As_Is                          : constant Name_Id := N + 280;
+   Name_Attribute_Name                 : constant Name_Id := N + 281;
+   Name_Body_File_Name                 : constant Name_Id := N + 282;
+   Name_Boolean_Entry_Barriers         : constant Name_Id := N + 283;
+   Name_Check                          : constant Name_Id := N + 284;
+   Name_Casing                         : constant Name_Id := N + 285;
+   Name_Code                           : constant Name_Id := N + 286;
+   Name_Component                      : constant Name_Id := N + 287;
+   Name_Component_Size_4               : constant Name_Id := N + 288;
+   Name_Copy                           : constant Name_Id := N + 289;
+   Name_D_Float                        : constant Name_Id := N + 290;
+   Name_Descriptor                     : constant Name_Id := N + 291;
+   Name_Dot_Replacement                : constant Name_Id := N + 292;
+   Name_Dynamic                        : constant Name_Id := N + 293;
+   Name_Entity                         : constant Name_Id := N + 294;
+   Name_Entry_Count                    : constant Name_Id := N + 295;
+   Name_External_Name                  : constant Name_Id := N + 296;
+   Name_First_Optional_Parameter       : constant Name_Id := N + 297;
+   Name_Form                           : constant Name_Id := N + 298;
+   Name_G_Float                        : constant Name_Id := N + 299;
+   Name_Gcc                            : constant Name_Id := N + 300;
+   Name_Gnat                           : constant Name_Id := N + 301;
+   Name_GPL                            : constant Name_Id := N + 302;
+   Name_IEEE_Float                     : constant Name_Id := N + 303;
+   Name_Ignore                         : constant Name_Id := N + 304;
+   Name_Info                           : constant Name_Id := N + 305;
+   Name_Internal                       : constant Name_Id := N + 306;
+   Name_Link_Name                      : constant Name_Id := N + 307;
+   Name_Lowercase                      : constant Name_Id := N + 308;
+   Name_Max_Entry_Queue_Depth          : constant Name_Id := N + 309;
+   Name_Max_Entry_Queue_Length         : constant Name_Id := N + 310;
+   Name_Max_Size                       : constant Name_Id := N + 311;
+   Name_Mechanism                      : constant Name_Id := N + 312;
+   Name_Message                        : constant Name_Id := N + 313;
+   Name_Mixedcase                      : constant Name_Id := N + 314;
+   Name_Modified_GPL                   : constant Name_Id := N + 315;
+   Name_Name                           : constant Name_Id := N + 316;
+   Name_NCA                            : constant Name_Id := N + 317;
+   Name_No                             : constant Name_Id := N + 318;
+   Name_No_Dependence                  : constant Name_Id := N + 319;
+   Name_No_Dynamic_Attachment          : constant Name_Id := N + 320;
+   Name_No_Dynamic_Interrupts          : constant Name_Id := N + 321;
+   Name_No_Requeue                     : constant Name_Id := N + 322;
+   Name_No_Requeue_Statements          : constant Name_Id := N + 323;
+   Name_No_Task_Attributes             : constant Name_Id := N + 324;
+   Name_No_Task_Attributes_Package     : constant Name_Id := N + 325;
+   Name_On                             : constant Name_Id := N + 326;
+   Name_Parameter_Types                : constant Name_Id := N + 327;
+   Name_Reference                      : constant Name_Id := N + 328;
+   Name_Restricted                     : constant Name_Id := N + 329;
+   Name_Result_Mechanism               : constant Name_Id := N + 330;
+   Name_Result_Type                    : constant Name_Id := N + 331;
+   Name_Runtime                        : constant Name_Id := N + 332;
+   Name_SB                             : constant Name_Id := N + 333;
+   Name_Secondary_Stack_Size           : constant Name_Id := N + 334;
+   Name_Section                        : constant Name_Id := N + 335;
+   Name_Semaphore                      : constant Name_Id := N + 336;
+   Name_Simple_Barriers                : constant Name_Id := N + 337;
+   Name_Spec_File_Name                 : constant Name_Id := N + 338;
+   Name_State                          : constant Name_Id := N + 339;
+   Name_Static                         : constant Name_Id := N + 340;
+   Name_Stack_Size                     : constant Name_Id := N + 341;
+   Name_Subunit_File_Name              : constant Name_Id := N + 342;
+   Name_Task_Stack_Size_Default        : constant Name_Id := N + 343;
+   Name_Task_Type                      : constant Name_Id := N + 344;
+   Name_Time_Slicing_Enabled           : constant Name_Id := N + 345;
+   Name_Top_Guard                      : constant Name_Id := N + 346;
+   Name_UBA                            : constant Name_Id := N + 347;
+   Name_UBS                            : constant Name_Id := N + 348;
+   Name_UBSB                           : constant Name_Id := N + 349;
+   Name_Unit_Name                      : constant Name_Id := N + 350;
+   Name_Unknown                        : constant Name_Id := N + 351;
+   Name_Unrestricted                   : constant Name_Id := N + 352;
+   Name_Uppercase                      : constant Name_Id := N + 353;
+   Name_User                           : constant Name_Id := N + 354;
+   Name_VAX_Float                      : constant Name_Id := N + 355;
+   Name_VMS                            : constant Name_Id := N + 356;
+   Name_Vtable_Ptr                     : constant Name_Id := N + 357;
+   Name_Working_Storage                : constant Name_Id := N + 358;
 
    --  Names of recognized attributes. The entries with the comment "Ada 83"
    --  are attributes that are defined in Ada 83, but not in Ada 95. These
@@ -641,168 +647,168 @@ package Snames is
    --  The entries marked VMS are recognized only in OpenVMS implementations
    --  of GNAT, and are treated as illegal in all other contexts.
 
-   First_Attribute_Name                : constant Name_Id := N + 356;
-   Name_Abort_Signal                   : constant Name_Id := N + 356; -- GNAT
-   Name_Access                         : constant Name_Id := N + 357;
-   Name_Address                        : constant Name_Id := N + 358;
-   Name_Address_Size                   : constant Name_Id := N + 359; -- GNAT
-   Name_Aft                            : constant Name_Id := N + 360;
-   Name_Alignment                      : constant Name_Id := N + 361;
-   Name_Asm_Input                      : constant Name_Id := N + 362; -- GNAT
-   Name_Asm_Output                     : constant Name_Id := N + 363; -- GNAT
-   Name_AST_Entry                      : constant Name_Id := N + 364; -- VMS
-   Name_Bit                            : constant Name_Id := N + 365; -- GNAT
-   Name_Bit_Order                      : constant Name_Id := N + 366;
-   Name_Bit_Position                   : constant Name_Id := N + 367; -- GNAT
-   Name_Body_Version                   : constant Name_Id := N + 368;
-   Name_Callable                       : constant Name_Id := N + 369;
-   Name_Caller                         : constant Name_Id := N + 370;
-   Name_Code_Address                   : constant Name_Id := N + 371; -- GNAT
-   Name_Component_Size                 : constant Name_Id := N + 372;
-   Name_Compose                        : constant Name_Id := N + 373;
-   Name_Constrained                    : constant Name_Id := N + 374;
-   Name_Count                          : constant Name_Id := N + 375;
-   Name_Default_Bit_Order              : constant Name_Id := N + 376; -- GNAT
-   Name_Definite                       : constant Name_Id := N + 377;
-   Name_Delta                          : constant Name_Id := N + 378;
-   Name_Denorm                         : constant Name_Id := N + 379;
-   Name_Digits                         : constant Name_Id := N + 380;
-   Name_Elaborated                     : constant Name_Id := N + 381; -- GNAT
-   Name_Emax                           : constant Name_Id := N + 382; -- Ada 83
-   Name_Enum_Rep                       : constant Name_Id := N + 383; -- GNAT
-   Name_Epsilon                        : constant Name_Id := N + 384; -- Ada 83
-   Name_Exponent                       : constant Name_Id := N + 385;
-   Name_External_Tag                   : constant Name_Id := N + 386;
-   Name_First                          : constant Name_Id := N + 387;
-   Name_First_Bit                      : constant Name_Id := N + 388;
-   Name_Fixed_Value                    : constant Name_Id := N + 389; -- GNAT
-   Name_Fore                           : constant Name_Id := N + 390;
-   Name_Has_Access_Values              : constant Name_Id := N + 391; -- GNAT
-   Name_Has_Discriminants              : constant Name_Id := N + 392; -- GNAT
-   Name_Identity                       : constant Name_Id := N + 393;
-   Name_Img                            : constant Name_Id := N + 394; -- GNAT
-   Name_Integer_Value                  : constant Name_Id := N + 395; -- GNAT
-   Name_Large                          : constant Name_Id := N + 396; -- Ada 83
-   Name_Last                           : constant Name_Id := N + 397;
-   Name_Last_Bit                       : constant Name_Id := N + 398;
-   Name_Leading_Part                   : constant Name_Id := N + 399;
-   Name_Length                         : constant Name_Id := N + 400;
-   Name_Machine_Emax                   : constant Name_Id := N + 401;
-   Name_Machine_Emin                   : constant Name_Id := N + 402;
-   Name_Machine_Mantissa               : constant Name_Id := N + 403;
-   Name_Machine_Overflows              : constant Name_Id := N + 404;
-   Name_Machine_Radix                  : constant Name_Id := N + 405;
-   Name_Machine_Rounding               : constant Name_Id := N + 406; -- Ada 05
-   Name_Machine_Rounds                 : constant Name_Id := N + 407;
-   Name_Machine_Size                   : constant Name_Id := N + 408; -- GNAT
-   Name_Mantissa                       : constant Name_Id := N + 409; -- Ada 83
-   Name_Max_Size_In_Storage_Elements   : constant Name_Id := N + 410;
-   Name_Maximum_Alignment              : constant Name_Id := N + 411; -- GNAT
-   Name_Mechanism_Code                 : constant Name_Id := N + 412; -- GNAT
-   Name_Mod                            : constant Name_Id := N + 413;
-   Name_Model_Emin                     : constant Name_Id := N + 414;
-   Name_Model_Epsilon                  : constant Name_Id := N + 415;
-   Name_Model_Mantissa                 : constant Name_Id := N + 416;
-   Name_Model_Small                    : constant Name_Id := N + 417;
-   Name_Modulus                        : constant Name_Id := N + 418;
-   Name_Null_Parameter                 : constant Name_Id := N + 419; -- GNAT
-   Name_Object_Size                    : constant Name_Id := N + 420; -- GNAT
-   Name_Partition_ID                   : constant Name_Id := N + 421;
-   Name_Passed_By_Reference            : constant Name_Id := N + 422; -- GNAT
-   Name_Pool_Address                   : constant Name_Id := N + 423;
-   Name_Pos                            : constant Name_Id := N + 424;
-   Name_Position                       : constant Name_Id := N + 425;
-   Name_Priority                       : constant Name_Id := N + 426; -- Ada 05
-   Name_Range                          : constant Name_Id := N + 427;
-   Name_Range_Length                   : constant Name_Id := N + 428; -- GNAT
-   Name_Round                          : constant Name_Id := N + 429;
-   Name_Safe_Emax                      : constant Name_Id := N + 430; -- Ada 83
-   Name_Safe_First                     : constant Name_Id := N + 431;
-   Name_Safe_Large                     : constant Name_Id := N + 432; -- Ada 83
-   Name_Safe_Last                      : constant Name_Id := N + 433;
-   Name_Safe_Small                     : constant Name_Id := N + 434; -- Ada 83
-   Name_Scale                          : constant Name_Id := N + 435;
-   Name_Scaling                        : constant Name_Id := N + 436;
-   Name_Signed_Zeros                   : constant Name_Id := N + 437;
-   Name_Size                           : constant Name_Id := N + 438;
-   Name_Small                          : constant Name_Id := N + 439;
-   Name_Storage_Size                   : constant Name_Id := N + 440;
-   Name_Storage_Unit                   : constant Name_Id := N + 441; -- GNAT
-   Name_Stream_Size                    : constant Name_Id := N + 442; -- Ada 05
-   Name_Tag                            : constant Name_Id := N + 443;
-   Name_Target_Name                    : constant Name_Id := N + 444; -- GNAT
-   Name_Terminated                     : constant Name_Id := N + 445;
-   Name_To_Address                     : constant Name_Id := N + 446; -- GNAT
-   Name_Type_Class                     : constant Name_Id := N + 447; -- GNAT
-   Name_UET_Address                    : constant Name_Id := N + 448; -- GNAT
-   Name_Unbiased_Rounding              : constant Name_Id := N + 449;
-   Name_Unchecked_Access               : constant Name_Id := N + 450;
-   Name_Unconstrained_Array            : constant Name_Id := N + 451;
-   Name_Universal_Literal_String       : constant Name_Id := N + 452; -- GNAT
-   Name_Unrestricted_Access            : constant Name_Id := N + 453; -- GNAT
-   Name_VADS_Size                      : constant Name_Id := N + 454; -- GNAT
-   Name_Val                            : constant Name_Id := N + 455;
-   Name_Valid                          : constant Name_Id := N + 456;
-   Name_Value_Size                     : constant Name_Id := N + 457; -- GNAT
-   Name_Version                        : constant Name_Id := N + 458;
-   Name_Wchar_T_Size                   : constant Name_Id := N + 459; -- GNAT
-   Name_Wide_Wide_Width                : constant Name_Id := N + 460; -- Ada 05
-   Name_Wide_Width                     : constant Name_Id := N + 461;
-   Name_Width                          : constant Name_Id := N + 462;
-   Name_Word_Size                      : constant Name_Id := N + 463; -- GNAT
+   First_Attribute_Name                : constant Name_Id := N + 359;
+   Name_Abort_Signal                   : constant Name_Id := N + 359; -- GNAT
+   Name_Access                         : constant Name_Id := N + 360;
+   Name_Address                        : constant Name_Id := N + 361;
+   Name_Address_Size                   : constant Name_Id := N + 362; -- GNAT
+   Name_Aft                            : constant Name_Id := N + 363;
+   Name_Alignment                      : constant Name_Id := N + 364;
+   Name_Asm_Input                      : constant Name_Id := N + 365; -- GNAT
+   Name_Asm_Output                     : constant Name_Id := N + 366; -- GNAT
+   Name_AST_Entry                      : constant Name_Id := N + 367; -- VMS
+   Name_Bit                            : constant Name_Id := N + 368; -- GNAT
+   Name_Bit_Order                      : constant Name_Id := N + 369;
+   Name_Bit_Position                   : constant Name_Id := N + 370; -- GNAT
+   Name_Body_Version                   : constant Name_Id := N + 371;
+   Name_Callable                       : constant Name_Id := N + 372;
+   Name_Caller                         : constant Name_Id := N + 373;
+   Name_Code_Address                   : constant Name_Id := N + 374; -- GNAT
+   Name_Component_Size                 : constant Name_Id := N + 375;
+   Name_Compose                        : constant Name_Id := N + 376;
+   Name_Constrained                    : constant Name_Id := N + 377;
+   Name_Count                          : constant Name_Id := N + 378;
+   Name_Default_Bit_Order              : constant Name_Id := N + 379; -- GNAT
+   Name_Definite                       : constant Name_Id := N + 380;
+   Name_Delta                          : constant Name_Id := N + 381;
+   Name_Denorm                         : constant Name_Id := N + 382;
+   Name_Digits                         : constant Name_Id := N + 383;
+   Name_Elaborated                     : constant Name_Id := N + 384; -- GNAT
+   Name_Emax                           : constant Name_Id := N + 385; -- Ada 83
+   Name_Enum_Rep                       : constant Name_Id := N + 386; -- GNAT
+   Name_Epsilon                        : constant Name_Id := N + 387; -- Ada 83
+   Name_Exponent                       : constant Name_Id := N + 388;
+   Name_External_Tag                   : constant Name_Id := N + 389;
+   Name_First                          : constant Name_Id := N + 390;
+   Name_First_Bit                      : constant Name_Id := N + 391;
+   Name_Fixed_Value                    : constant Name_Id := N + 392; -- GNAT
+   Name_Fore                           : constant Name_Id := N + 393;
+   Name_Has_Access_Values              : constant Name_Id := N + 394; -- GNAT
+   Name_Has_Discriminants              : constant Name_Id := N + 395; -- GNAT
+   Name_Identity                       : constant Name_Id := N + 396;
+   Name_Img                            : constant Name_Id := N + 397; -- GNAT
+   Name_Integer_Value                  : constant Name_Id := N + 398; -- GNAT
+   Name_Large                          : constant Name_Id := N + 399; -- Ada 83
+   Name_Last                           : constant Name_Id := N + 400;
+   Name_Last_Bit                       : constant Name_Id := N + 401;
+   Name_Leading_Part                   : constant Name_Id := N + 402;
+   Name_Length                         : constant Name_Id := N + 403;
+   Name_Machine_Emax                   : constant Name_Id := N + 404;
+   Name_Machine_Emin                   : constant Name_Id := N + 405;
+   Name_Machine_Mantissa               : constant Name_Id := N + 406;
+   Name_Machine_Overflows              : constant Name_Id := N + 407;
+   Name_Machine_Radix                  : constant Name_Id := N + 408;
+   Name_Machine_Rounding               : constant Name_Id := N + 409; -- Ada 05
+   Name_Machine_Rounds                 : constant Name_Id := N + 410;
+   Name_Machine_Size                   : constant Name_Id := N + 411; -- GNAT
+   Name_Mantissa                       : constant Name_Id := N + 412; -- Ada 83
+   Name_Max_Size_In_Storage_Elements   : constant Name_Id := N + 413;
+   Name_Maximum_Alignment              : constant Name_Id := N + 414; -- GNAT
+   Name_Mechanism_Code                 : constant Name_Id := N + 415; -- GNAT
+   Name_Mod                            : constant Name_Id := N + 416;
+   Name_Model_Emin                     : constant Name_Id := N + 417;
+   Name_Model_Epsilon                  : constant Name_Id := N + 418;
+   Name_Model_Mantissa                 : constant Name_Id := N + 419;
+   Name_Model_Small                    : constant Name_Id := N + 420;
+   Name_Modulus                        : constant Name_Id := N + 421;
+   Name_Null_Parameter                 : constant Name_Id := N + 422; -- GNAT
+   Name_Object_Size                    : constant Name_Id := N + 423; -- GNAT
+   Name_Partition_ID                   : constant Name_Id := N + 424;
+   Name_Passed_By_Reference            : constant Name_Id := N + 425; -- GNAT
+   Name_Pool_Address                   : constant Name_Id := N + 426;
+   Name_Pos                            : constant Name_Id := N + 427;
+   Name_Position                       : constant Name_Id := N + 428;
+   Name_Priority                       : constant Name_Id := N + 429; -- Ada 05
+   Name_Range                          : constant Name_Id := N + 430;
+   Name_Range_Length                   : constant Name_Id := N + 431; -- GNAT
+   Name_Round                          : constant Name_Id := N + 432;
+   Name_Safe_Emax                      : constant Name_Id := N + 433; -- Ada 83
+   Name_Safe_First                     : constant Name_Id := N + 434;
+   Name_Safe_Large                     : constant Name_Id := N + 435; -- Ada 83
+   Name_Safe_Last                      : constant Name_Id := N + 436;
+   Name_Safe_Small                     : constant Name_Id := N + 437; -- Ada 83
+   Name_Scale                          : constant Name_Id := N + 438;
+   Name_Scaling                        : constant Name_Id := N + 439;
+   Name_Signed_Zeros                   : constant Name_Id := N + 440;
+   Name_Size                           : constant Name_Id := N + 441;
+   Name_Small                          : constant Name_Id := N + 442;
+   Name_Storage_Size                   : constant Name_Id := N + 443;
+   Name_Storage_Unit                   : constant Name_Id := N + 444; -- GNAT
+   Name_Stream_Size                    : constant Name_Id := N + 445; -- Ada 05
+   Name_Tag                            : constant Name_Id := N + 446;
+   Name_Target_Name                    : constant Name_Id := N + 447; -- GNAT
+   Name_Terminated                     : constant Name_Id := N + 448;
+   Name_To_Address                     : constant Name_Id := N + 449; -- GNAT
+   Name_Type_Class                     : constant Name_Id := N + 450; -- GNAT
+   Name_UET_Address                    : constant Name_Id := N + 451; -- GNAT
+   Name_Unbiased_Rounding              : constant Name_Id := N + 452;
+   Name_Unchecked_Access               : constant Name_Id := N + 453;
+   Name_Unconstrained_Array            : constant Name_Id := N + 454;
+   Name_Universal_Literal_String       : constant Name_Id := N + 455; -- GNAT
+   Name_Unrestricted_Access            : constant Name_Id := N + 456; -- GNAT
+   Name_VADS_Size                      : constant Name_Id := N + 457; -- GNAT
+   Name_Val                            : constant Name_Id := N + 458;
+   Name_Valid                          : constant Name_Id := N + 459;
+   Name_Value_Size                     : constant Name_Id := N + 460; -- GNAT
+   Name_Version                        : constant Name_Id := N + 461;
+   Name_Wchar_T_Size                   : constant Name_Id := N + 462; -- GNAT
+   Name_Wide_Wide_Width                : constant Name_Id := N + 463; -- Ada 05
+   Name_Wide_Width                     : constant Name_Id := N + 464;
+   Name_Width                          : constant Name_Id := N + 465;
+   Name_Word_Size                      : constant Name_Id := N + 466; -- GNAT
 
    --  Attributes that designate attributes returning renamable functions,
    --  i.e. functions that return other than a universal value and that
    --  have non-universal arguments.
 
-   First_Renamable_Function_Attribute  : constant Name_Id := N + 464;
-   Name_Adjacent                       : constant Name_Id := N + 464;
-   Name_Ceiling                        : constant Name_Id := N + 465;
-   Name_Copy_Sign                      : constant Name_Id := N + 466;
-   Name_Floor                          : constant Name_Id := N + 467;
-   Name_Fraction                       : constant Name_Id := N + 468;
-   Name_Image                          : constant Name_Id := N + 469;
-   Name_Input                          : constant Name_Id := N + 470;
-   Name_Machine                        : constant Name_Id := N + 471;
-   Name_Max                            : constant Name_Id := N + 472;
-   Name_Min                            : constant Name_Id := N + 473;
-   Name_Model                          : constant Name_Id := N + 474;
-   Name_Pred                           : constant Name_Id := N + 475;
-   Name_Remainder                      : constant Name_Id := N + 476;
-   Name_Rounding                       : constant Name_Id := N + 477;
-   Name_Succ                           : constant Name_Id := N + 478;
-   Name_Truncation                     : constant Name_Id := N + 479;
-   Name_Value                          : constant Name_Id := N + 480;
-   Name_Wide_Image                     : constant Name_Id := N + 481;
-   Name_Wide_Wide_Image                : constant Name_Id := N + 482;
-   Name_Wide_Value                     : constant Name_Id := N + 483;
-   Name_Wide_Wide_Value                : constant Name_Id := N + 484;
-   Last_Renamable_Function_Attribute   : constant Name_Id := N + 484;
+   First_Renamable_Function_Attribute  : constant Name_Id := N + 467;
+   Name_Adjacent                       : constant Name_Id := N + 467;
+   Name_Ceiling                        : constant Name_Id := N + 468;
+   Name_Copy_Sign                      : constant Name_Id := N + 469;
+   Name_Floor                          : constant Name_Id := N + 470;
+   Name_Fraction                       : constant Name_Id := N + 471;
+   Name_Image                          : constant Name_Id := N + 472;
+   Name_Input                          : constant Name_Id := N + 473;
+   Name_Machine                        : constant Name_Id := N + 474;
+   Name_Max                            : constant Name_Id := N + 475;
+   Name_Min                            : constant Name_Id := N + 476;
+   Name_Model                          : constant Name_Id := N + 477;
+   Name_Pred                           : constant Name_Id := N + 478;
+   Name_Remainder                      : constant Name_Id := N + 479;
+   Name_Rounding                       : constant Name_Id := N + 480;
+   Name_Succ                           : constant Name_Id := N + 481;
+   Name_Truncation                     : constant Name_Id := N + 482;
+   Name_Value                          : constant Name_Id := N + 483;
+   Name_Wide_Image                     : constant Name_Id := N + 484;
+   Name_Wide_Wide_Image                : constant Name_Id := N + 485;
+   Name_Wide_Value                     : constant Name_Id := N + 486;
+   Name_Wide_Wide_Value                : constant Name_Id := N + 487;
+   Last_Renamable_Function_Attribute   : constant Name_Id := N + 487;
 
    --  Attributes that designate procedures
 
-   First_Procedure_Attribute           : constant Name_Id := N + 485;
-   Name_Output                         : constant Name_Id := N + 485;
-   Name_Read                           : constant Name_Id := N + 486;
-   Name_Write                          : constant Name_Id := N + 487;
-   Last_Procedure_Attribute            : constant Name_Id := N + 487;
+   First_Procedure_Attribute           : constant Name_Id := N + 488;
+   Name_Output                         : constant Name_Id := N + 488;
+   Name_Read                           : constant Name_Id := N + 489;
+   Name_Write                          : constant Name_Id := N + 490;
+   Last_Procedure_Attribute            : constant Name_Id := N + 490;
 
    --  Remaining attributes are ones that return entities
 
-   First_Entity_Attribute_Name         : constant Name_Id := N + 488;
-   Name_Elab_Body                      : constant Name_Id := N + 488; -- GNAT
-   Name_Elab_Spec                      : constant Name_Id := N + 489; -- GNAT
-   Name_Storage_Pool                   : constant Name_Id := N + 490;
+   First_Entity_Attribute_Name         : constant Name_Id := N + 491;
+   Name_Elab_Body                      : constant Name_Id := N + 491; -- GNAT
+   Name_Elab_Spec                      : constant Name_Id := N + 492; -- GNAT
+   Name_Storage_Pool                   : constant Name_Id := N + 493;
 
    --  These attributes are the ones that return types
 
-   First_Type_Attribute_Name           : constant Name_Id := N + 491;
-   Name_Base                           : constant Name_Id := N + 491;
-   Name_Class                          : constant Name_Id := N + 492;
-   Name_Stub_Type                      : constant Name_Id := N + 493;
-   Last_Type_Attribute_Name            : constant Name_Id := N + 493;
-   Last_Entity_Attribute_Name          : constant Name_Id := N + 493;
-   Last_Attribute_Name                 : constant Name_Id := N + 493;
+   First_Type_Attribute_Name           : constant Name_Id := N + 494;
+   Name_Base                           : constant Name_Id := N + 494;
+   Name_Class                          : constant Name_Id := N + 495;
+   Name_Stub_Type                      : constant Name_Id := N + 496;
+   Last_Type_Attribute_Name            : constant Name_Id := N + 496;
+   Last_Entity_Attribute_Name          : constant Name_Id := N + 496;
+   Last_Attribute_Name                 : constant Name_Id := N + 496;
 
    --  Names of recognized locking policy identifiers
 
@@ -810,10 +816,10 @@ package Snames is
    --  name (e.g. C for Ceiling_Locking). If new policy names are added,
    --  the first character must be distinct.
 
-   First_Locking_Policy_Name           : constant Name_Id := N + 494;
-   Name_Ceiling_Locking                : constant Name_Id := N + 494;
-   Name_Inheritance_Locking            : constant Name_Id := N + 495;
-   Last_Locking_Policy_Name            : constant Name_Id := N + 495;
+   First_Locking_Policy_Name           : constant Name_Id := N + 497;
+   Name_Ceiling_Locking                : constant Name_Id := N + 497;
+   Name_Inheritance_Locking            : constant Name_Id := N + 498;
+   Last_Locking_Policy_Name            : constant Name_Id := N + 498;
 
    --  Names of recognized queuing policy identifiers
 
@@ -821,10 +827,10 @@ package Snames is
    --  name (e.g. F for FIFO_Queuing). If new policy names are added,
    --  the first character must be distinct.
 
-   First_Queuing_Policy_Name           : constant Name_Id := N + 496;
-   Name_FIFO_Queuing                   : constant Name_Id := N + 496;
-   Name_Priority_Queuing               : constant Name_Id := N + 497;
-   Last_Queuing_Policy_Name            : constant Name_Id := N + 497;
+   First_Queuing_Policy_Name           : constant Name_Id := N + 499;
+   Name_FIFO_Queuing                   : constant Name_Id := N + 499;
+   Name_Priority_Queuing               : constant Name_Id := N + 500;
+   Last_Queuing_Policy_Name            : constant Name_Id := N + 500;
 
    --  Names of recognized task dispatching policy identifiers
 
@@ -832,249 +838,271 @@ package Snames is
    --  name (e.g. F for FIFO_Within_Priorities). If new policy names
    --  are added, the first character must be distinct.
 
-   First_Task_Dispatching_Policy_Name  : constant Name_Id := N + 498;
-   Name_EDF_Across_Priorities          : constant Name_Id := N + 498;
-   Name_FIFO_Within_Priorities         : constant Name_Id := N + 499;
-   Name_Non_Preemptive_Within_Priorities : constant Name_Id := N + 500;
-   Name_Round_Robin_Within_Priorities  : constant Name_Id := N + 501;
-   Last_Task_Dispatching_Policy_Name   : constant Name_Id := N + 501;
+   First_Task_Dispatching_Policy_Name  : constant Name_Id := N + 501;
+   Name_EDF_Across_Priorities          : constant Name_Id := N + 501;
+   Name_FIFO_Within_Priorities         : constant Name_Id := N + 502;
+   Name_Non_Preemptive_Within_Priorities : constant Name_Id := N + 503;
+   Name_Round_Robin_Within_Priorities  : constant Name_Id := N + 504;
+   Last_Task_Dispatching_Policy_Name   : constant Name_Id := N + 504;
 
    --  Names of recognized checks for pragma Suppress
 
-   First_Check_Name                    : constant Name_Id := N + 502;
-   Name_Access_Check                   : constant Name_Id := N + 502;
-   Name_Accessibility_Check            : constant Name_Id := N + 503;
-   Name_Alignment_Check                : constant Name_Id := N + 504;
-   Name_Discriminant_Check             : constant Name_Id := N + 505;
-   Name_Division_Check                 : constant Name_Id := N + 506;
-   Name_Elaboration_Check              : constant Name_Id := N + 507;
-   Name_Index_Check                    : constant Name_Id := N + 508;
-   Name_Length_Check                   : constant Name_Id := N + 509;
-   Name_Overflow_Check                 : constant Name_Id := N + 510;
-   Name_Range_Check                    : constant Name_Id := N + 511;
-   Name_Storage_Check                  : constant Name_Id := N + 512;
-   Name_Tag_Check                      : constant Name_Id := N + 513;
-   Name_Validity_Check                 : constant Name_Id := N + 514;
-   Name_All_Checks                     : constant Name_Id := N + 515;
-   Last_Check_Name                     : constant Name_Id := N + 515;
+   First_Check_Name                    : constant Name_Id := N + 505;
+   Name_Access_Check                   : constant Name_Id := N + 505;
+   Name_Accessibility_Check            : constant Name_Id := N + 506;
+   Name_Alignment_Check                : constant Name_Id := N + 507;
+   Name_Discriminant_Check             : constant Name_Id := N + 508;
+   Name_Division_Check                 : constant Name_Id := N + 509;
+   Name_Elaboration_Check              : constant Name_Id := N + 510;
+   Name_Index_Check                    : constant Name_Id := N + 511;
+   Name_Length_Check                   : constant Name_Id := N + 512;
+   Name_Overflow_Check                 : constant Name_Id := N + 513;
+   Name_Range_Check                    : constant Name_Id := N + 514;
+   Name_Storage_Check                  : constant Name_Id := N + 515;
+   Name_Tag_Check                      : constant Name_Id := N + 516;
+   Name_Validity_Check                 : constant Name_Id := N + 517;
+   Name_All_Checks                     : constant Name_Id := N + 518;
+   Last_Check_Name                     : constant Name_Id := N + 518;
 
    --  Names corresponding to reserved keywords, excluding those already
    --  declared in the attribute list (Access, Delta, Digits, Mod, Range).
 
-   Name_Abort                          : constant Name_Id := N + 516;
-   Name_Abs                            : constant Name_Id := N + 517;
-   Name_Accept                         : constant Name_Id := N + 518;
-   Name_And                            : constant Name_Id := N + 519;
-   Name_All                            : constant Name_Id := N + 520;
-   Name_Array                          : constant Name_Id := N + 521;
-   Name_At                             : constant Name_Id := N + 522;
-   Name_Begin                          : constant Name_Id := N + 523;
-   Name_Body                           : constant Name_Id := N + 524;
-   Name_Case                           : constant Name_Id := N + 525;
-   Name_Constant                       : constant Name_Id := N + 526;
-   Name_Declare                        : constant Name_Id := N + 527;
-   Name_Delay                          : constant Name_Id := N + 528;
-   Name_Do                             : constant Name_Id := N + 529;
-   Name_Else                           : constant Name_Id := N + 530;
-   Name_Elsif                          : constant Name_Id := N + 531;
-   Name_End                            : constant Name_Id := N + 532;
-   Name_Entry                          : constant Name_Id := N + 533;
-   Name_Exception                      : constant Name_Id := N + 534;
-   Name_Exit                           : constant Name_Id := N + 535;
-   Name_For                            : constant Name_Id := N + 536;
-   Name_Function                       : constant Name_Id := N + 537;
-   Name_Generic                        : constant Name_Id := N + 538;
-   Name_Goto                           : constant Name_Id := N + 539;
-   Name_If                             : constant Name_Id := N + 540;
-   Name_In                             : constant Name_Id := N + 541;
-   Name_Is                             : constant Name_Id := N + 542;
-   Name_Limited                        : constant Name_Id := N + 543;
-   Name_Loop                           : constant Name_Id := N + 544;
-   Name_New                            : constant Name_Id := N + 545;
-   Name_Not                            : constant Name_Id := N + 546;
-   Name_Null                           : constant Name_Id := N + 547;
-   Name_Of                             : constant Name_Id := N + 548;
-   Name_Or                             : constant Name_Id := N + 549;
-   Name_Others                         : constant Name_Id := N + 550;
-   Name_Out                            : constant Name_Id := N + 551;
-   Name_Package                        : constant Name_Id := N + 552;
-   Name_Pragma                         : constant Name_Id := N + 553;
-   Name_Private                        : constant Name_Id := N + 554;
-   Name_Procedure                      : constant Name_Id := N + 555;
-   Name_Raise                          : constant Name_Id := N + 556;
-   Name_Record                         : constant Name_Id := N + 557;
-   Name_Rem                            : constant Name_Id := N + 558;
-   Name_Renames                        : constant Name_Id := N + 559;
-   Name_Return                         : constant Name_Id := N + 560;
-   Name_Reverse                        : constant Name_Id := N + 561;
-   Name_Select                         : constant Name_Id := N + 562;
-   Name_Separate                       : constant Name_Id := N + 563;
-   Name_Subtype                        : constant Name_Id := N + 564;
-   Name_Task                           : constant Name_Id := N + 565;
-   Name_Terminate                      : constant Name_Id := N + 566;
-   Name_Then                           : constant Name_Id := N + 567;
-   Name_Type                           : constant Name_Id := N + 568;
-   Name_Use                            : constant Name_Id := N + 569;
-   Name_When                           : constant Name_Id := N + 570;
-   Name_While                          : constant Name_Id := N + 571;
-   Name_With                           : constant Name_Id := N + 572;
-   Name_Xor                            : constant Name_Id := N + 573;
+   Name_Abort                          : constant Name_Id := N + 519;
+   Name_Abs                            : constant Name_Id := N + 520;
+   Name_Accept                         : constant Name_Id := N + 521;
+   Name_And                            : constant Name_Id := N + 522;
+   Name_All                            : constant Name_Id := N + 523;
+   Name_Array                          : constant Name_Id := N + 524;
+   Name_At                             : constant Name_Id := N + 525;
+   Name_Begin                          : constant Name_Id := N + 526;
+   Name_Body                           : constant Name_Id := N + 527;
+   Name_Case                           : constant Name_Id := N + 528;
+   Name_Constant                       : constant Name_Id := N + 529;
+   Name_Declare                        : constant Name_Id := N + 530;
+   Name_Delay                          : constant Name_Id := N + 531;
+   Name_Do                             : constant Name_Id := N + 532;
+   Name_Else                           : constant Name_Id := N + 533;
+   Name_Elsif                          : constant Name_Id := N + 534;
+   Name_End                            : constant Name_Id := N + 535;
+   Name_Entry                          : constant Name_Id := N + 536;
+   Name_Exception                      : constant Name_Id := N + 537;
+   Name_Exit                           : constant Name_Id := N + 538;
+   Name_For                            : constant Name_Id := N + 539;
+   Name_Function                       : constant Name_Id := N + 540;
+   Name_Generic                        : constant Name_Id := N + 541;
+   Name_Goto                           : constant Name_Id := N + 542;
+   Name_If                             : constant Name_Id := N + 543;
+   Name_In                             : constant Name_Id := N + 544;
+   Name_Is                             : constant Name_Id := N + 545;
+   Name_Limited                        : constant Name_Id := N + 546;
+   Name_Loop                           : constant Name_Id := N + 547;
+   Name_New                            : constant Name_Id := N + 548;
+   Name_Not                            : constant Name_Id := N + 549;
+   Name_Null                           : constant Name_Id := N + 550;
+   Name_Of                             : constant Name_Id := N + 551;
+   Name_Or                             : constant Name_Id := N + 552;
+   Name_Others                         : constant Name_Id := N + 553;
+   Name_Out                            : constant Name_Id := N + 554;
+   Name_Package                        : constant Name_Id := N + 555;
+   Name_Pragma                         : constant Name_Id := N + 556;
+   Name_Private                        : constant Name_Id := N + 557;
+   Name_Procedure                      : constant Name_Id := N + 558;
+   Name_Raise                          : constant Name_Id := N + 559;
+   Name_Record                         : constant Name_Id := N + 560;
+   Name_Rem                            : constant Name_Id := N + 561;
+   Name_Renames                        : constant Name_Id := N + 562;
+   Name_Return                         : constant Name_Id := N + 563;
+   Name_Reverse                        : constant Name_Id := N + 564;
+   Name_Select                         : constant Name_Id := N + 565;
+   Name_Separate                       : constant Name_Id := N + 566;
+   Name_Subtype                        : constant Name_Id := N + 567;
+   Name_Task                           : constant Name_Id := N + 568;
+   Name_Terminate                      : constant Name_Id := N + 569;
+   Name_Then                           : constant Name_Id := N + 570;
+   Name_Type                           : constant Name_Id := N + 571;
+   Name_Use                            : constant Name_Id := N + 572;
+   Name_When                           : constant Name_Id := N + 573;
+   Name_While                          : constant Name_Id := N + 574;
+   Name_With                           : constant Name_Id := N + 575;
+   Name_Xor                            : constant Name_Id := N + 576;
 
    --  Names of intrinsic subprograms
 
    --  Note: Asm is missing from this list, since Asm is a legitimate
    --  convention name. So is To_Adress, which is a GNAT attribute.
 
-   First_Intrinsic_Name                 : constant Name_Id := N + 574;
-   Name_Divide                          : constant Name_Id := N + 574;
-   Name_Enclosing_Entity                : constant Name_Id := N + 575;
-   Name_Exception_Information           : constant Name_Id := N + 576;
-   Name_Exception_Message               : constant Name_Id := N + 577;
-   Name_Exception_Name                  : constant Name_Id := N + 578;
-   Name_File                            : constant Name_Id := N + 579;
-   Name_Generic_Dispatching_Constructor : constant Name_Id := N + 580;
-   Name_Import_Address                  : constant Name_Id := N + 581;
-   Name_Import_Largest_Value            : constant Name_Id := N + 582;
-   Name_Import_Value                    : constant Name_Id := N + 583;
-   Name_Is_Negative                     : constant Name_Id := N + 584;
-   Name_Line                            : constant Name_Id := N + 585;
-   Name_Rotate_Left                     : constant Name_Id := N + 586;
-   Name_Rotate_Right                    : constant Name_Id := N + 587;
-   Name_Shift_Left                      : constant Name_Id := N + 588;
-   Name_Shift_Right                     : constant Name_Id := N + 589;
-   Name_Shift_Right_Arithmetic          : constant Name_Id := N + 590;
-   Name_Source_Location                 : constant Name_Id := N + 591;
-   Name_Unchecked_Conversion            : constant Name_Id := N + 592;
-   Name_Unchecked_Deallocation          : constant Name_Id := N + 593;
-   Name_To_Pointer                      : constant Name_Id := N + 594;
-   Last_Intrinsic_Name                  : constant Name_Id := N + 594;
+   First_Intrinsic_Name                 : constant Name_Id := N + 577;
+   Name_Divide                          : constant Name_Id := N + 577;
+   Name_Enclosing_Entity                : constant Name_Id := N + 578;
+   Name_Exception_Information           : constant Name_Id := N + 579;
+   Name_Exception_Message               : constant Name_Id := N + 580;
+   Name_Exception_Name                  : constant Name_Id := N + 581;
+   Name_File                            : constant Name_Id := N + 582;
+   Name_Generic_Dispatching_Constructor : constant Name_Id := N + 583;
+   Name_Import_Address                  : constant Name_Id := N + 584;
+   Name_Import_Largest_Value            : constant Name_Id := N + 585;
+   Name_Import_Value                    : constant Name_Id := N + 586;
+   Name_Is_Negative                     : constant Name_Id := N + 587;
+   Name_Line                            : constant Name_Id := N + 588;
+   Name_Rotate_Left                     : constant Name_Id := N + 589;
+   Name_Rotate_Right                    : constant Name_Id := N + 590;
+   Name_Shift_Left                      : constant Name_Id := N + 591;
+   Name_Shift_Right                     : constant Name_Id := N + 592;
+   Name_Shift_Right_Arithmetic          : constant Name_Id := N + 593;
+   Name_Source_Location                 : constant Name_Id := N + 594;
+   Name_Unchecked_Conversion            : constant Name_Id := N + 595;
+   Name_Unchecked_Deallocation          : constant Name_Id := N + 596;
+   Name_To_Pointer                      : constant Name_Id := N + 597;
+   Last_Intrinsic_Name                  : constant Name_Id := N + 597;
 
    --  Names used in processing intrinsic calls
 
-   Name_Free                           : constant Name_Id := N + 595;
+   Name_Free                           : constant Name_Id := N + 598;
 
    --  Reserved words used only in Ada 95
 
-   First_95_Reserved_Word              : constant Name_Id := N + 596;
-   Name_Abstract                       : constant Name_Id := N + 596;
-   Name_Aliased                        : constant Name_Id := N + 597;
-   Name_Protected                      : constant Name_Id := N + 598;
-   Name_Until                          : constant Name_Id := N + 599;
-   Name_Requeue                        : constant Name_Id := N + 600;
-   Name_Tagged                         : constant Name_Id := N + 601;
-   Last_95_Reserved_Word               : constant Name_Id := N + 601;
+   First_95_Reserved_Word              : constant Name_Id := N + 599;
+   Name_Abstract                       : constant Name_Id := N + 599;
+   Name_Aliased                        : constant Name_Id := N + 600;
+   Name_Protected                      : constant Name_Id := N + 601;
+   Name_Until                          : constant Name_Id := N + 602;
+   Name_Requeue                        : constant Name_Id := N + 603;
+   Name_Tagged                         : constant Name_Id := N + 604;
+   Last_95_Reserved_Word               : constant Name_Id := N + 604;
 
    subtype Ada_95_Reserved_Words is
      Name_Id range First_95_Reserved_Word .. Last_95_Reserved_Word;
 
    --  Miscellaneous names used in semantic checking
 
-   Name_Raise_Exception                : constant Name_Id := N + 602;
+   Name_Raise_Exception                : constant Name_Id := N + 605;
 
    --  Additional reserved words and identifiers used in GNAT Project Files
    --  Note that Name_External is already previously declared
 
-   Name_Ada_Roots                      : constant Name_Id := N + 603;
-   Name_Archive_Builder                : constant Name_Id := N + 604;
-   Name_Archive_Indexer                : constant Name_Id := N + 605;
-   Name_Binder                         : constant Name_Id := N + 606;
-   Name_Binder_Driver                  : constant Name_Id := N + 607;
-   Name_Body_Suffix                    : constant Name_Id := N + 608;
-   Name_Builder                        : constant Name_Id := N + 609;
-   Name_Compiler                       : constant Name_Id := N + 610;
-   Name_Compiler_Driver                : constant Name_Id := N + 611;
-   Name_Compiler_Kind                  : constant Name_Id := N + 612;
-   Name_Compiler_Pic_Option            : constant Name_Id := N + 613;
-   Name_Compute_Dependency             : constant Name_Id := N + 614;
-   Name_Config_Body_File_Name          : constant Name_Id := N + 615;
-   Name_Config_Body_File_Name_Pattern  : constant Name_Id := N + 616;
-   Name_Config_File_Switches           : constant Name_Id := N + 617;
-   Name_Config_File_Unique             : constant Name_Id := N + 618;
-   Name_Config_Spec_File_Name          : constant Name_Id := N + 619;
-   Name_Config_Spec_File_Name_Pattern  : constant Name_Id := N + 620;
-   Name_Cross_Reference                : constant Name_Id := N + 621;
-   Name_Default_Builder_Switches       : constant Name_Id := N + 622;
-   Name_Default_Global_Compiler_Switches : constant Name_Id := N + 623;
-   Name_Default_Language               : constant Name_Id := N + 624;
-   Name_Default_Linker                 : constant Name_Id := N + 625;
-   Name_Default_Switches               : constant Name_Id := N + 626;
-   Name_Dependency_File_Kind           : constant Name_Id := N + 627;
-   Name_Dependency_Option              : constant Name_Id := N + 628;
-   Name_Exec_Dir                       : constant Name_Id := N + 629;
-   Name_Executable                     : constant Name_Id := N + 630;
-   Name_Executable_Suffix              : constant Name_Id := N + 631;
-   Name_Extends                        : constant Name_Id := N + 632;
-   Name_Externally_Built               : constant Name_Id := N + 633;
-   Name_Finder                         : constant Name_Id := N + 634;
-   Name_Global_Compiler_Switches       : constant Name_Id := N + 635;
-   Name_Global_Configuration_Pragmas   : constant Name_Id := N + 636;
-   Name_Gnatls                         : constant Name_Id := N + 637;
-   Name_Gnatstub                       : constant Name_Id := N + 638;
-   Name_Implementation                 : constant Name_Id := N + 639;
-   Name_Implementation_Exceptions      : constant Name_Id := N + 640;
-   Name_Implementation_Suffix          : constant Name_Id := N + 641;
-   Name_Include_Option                 : constant Name_Id := N + 642;
-   Name_Include_Path                   : constant Name_Id := N + 643;
-   Name_Include_Path_File              : constant Name_Id := N + 644;
-   Name_Language_Kind                  : constant Name_Id := N + 645;
-   Name_Language_Processing            : constant Name_Id := N + 646;
-   Name_Languages                      : constant Name_Id := N + 647;
-   Name_Library_Ali_Dir                : constant Name_Id := N + 648;
-   Name_Library_Dir                    : constant Name_Id := N + 649;
-   Name_Library_Auto_Init              : constant Name_Id := N + 650;
-   Name_Library_GCC                    : constant Name_Id := N + 651;
-   Name_Library_Interface              : constant Name_Id := N + 652;
-   Name_Library_Kind                   : constant Name_Id := N + 653;
-   Name_Library_Name                   : constant Name_Id := N + 654;
-   Name_Library_Options                : constant Name_Id := N + 655;
-   Name_Library_Reference_Symbol_File  : constant Name_Id := N + 656;
-   Name_Library_Src_Dir                : constant Name_Id := N + 657;
-   Name_Library_Symbol_File            : constant Name_Id := N + 658;
-   Name_Library_Symbol_Policy          : constant Name_Id := N + 659;
-   Name_Library_Version                : constant Name_Id := N + 660;
-   Name_Linker                         : constant Name_Id := N + 661;
-   Name_Linker_Executable_Option       : constant Name_Id := N + 662;
-   Name_Linker_Lib_Dir_Option          : constant Name_Id := N + 663;
-   Name_Linker_Lib_Name_Option         : constant Name_Id := N + 664;
-   Name_Local_Configuration_Pragmas    : constant Name_Id := N + 665;
-   Name_Locally_Removed_Files          : constant Name_Id := N + 666;
-   Name_Mapping_File_Switches          : constant Name_Id := N + 667;
-   Name_Metrics                        : constant Name_Id := N + 668;
-   Name_Naming                         : constant Name_Id := N + 669;
-   Name_Object_Dir                     : constant Name_Id := N + 670;
-   Name_Pretty_Printer                 : constant Name_Id := N + 671;
-   Name_Project                        : constant Name_Id := N + 672;
-   Name_Roots                          : constant Name_Id := N + 673;
-   Name_Runtime_Project                : constant Name_Id := N + 674;
-   Name_Separate_Suffix                : constant Name_Id := N + 675;
-   Name_Source_Dirs                    : constant Name_Id := N + 676;
-   Name_Source_Files                   : constant Name_Id := N + 677;
-   Name_Source_List_File               : constant Name_Id := N + 678;
-   Name_Spec                           : constant Name_Id := N + 679;
-   Name_Spec_Suffix                    : constant Name_Id := N + 680;
-   Name_Specification                  : constant Name_Id := N + 681;
-   Name_Specification_Exceptions       : constant Name_Id := N + 682;
-   Name_Specification_Suffix           : constant Name_Id := N + 683;
-   Name_Switches                       : constant Name_Id := N + 684;
+   Name_Ada_Roots                      : constant Name_Id := N + 606;
+   Name_Archive_Builder                : constant Name_Id := N + 607;
+   Name_Archive_Indexer                : constant Name_Id := N + 608;
+   Name_Archive_Suffix                 : constant Name_Id := N + 609;
+   Name_Binder                         : constant Name_Id := N + 610;
+   Name_Binder_Driver                  : constant Name_Id := N + 611;
+   Name_Body_Suffix                    : constant Name_Id := N + 612;
+   Name_Builder                        : constant Name_Id := N + 613;
+   Name_Builder_Switches               : constant Name_Id := N + 614;
+   Name_Compiler                       : constant Name_Id := N + 615;
+   Name_Compiler_Driver                : constant Name_Id := N + 616;
+   Name_Compiler_Kind                  : constant Name_Id := N + 617;
+   Name_Compiler_Minimum_Options       : constant Name_Id := N + 618;
+   Name_Compiler_Pic_Option            : constant Name_Id := N + 619;
+   Name_Compute_Dependency             : constant Name_Id := N + 620;
+   Name_Config_Body_File_Name          : constant Name_Id := N + 621;
+   Name_Config_Body_File_Name_Pattern  : constant Name_Id := N + 622;
+   Name_Config_File_Switches           : constant Name_Id := N + 623;
+   Name_Config_File_Unique             : constant Name_Id := N + 624;
+   Name_Config_Spec_File_Name          : constant Name_Id := N + 625;
+   Name_Config_Spec_File_Name_Pattern  : constant Name_Id := N + 626;
+   Name_Cross_Reference                : constant Name_Id := N + 627;
+   Name_Default_Builder_Switches       : constant Name_Id := N + 628;
+   Name_Default_Global_Compiler_Switches : constant Name_Id := N + 629;
+   Name_Default_Language               : constant Name_Id := N + 630;
+   Name_Default_Linker                 : constant Name_Id := N + 631;
+   Name_Default_Switches               : constant Name_Id := N + 632;
+   Name_Dependency_File_Kind           : constant Name_Id := N + 633;
+   Name_Dependency_Option              : constant Name_Id := N + 634;
+   Name_Exec_Dir                       : constant Name_Id := N + 635;
+   Name_Executable                     : constant Name_Id := N + 636;
+   Name_Executable_Suffix              : constant Name_Id := N + 637;
+   Name_Extends                        : constant Name_Id := N + 638;
+   Name_Externally_Built               : constant Name_Id := N + 639;
+   Name_Finder                         : constant Name_Id := N + 640;
+   Name_Global_Compiler_Switches       : constant Name_Id := N + 641;
+   Name_Global_Configuration_Pragmas   : constant Name_Id := N + 642;
+   Name_Global_Config_File             : constant Name_Id := N + 643;
+   Name_Gnatls                         : constant Name_Id := N + 644;
+   Name_Gnatstub                       : constant Name_Id := N + 645;
+   Name_Implementation                 : constant Name_Id := N + 646;
+   Name_Implementation_Exceptions      : constant Name_Id := N + 647;
+   Name_Implementation_Suffix          : constant Name_Id := N + 648;
+   Name_Include_Option                 : constant Name_Id := N + 649;
+   Name_Include_Path                   : constant Name_Id := N + 650;
+   Name_Include_Path_File              : constant Name_Id := N + 651;
+   Name_Language_Kind                  : constant Name_Id := N + 652;
+   Name_Language_Processing            : constant Name_Id := N + 653;
+   Name_Languages                      : constant Name_Id := N + 654;
+   Name_Library_Ali_Dir                : constant Name_Id := N + 655;
+   Name_Library_Auto_Init              : constant Name_Id := N + 656;
+   Name_Library_Auto_Init_Supported    : constant Name_Id := N + 657;
+   Name_Library_Builder                : constant Name_Id := N + 658;
+   Name_Library_Dir                    : constant Name_Id := N + 659;
+   Name_Library_GCC                    : constant Name_Id := N + 660;
+   Name_Library_Interface              : constant Name_Id := N + 661;
+   Name_Library_Kind                   : constant Name_Id := N + 662;
+   Name_Library_Name                   : constant Name_Id := N + 663;
+   Name_Library_Major_Minor_Id_Supported : constant Name_Id := N + 664;
+   Name_Library_Options                : constant Name_Id := N + 665;
+   Name_Library_Reference_Symbol_File  : constant Name_Id := N + 666;
+   Name_Library_Src_Dir                : constant Name_Id := N + 667;
+   Name_Library_Support                : constant Name_Id := N + 668;
+   Name_Library_Symbol_File            : constant Name_Id := N + 669;
+   Name_Library_Symbol_Policy          : constant Name_Id := N + 670;
+   Name_Library_Version                : constant Name_Id := N + 671;
+   Name_Library_Version_Options        : constant Name_Id := N + 672;
+   Name_Linker                         : constant Name_Id := N + 673;
+   Name_Linker_Executable_Option       : constant Name_Id := N + 674;
+   Name_Linker_Lib_Dir_Option          : constant Name_Id := N + 675;
+   Name_Linker_Lib_Name_Option         : constant Name_Id := N + 676;
+   Name_Local_Config_File              : constant Name_Id := N + 677;
+   Name_Local_Configuration_Pragmas    : constant Name_Id := N + 678;
+   Name_Locally_Removed_Files          : constant Name_Id := N + 679;
+   Name_Mapping_File_Switches          : constant Name_Id := N + 680;
+   Name_Mapping_Spec_Suffix            : constant Name_Id := N + 681;
+   Name_Mapping_Body_Suffix            : constant Name_Id := N + 682;
+   Name_Metrics                        : constant Name_Id := N + 683;
+   Name_Minimum_Binder_Options         : constant Name_Id := N + 684;
+   Name_Naming                         : constant Name_Id := N + 685;
+   Name_Objects_Path                   : constant Name_Id := N + 686;
+   Name_Objects_Path_File              : constant Name_Id := N + 687;
+   Name_Object_Dir                     : constant Name_Id := N + 688;
+   Name_Pretty_Printer                 : constant Name_Id := N + 689;
+   Name_Project                        : constant Name_Id := N + 690;
+   Name_Roots                          : constant Name_Id := N + 691;
+   Name_Run_Path_Option                : constant Name_Id := N + 692;
+   Name_Runtime_Project                : constant Name_Id := N + 693;
+   Name_Shared_Library_Minimum_Options : constant Name_Id := N + 694;
+   Name_Shared_Library_Prefix          : constant Name_Id := N + 695;
+   Name_Shared_Library_Suffix          : constant Name_Id := N + 696;
+   Name_Separate_Suffix                : constant Name_Id := N + 697;
+   Name_Source_Dirs                    : constant Name_Id := N + 698;
+   Name_Source_Files                   : constant Name_Id := N + 699;
+   Name_Source_List_File               : constant Name_Id := N + 700;
+   Name_Spec                           : constant Name_Id := N + 701;
+   Name_Spec_Suffix                    : constant Name_Id := N + 702;
+   Name_Specification                  : constant Name_Id := N + 703;
+   Name_Specification_Exceptions       : constant Name_Id := N + 704;
+   Name_Specification_Suffix           : constant Name_Id := N + 705;
+   Name_Stack                          : constant Name_Id := N + 706;
+   Name_Switches                       : constant Name_Id := N + 707;
+   Name_Symbolic_Link_Supported        : constant Name_Id := N + 708;
+   Name_Toolchain_Version              : constant Name_Id := N + 709;
 
    --  Other miscellaneous names used in front end
 
-   Name_Unaligned_Valid                : constant Name_Id := N + 685;
+   Name_Unaligned_Valid                : constant Name_Id := N + 710;
 
    --  Ada 2005 reserved words
 
-   First_2005_Reserved_Word            : constant Name_Id := N + 686;
-   Name_Interface                      : constant Name_Id := N + 686;
-   Name_Overriding                     : constant Name_Id := N + 687;
-   Name_Synchronized                   : constant Name_Id := N + 688;
-   Last_2005_Reserved_Word             : constant Name_Id := N + 688;
+   First_2005_Reserved_Word            : constant Name_Id := N + 711;
+   Name_Interface                      : constant Name_Id := N + 711;
+   Name_Overriding                     : constant Name_Id := N + 712;
+   Name_Synchronized                   : constant Name_Id := N + 713;
+   Last_2005_Reserved_Word             : constant Name_Id := N + 713;
 
    subtype Ada_2005_Reserved_Words is
      Name_Id range First_2005_Reserved_Word .. Last_2005_Reserved_Word;
 
    --  Mark last defined name for consistency check in Snames body
 
-   Last_Predefined_Name                : constant Name_Id := N + 688;
+   Last_Predefined_Name                : constant Name_Id := N + 713;
 
    ---------------------------------------
    -- Subtypes Defining Name Categories --
@@ -1299,6 +1327,7 @@ package Snames is
       Pragma_Ada_2005,
       Pragma_Assertion_Policy,
       Pragma_C_Pass_By_Copy,
+      Pragma_Compile_Time_Error,
       Pragma_Compile_Time_Warning,
       Pragma_Component_Alignment,
       Pragma_Convention_Identifier,
@@ -1441,6 +1470,7 @@ package Snames is
       Pragma_Unchecked_Union,
       Pragma_Unimplemented_Unit,
       Pragma_Unreferenced,
+      Pragma_Unreferenced_Objects,
       Pragma_Unreserve_All_Interrupts,
       Pragma_Volatile,
       Pragma_Volatile_Components,
index bfe35b6..98f079e 100644 (file)
@@ -220,153 +220,155 @@ extern unsigned char Get_Pragma_Id (int);
 #define  Pragma_Ada_2005                      3
 #define  Pragma_Assertion_Policy              4
 #define  Pragma_C_Pass_By_Copy                5
-#define  Pragma_Compile_Time_Warning          6
-#define  Pragma_Component_Alignment           7
-#define  Pragma_Convention_Identifier         8
-#define  Pragma_Debug_Policy                  9
-#define  Pragma_Detect_Blocking               10
-#define  Pragma_Discard_Names                 11
-#define  Pragma_Elaboration_Checks            12
-#define  Pragma_Eliminate                     13
-#define  Pragma_Explicit_Overriding           14
-#define  Pragma_Extend_System                 15
-#define  Pragma_Extensions_Allowed            16
-#define  Pragma_External_Name_Casing          17
-#define  Pragma_Float_Representation          18
-#define  Pragma_Initialize_Scalars            19
-#define  Pragma_Interrupt_State               20
-#define  Pragma_License                       21
-#define  Pragma_Locking_Policy                22
-#define  Pragma_Long_Float                    23
-#define  Pragma_No_Run_Time                   24
-#define  Pragma_No_Strict_Aliasing            25
-#define  Pragma_Normalize_Scalars             26
-#define  Pragma_Polling                       27
-#define  Pragma_Persistent_BSS                28
-#define  Pragma_Priority_Specific_Dispatching 29
-#define  Pragma_Profile                       30
-#define  Pragma_Profile_Warnings              31
-#define  Pragma_Propagate_Exceptions          32
-#define  Pragma_Queuing_Policy                33
-#define  Pragma_Ravenscar                     34
-#define  Pragma_Restricted_Run_Time           35
-#define  Pragma_Restrictions                  36
-#define  Pragma_Restriction_Warnings          37
-#define  Pragma_Reviewable                    38
-#define  Pragma_Source_File_Name              39
-#define  Pragma_Source_File_Name_Project      40
-#define  Pragma_Style_Checks                  41
-#define  Pragma_Suppress                      42
-#define  Pragma_Suppress_Exception_Locations  43
-#define  Pragma_Task_Dispatching_Policy       44
-#define  Pragma_Universal_Data                45
-#define  Pragma_Unsuppress                    46
-#define  Pragma_Use_VADS_Size                 47
-#define  Pragma_Validity_Checks               48
-#define  Pragma_Warnings                      49
-#define  Pragma_Wide_Character_Encoding       50
-#define  Pragma_Abort_Defer                   51
-#define  Pragma_All_Calls_Remote              52
-#define  Pragma_Annotate                      53
-#define  Pragma_Assert                        54
-#define  Pragma_Asynchronous                  55
-#define  Pragma_Atomic                        56
-#define  Pragma_Atomic_Components             57
-#define  Pragma_Attach_Handler                58
-#define  Pragma_Comment                       59
-#define  Pragma_Common_Object                 60
-#define  Pragma_Complete_Representation       61
-#define  Pragma_Complex_Representation        62
-#define  Pragma_Controlled                    63
-#define  Pragma_Convention                    64
-#define  Pragma_CPP_Class                     65
-#define  Pragma_CPP_Constructor               66
-#define  Pragma_CPP_Virtual                   67
-#define  Pragma_CPP_Vtable                    68
-#define  Pragma_Debug                         69
-#define  Pragma_Elaborate                     70
-#define  Pragma_Elaborate_All                 71
-#define  Pragma_Elaborate_Body                72
-#define  Pragma_Export                        73
-#define  Pragma_Export_Exception              74
-#define  Pragma_Export_Function               75
-#define  Pragma_Export_Object                 76
-#define  Pragma_Export_Procedure              77
-#define  Pragma_Export_Value                  78
-#define  Pragma_Export_Valued_Procedure       79
-#define  Pragma_External                      80
-#define  Pragma_Finalize_Storage_Only         81
-#define  Pragma_Ident                         82
-#define  Pragma_Import                        83
-#define  Pragma_Import_Exception              84
-#define  Pragma_Import_Function               85
-#define  Pragma_Import_Object                 86
-#define  Pragma_Import_Procedure              87
-#define  Pragma_Import_Valued_Procedure       88
-#define  Pragma_Inline                        89
-#define  Pragma_Inline_Always                 90
-#define  Pragma_Inline_Generic                91
-#define  Pragma_Inspection_Point              92
-#define  Pragma_Interface_Name                93
-#define  Pragma_Interrupt_Handler             94
-#define  Pragma_Interrupt_Priority            95
-#define  Pragma_Java_Constructor              96
-#define  Pragma_Java_Interface                97
-#define  Pragma_Keep_Names                    98
-#define  Pragma_Link_With                     99
-#define  Pragma_Linker_Alias                  100
-#define  Pragma_Linker_Constructor            101
-#define  Pragma_Linker_Destructor             102
-#define  Pragma_Linker_Options                103
-#define  Pragma_Linker_Section                104
-#define  Pragma_List                          105
-#define  Pragma_Machine_Attribute             106
-#define  Pragma_Main                          107
-#define  Pragma_Main_Storage                  108
-#define  Pragma_Memory_Size                   109
-#define  Pragma_No_Return                     110
-#define  Pragma_Obsolescent                   111
-#define  Pragma_Optimize                      112
-#define  Pragma_Optional_Overriding           113
-#define  Pragma_Pack                          114
-#define  Pragma_Page                          115
-#define  Pragma_Passive                       116
-#define  Pragma_Preelaborable_Initialization  117
-#define  Pragma_Preelaborate                  118
-#define  Pragma_Preelaborate_05               119
-#define  Pragma_Psect_Object                  120
-#define  Pragma_Pure                          121
-#define  Pragma_Pure_05                       122
-#define  Pragma_Pure_Function                 123
-#define  Pragma_Remote_Call_Interface         124
-#define  Pragma_Remote_Types                  125
-#define  Pragma_Share_Generic                 126
-#define  Pragma_Shared                        127
-#define  Pragma_Shared_Passive                128
-#define  Pragma_Source_Reference              129
-#define  Pragma_Stream_Convert                130
-#define  Pragma_Subtitle                      131
-#define  Pragma_Suppress_All                  132
-#define  Pragma_Suppress_Debug_Info           133
-#define  Pragma_Suppress_Initialization       134
-#define  Pragma_System_Name                   135
-#define  Pragma_Task_Info                     136
-#define  Pragma_Task_Name                     137
-#define  Pragma_Task_Storage                  138
-#define  Pragma_Thread_Body                   139
-#define  Pragma_Time_Slice                    140
-#define  Pragma_Title                         141
-#define  Pragma_Unchecked_Union               142
-#define  Pragma_Unimplemented_Unit            143
-#define  Pragma_Unreferenced                  144
-#define  Pragma_Unreserve_All_Interrupts      145
-#define  Pragma_Volatile                      146
-#define  Pragma_Volatile_Components           147
-#define  Pragma_Weak_External                 148
-#define  Pragma_AST_Entry                     149
-#define  Pragma_Interface                     150
-#define  Pragma_Priority                      151
-#define  Pragma_Storage_Size                  152
-#define  Pragma_Storage_Unit                  153
+#define  Pragma_Compile_Time_Error            6
+#define  Pragma_Compile_Time_Warning          7
+#define  Pragma_Component_Alignment           8
+#define  Pragma_Convention_Identifier         9
+#define  Pragma_Debug_Policy                  10
+#define  Pragma_Detect_Blocking               11
+#define  Pragma_Discard_Names                 12
+#define  Pragma_Elaboration_Checks            13
+#define  Pragma_Eliminate                     14
+#define  Pragma_Explicit_Overriding           15
+#define  Pragma_Extend_System                 16
+#define  Pragma_Extensions_Allowed            17
+#define  Pragma_External_Name_Casing          18
+#define  Pragma_Float_Representation          19
+#define  Pragma_Initialize_Scalars            20
+#define  Pragma_Interrupt_State               21
+#define  Pragma_License                       22
+#define  Pragma_Locking_Policy                23
+#define  Pragma_Long_Float                    24
+#define  Pragma_No_Run_Time                   25
+#define  Pragma_No_Strict_Aliasing            26
+#define  Pragma_Normalize_Scalars             27
+#define  Pragma_Polling                       28
+#define  Pragma_Persistent_BSS                29
+#define  Pragma_Priority_Specific_Dispatching 30
+#define  Pragma_Profile                       31
+#define  Pragma_Profile_Warnings              32
+#define  Pragma_Propagate_Exceptions          33
+#define  Pragma_Queuing_Policy                34
+#define  Pragma_Ravenscar                     35
+#define  Pragma_Restricted_Run_Time           36
+#define  Pragma_Restrictions                  37
+#define  Pragma_Restriction_Warnings          38
+#define  Pragma_Reviewable                    39
+#define  Pragma_Source_File_Name              40
+#define  Pragma_Source_File_Name_Project      41
+#define  Pragma_Style_Checks                  42
+#define  Pragma_Suppress                      43
+#define  Pragma_Suppress_Exception_Locations  44
+#define  Pragma_Task_Dispatching_Policy       45
+#define  Pragma_Universal_Data                46
+#define  Pragma_Unsuppress                    47
+#define  Pragma_Use_VADS_Size                 48
+#define  Pragma_Validity_Checks               49
+#define  Pragma_Warnings                      50
+#define  Pragma_Wide_Character_Encoding       51
+#define  Pragma_Abort_Defer                   52
+#define  Pragma_All_Calls_Remote              53
+#define  Pragma_Annotate                      54
+#define  Pragma_Assert                        55
+#define  Pragma_Asynchronous                  56
+#define  Pragma_Atomic                        57
+#define  Pragma_Atomic_Components             58
+#define  Pragma_Attach_Handler                59
+#define  Pragma_Comment                       60
+#define  Pragma_Common_Object                 61
+#define  Pragma_Complete_Representation       62
+#define  Pragma_Complex_Representation        63
+#define  Pragma_Controlled                    64
+#define  Pragma_Convention                    65
+#define  Pragma_CPP_Class                     66
+#define  Pragma_CPP_Constructor               67
+#define  Pragma_CPP_Virtual                   68
+#define  Pragma_CPP_Vtable                    69
+#define  Pragma_Debug                         70
+#define  Pragma_Elaborate                     71
+#define  Pragma_Elaborate_All                 72
+#define  Pragma_Elaborate_Body                73
+#define  Pragma_Export                        74
+#define  Pragma_Export_Exception              75
+#define  Pragma_Export_Function               76
+#define  Pragma_Export_Object                 77
+#define  Pragma_Export_Procedure              78
+#define  Pragma_Export_Value                  79
+#define  Pragma_Export_Valued_Procedure       80
+#define  Pragma_External                      81
+#define  Pragma_Finalize_Storage_Only         82
+#define  Pragma_Ident                         83
+#define  Pragma_Import                        84
+#define  Pragma_Import_Exception              85
+#define  Pragma_Import_Function               86
+#define  Pragma_Import_Object                 87
+#define  Pragma_Import_Procedure              88
+#define  Pragma_Import_Valued_Procedure       89
+#define  Pragma_Inline                        90
+#define  Pragma_Inline_Always                 91
+#define  Pragma_Inline_Generic                92
+#define  Pragma_Inspection_Point              93
+#define  Pragma_Interface_Name                94
+#define  Pragma_Interrupt_Handler             95
+#define  Pragma_Interrupt_Priority            96
+#define  Pragma_Java_Constructor              97
+#define  Pragma_Java_Interface                98
+#define  Pragma_Keep_Names                    99
+#define  Pragma_Link_With                     100
+#define  Pragma_Linker_Alias                  101
+#define  Pragma_Linker_Constructor            102
+#define  Pragma_Linker_Destructor             103
+#define  Pragma_Linker_Options                104
+#define  Pragma_Linker_Section                105
+#define  Pragma_List                          106
+#define  Pragma_Machine_Attribute             107
+#define  Pragma_Main                          108
+#define  Pragma_Main_Storage                  109
+#define  Pragma_Memory_Size                   110
+#define  Pragma_No_Return                     111
+#define  Pragma_Obsolescent                   112
+#define  Pragma_Optimize                      113
+#define  Pragma_Optional_Overriding           114
+#define  Pragma_Pack                          115
+#define  Pragma_Page                          116
+#define  Pragma_Passive                       117
+#define  Pragma_Preelaborable_Initialization  118
+#define  Pragma_Preelaborate                  119
+#define  Pragma_Preelaborate_05               120
+#define  Pragma_Psect_Object                  121
+#define  Pragma_Pure                          122
+#define  Pragma_Pure_05                       123
+#define  Pragma_Pure_Function                 124
+#define  Pragma_Remote_Call_Interface         125
+#define  Pragma_Remote_Types                  126
+#define  Pragma_Share_Generic                 127
+#define  Pragma_Shared                        128
+#define  Pragma_Shared_Passive                129
+#define  Pragma_Source_Reference              130
+#define  Pragma_Stream_Convert                131
+#define  Pragma_Subtitle                      132
+#define  Pragma_Suppress_All                  133
+#define  Pragma_Suppress_Debug_Info           134
+#define  Pragma_Suppress_Initialization       135
+#define  Pragma_System_Name                   136
+#define  Pragma_Task_Info                     137
+#define  Pragma_Task_Name                     138
+#define  Pragma_Task_Storage                  139
+#define  Pragma_Thread_Body                   140
+#define  Pragma_Time_Slice                    141
+#define  Pragma_Title                         142
+#define  Pragma_Unchecked_Union               143
+#define  Pragma_Unimplemented_Unit            144
+#define  Pragma_Unreferenced                  145
+#define  Pragma_Unreferenced_Objects          146
+#define  Pragma_Unreserve_All_Interrupts      147
+#define  Pragma_Volatile                      148
+#define  Pragma_Volatile_Components           149
+#define  Pragma_Weak_External                 150
+#define  Pragma_AST_Entry                     151
+#define  Pragma_Interface                     152
+#define  Pragma_Priority                      153
+#define  Pragma_Storage_Size                  154
+#define  Pragma_Storage_Unit                  155
 
 /* End of snames.h (C version of Snames package spec) */
index bd30fb9..fbc0e8f 100644 (file)
@@ -24,8 +24,6 @@
 --                                                                          --
 ------------------------------------------------------------------------------
 
-with GNAT.OS_Lib; use GNAT.OS_Lib;
-
 with Debug;    use Debug;
 with Lib;      use Lib;
 with Osint;    use Osint;
@@ -35,6 +33,8 @@ with Validsw;  use Validsw;
 with Sem_Warn; use Sem_Warn;
 with Stylesw;  use Stylesw;
 
+with GNAT.OS_Lib; use GNAT.OS_Lib;
+
 with System.WCh_Con; use System.WCh_Con;
 
 package body Switch.C is
@@ -47,24 +47,29 @@ package body Switch.C is
    -----------------------------
 
    procedure Scan_Front_End_Switches (Switch_Chars : String) is
-      Switch_Starts_With_Gnat : Boolean;
-      --  True if first four switch characters are "gnat"
-
       First_Switch : Boolean := True;
       --  False for all but first switch
 
-      Ptr : Integer := Switch_Chars'First;
-      Max : constant Integer := Switch_Chars'Last;
+      Max : constant Natural := Switch_Chars'Last;
+      Ptr : Natural;
       C   : Character := ' ';
       Dot : Boolean;
 
-      Store_Switch : Boolean  := True;
-      First_Char   : Integer  := Ptr;
-      Storing      : String   := Switch_Chars;
-      First_Stored : Positive := Ptr + 1;
-      --  The above need comments ???
+      Store_Switch : Boolean;
+      --  For -gnatxx switches, the normal processing, signalled by this flag
+      --  being set to True, is to store the switch on exit from the case
+      --  statement, the switch stored is -gnat followed by the characters
+      --  from First_Char to Ptr-1. For cases like -gnaty, where the switch
+      --  is stored in separate pieces, this flag is set to False, and the
+      --  appropriate calls to Store_Compilation_Switch are made from within
+      --  the case branch.
+
+      First_Char : Positive;
+      --  Marks start of switch to be stored
 
    begin
+      Ptr := Switch_Chars'First;
+
       --  Skip past the initial character (must be the switch character)
 
       if Ptr = Max then
@@ -73,123 +78,120 @@ package body Switch.C is
          Ptr := Ptr + 1;
       end if;
 
-      --  Remove "gnat" from the switch, if present
+      --  Handle switches that do not start with -gnat
 
-      Switch_Starts_With_Gnat :=
-        Ptr + 3 <= Max and then Switch_Chars (Ptr .. Ptr + 3) = "gnat";
+      if Ptr + 3 > Max
+        or else Switch_Chars (Ptr .. Ptr + 3) /= "gnat"
+      then
+         --  There are two front-end switches that do not start with -gnat:
+         --  -I, --RTS
 
-      if Switch_Starts_With_Gnat then
-         Ptr := Ptr + 4;
-         First_Stored := Ptr;
-      end if;
+         if Switch_Chars (Ptr) = 'I' then
 
-      --  Loop to scan through switches given in switch string
+            --  Set flag Search_Directory_Present if switch is "-I" only:
+            --  the directory will be the next argument.
 
-      while Ptr <= Max loop
-         Store_Switch := True;
-         First_Char := Ptr;
-         C := Switch_Chars (Ptr);
+            if Ptr = Max then
+               Search_Directory_Present := True;
+               return;
+            end if;
 
-         --  Processing for a switch
+            Ptr := Ptr + 1;
 
-         case Switch_Starts_With_Gnat is
+            --  Find out whether this is a -I- or regular -Ixxx switch
 
-            when False =>
+            --  Note: -I switches are not recorded in the ALI file, since the
+            --  meaning of the program depends on the source files compiled,
+            --  not where they came from.
 
-            --  There are few front-end switches that
-            --  do not start with -gnat: -I, --RTS
+            if Ptr = Max and then Switch_Chars (Ptr) = '-' then
+               Look_In_Primary_Dir := False;
+            else
+               Add_Src_Search_Dir (Switch_Chars (Ptr .. Max));
+            end if;
 
-               if Switch_Chars (Ptr) = 'I' then
-                  Store_Switch := False;
+         --  Processing of the --RTS switch. --RTS has been modified by
+         --  gcc and is now of the form -fRTS.
 
-                  --  Set flag Search_Directory_Present if switch is "-I" only:
-                  --  the directory will be the next argument.
+         elsif Ptr + 3 <= Max
+           and then Switch_Chars (Ptr .. Ptr + 3) = "fRTS"
+         then
+            Ptr := Ptr + 1;
 
-                  if Ptr = Max then
-                     Search_Directory_Present := True;
-                     return;
-                  end if;
+            if Ptr + 4 > Max
+              or else Switch_Chars (Ptr + 3) /= '='
+            then
+               Osint.Fail ("missing path for --RTS");
+            else
+               --  Check that this is the first time --RTS is specified or if
+               --  it is not the first time, the same path has been specified.
 
-                  Ptr := Ptr + 1;
+               if RTS_Specified = null then
+                  RTS_Specified :=
+                    new String'(Switch_Chars (Ptr + 4 .. Max));
 
-                  --  Find out whether this is a -I- or regular -Ixxx switch
+               elsif
+                 RTS_Specified.all /= Switch_Chars (Ptr + 4 .. Max)
+               then
+                  Osint.Fail
+                    ("--RTS cannot be specified multiple times");
+               end if;
 
-                  if Ptr = Max and then Switch_Chars (Ptr) = '-' then
-                     Look_In_Primary_Dir := False;
+               --  Valid --RTS switch
 
-                  else
-                     Add_Src_Search_Dir (Switch_Chars (Ptr .. Max));
-                  end if;
+               Opt.No_Stdinc := True;
+               Opt.RTS_Switch := True;
 
-                  Ptr := Max + 1;
+               RTS_Src_Path_Name :=
+                 Get_RTS_Search_Dir
+                   (Switch_Chars (Ptr + 4 .. Max), Include);
 
-               --  Processing of the --RTS switch. --RTS has been modified by
-               --  gcc and is now of the form -fRTS
+               RTS_Lib_Path_Name :=
+                 Get_RTS_Search_Dir
+                   (Switch_Chars (Ptr + 4 .. Max), Objects);
 
-               elsif Ptr + 3 <= Max
-                 and then Switch_Chars (Ptr .. Ptr + 3) = "fRTS"
+               if RTS_Src_Path_Name /= null
+                 and then RTS_Lib_Path_Name /= null
                then
-                  Ptr := Ptr + 1;
-
-                  if Ptr + 4 > Max
-                    or else Switch_Chars (Ptr + 3) /= '='
-                  then
-                     Osint.Fail ("missing path for --RTS");
-                  else
-                     --  Check that this is the first time --RTS is specified
-                     --  or if it is not the first time, the same path has
-                     --  been specified.
+                  --  Store the -fRTS switch (Note: Store_Compilation_Switch
+                  --  changes -fRTS back into --RTS for the actual output).
 
-                     if RTS_Specified = null then
-                        RTS_Specified :=
-                          new String'(Switch_Chars (Ptr + 4 .. Max));
+                  Store_Compilation_Switch (Switch_Chars);
 
-                     elsif
-                       RTS_Specified.all /= Switch_Chars (Ptr + 4 .. Max)
-                     then
-                        Osint.Fail
-                          ("--RTS cannot be specified multiple times");
-                     end if;
+               elsif RTS_Src_Path_Name = null
+                 and then RTS_Lib_Path_Name = null
+               then
+                  Osint.Fail ("RTS path not valid: missing " &
+                              "adainclude and adalib directories");
 
-                     --  Valid --RTS switch
+               elsif RTS_Src_Path_Name = null then
+                  Osint.Fail ("RTS path not valid: missing " &
+                              "adainclude directory");
 
-                     Opt.No_Stdinc := True;
-                     Opt.RTS_Switch := True;
+               elsif RTS_Lib_Path_Name = null then
+                  Osint.Fail ("RTS path not valid: missing " &
+                              "adalib directory");
+               end if;
+            end if;
 
-                     RTS_Src_Path_Name := Get_RTS_Search_Dir
-                                            (Switch_Chars (Ptr + 4 .. Max),
-                                             Include);
-                     RTS_Lib_Path_Name := Get_RTS_Search_Dir
-                                            (Switch_Chars (Ptr + 4 .. Max),
-                                             Objects);
+            --  There are no other switches not starting with -gnat
 
-                     if RTS_Src_Path_Name /= null and then
-                        RTS_Lib_Path_Name /= null
-                     then
-                        Ptr := Max + 1;
+         else
+            Bad_Switch (C);
+         end if;
 
-                     elsif RTS_Src_Path_Name = null and then
-                           RTS_Lib_Path_Name = null
-                     then
-                        Osint.Fail ("RTS path not valid: missing " &
-                                    "adainclude and adalib directories");
+      --  Case of switch starting with -gnat
 
-                     elsif RTS_Src_Path_Name = null then
-                        Osint.Fail ("RTS path not valid: missing " &
-                                    "adainclude directory");
+      else
+         Ptr := Ptr + 4;
 
-                     elsif RTS_Lib_Path_Name = null then
-                        Osint.Fail ("RTS path not valid: missing " &
-                                    "adalib directory");
-                     end if;
-                  end if;
-               else
-                  Bad_Switch (C);
-               end if;
+         --  Loop to scan through switches given in switch string
 
-         when True =>
+         while Ptr <= Max loop
+            First_Char := Ptr;
+            Store_Switch := True;
 
-            --  Process -gnat* options
+            C := Switch_Chars (Ptr);
 
             case C is
 
@@ -229,7 +231,6 @@ package body Switch.C is
 
             when 'd' =>
                Store_Switch := False;
-               Storing (First_Stored) := 'd';
                Dot := False;
 
                --  Note: for the debug switch, the remaining characters in this
@@ -249,17 +250,10 @@ package body Switch.C is
                   then
                      if Dot then
                         Set_Dotted_Debug_Flag (C);
-                        Storing (First_Stored + 1) := '.';
-                        Storing (First_Stored + 2) := C;
-                        Store_Compilation_Switch
-                          (Storing (Storing'First .. First_Stored + 2));
-                        Dot := False;
-
+                        Store_Compilation_Switch ("-gnatd." & C);
                      else
                         Set_Debug_Flag (C);
-                        Storing (First_Stored + 1) := C;
-                        Store_Compilation_Switch
-                          (Storing (Storing'First .. First_Stored + 1));
+                        Store_Compilation_Switch ("-gnatd" & C);
                      end if;
 
                   elsif C = '.' then
@@ -349,7 +343,7 @@ package body Switch.C is
 
                      return;
 
-                  --  -gnateD switch (symbol definition)
+                  --  -gnateD switch (preprocessing symbol definition)
 
                   when 'D' =>
                      Store_Switch := False;
@@ -363,13 +357,9 @@ package body Switch.C is
 
                      --  Store the switch
 
-                     Storing (First_Stored .. First_Stored + 1) := "eD";
-                     Storing
-                       (First_Stored + 2 .. First_Stored + Max - Ptr + 2) :=
-                       Switch_Chars (Ptr .. Max);
-                     Store_Compilation_Switch (Storing
-                              (Storing'First .. First_Stored + Max - Ptr + 2));
-                     return;
+                     Store_Compilation_Switch
+                       ("-gnateD" & Switch_Chars (Ptr .. Max));
+                     Ptr := Max + 1;
 
                   --  -gnatef (full source path for brief error messages)
 
@@ -383,8 +373,7 @@ package body Switch.C is
 
                   when 'I' =>
                      Ptr := Ptr + 1;
-                     Scan_Pos
-                       (Switch_Chars, Max, Ptr, Multiple_Unit_Index, C);
+                     Scan_Pos (Switch_Chars, Max, Ptr, Multiple_Unit_Index, C);
 
                   --  -gnatem (mapping file)
 
@@ -427,22 +416,12 @@ package body Switch.C is
                      Preprocessing_Data_File :=
                        new String'(Switch_Chars (Ptr .. Max));
 
-                     --  Store the switch.
-                     --  Because we may store a longer switch (we normalize
-                     --  to -gnatep=), use a local variable.
+                     --  Store the switch, normalizing to -gnatep=
 
-                     declare
-                        To_Store : String
-                          (1 .. Preprocessing_Data_File'Length + 8);
-
-                     begin
-                        To_Store (1 .. 8) := "-gnatep=";
-                        To_Store (9 .. Preprocessing_Data_File'Length + 8) :=
-                          Preprocessing_Data_File.all;
-                        Store_Compilation_Switch (To_Store);
-                     end;
+                     Store_Compilation_Switch
+                       ("-gnatep=" & Preprocessing_Data_File.all);
 
-                  return;
+                     Ptr := Max + 1;
 
                   when 'z' =>
                      Store_Switch := False;
@@ -509,7 +488,7 @@ package body Switch.C is
                Warn_On_Unchecked_Conversion := True;
                Warn_On_Unrecognized_Pragma  := True;
 
-               Set_Style_Check_Options ("3abcdefhiklmnprstux");
+               Set_Style_Check_Options ("3aAbcdefhiklmnprstux");
 
             --  Processing for G switch
 
@@ -680,10 +659,10 @@ package body Switch.C is
             --  Processing for R switch
 
             when 'R' =>
-               Ptr := Ptr + 1;
                Back_Annotate_Rep_Info := True;
                List_Representation_Info := 1;
 
+               Ptr := Ptr + 1;
                while Ptr <= Max loop
                   C := Switch_Chars (Ptr);
 
@@ -761,7 +740,6 @@ package body Switch.C is
 
             when 'V' =>
                Store_Switch := False;
-               Storing (First_Stored) := 'V';
                Ptr := Ptr + 1;
 
                if Ptr > Max then
@@ -780,10 +758,8 @@ package body Switch.C is
                      end if;
 
                      for Index in First_Char + 1 .. Max loop
-                        Storing (First_Stored + 1) :=
-                          Switch_Chars (Index);
                         Store_Compilation_Switch
-                          (Storing (Storing'First .. First_Stored + 1));
+                          ("-gnatV" & Switch_Chars (Index));
                      end loop;
                   end;
                end if;
@@ -794,7 +770,6 @@ package body Switch.C is
 
             when 'w' =>
                Store_Switch := False;
-               Storing (First_Stored) := 'w';
                Ptr := Ptr + 1;
 
                if Ptr > Max then
@@ -804,16 +779,26 @@ package body Switch.C is
                while Ptr <= Max loop
                   C := Switch_Chars (Ptr);
 
-                  if Set_Warning_Switch (C) then
-                     null;
-                  else
-                     Bad_Switch (C);
-                  end if;
+                  --  Case of dot switch
 
-                  if C /= 'w' then
-                     Storing (First_Stored + 1) := C;
-                     Store_Compilation_Switch
-                       (Storing (Storing'First .. First_Stored + 1));
+                  if C = '.' and then Ptr < Max then
+                     Ptr := Ptr + 1;
+                     C := Switch_Chars (Ptr);
+
+                     if Set_Dot_Warning_Switch (C) then
+                        Store_Compilation_Switch ("-gnatw." & C);
+                     else
+                        Bad_Switch (C);
+                     end if;
+
+                     --  Normal case, no dot
+
+                  else
+                     if Set_Warning_Switch (C) then
+                        Store_Compilation_Switch ("-gnatw" & C);
+                     else
+                        Bad_Switch (C);
+                     end if;
                   end if;
 
                   Ptr := Ptr + 1;
@@ -855,8 +840,6 @@ package body Switch.C is
             when 'X' =>
                Ptr := Ptr + 1;
                Extensions_Allowed := True;
-               Ada_Version := Ada_Version_Type'Last;
-               Ada_Version_Explicit := Ada_Version;
 
             --  Processing for y switch
 
@@ -868,11 +851,9 @@ package body Switch.C is
 
                else
                   Store_Switch := False;
-                  Storing (First_Stored) := 'y';
 
                   declare
                      OK  : Boolean;
-                     Last_Stored : Integer;
 
                   begin
                      Set_Style_Check_Options
@@ -886,24 +867,22 @@ package body Switch.C is
 
                      Ptr := First_Char + 1;
                      while Ptr <= Max loop
-                        Last_Stored := First_Stored + 1;
-                        Storing (Last_Stored) := Switch_Chars (Ptr);
-
                         if Switch_Chars (Ptr) = 'M' then
+                           First_Char := Ptr;
                            loop
                               Ptr := Ptr + 1;
                               exit when Ptr > Max
                                 or else Switch_Chars (Ptr) not in '0' .. '9';
-                              Last_Stored := Last_Stored + 1;
-                              Storing (Last_Stored) := Switch_Chars (Ptr);
                            end loop;
 
+                           Store_Compilation_Switch
+                             ("-gnaty" & Switch_Chars (First_Char .. Ptr - 1));
+
                         else
+                           Store_Compilation_Switch
+                             ("-gnaty" & Switch_Chars (Ptr));
                            Ptr := Ptr + 1;
                         end if;
-
-                        Store_Compilation_Switch
-                          (Storing (Storing'First .. Last_Stored));
                      end loop;
                   end;
                end if;
@@ -929,7 +908,6 @@ package body Switch.C is
                   end case;
 
                   Ptr := Ptr + 1;
-
                end if;
 
             --  Processing for Z switch
@@ -1000,17 +978,15 @@ package body Switch.C is
             when others =>
                Bad_Switch (C);
             end case;
-         end case;
 
-         if Store_Switch then
-            Storing (First_Stored .. First_Stored + Ptr - First_Char - 1) :=
-              Switch_Chars (First_Char .. Ptr - 1);
-            Store_Compilation_Switch
-              (Storing (Storing'First .. First_Stored + Ptr - First_Char - 1));
-         end if;
+            if Store_Switch then
+               Store_Compilation_Switch
+                 ("-gnat" & Switch_Chars (First_Char .. Ptr - 1));
+            end if;
 
-         First_Switch := False;
-      end loop;
+            First_Switch := False;
+         end loop;
+      end if;
    end Scan_Front_End_Switches;
 
 end Switch.C;