OSDN Git Service

2007-04-20 Eric Botcazou <ebotcazou@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / sem_prag.adb
index 73a4b08..5f4b95d 100644 (file)
@@ -6,9 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                            $Revision$
---                                                                          --
---          Copyright (C) 1992-2001, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2007, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
 -- for  more details.  You should have  received  a copy of the GNU General --
 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
+-- Boston, MA 02110-1301, USA.                                              --
 --                                                                          --
 -- GNAT was originally developed  by the GNAT team at  New York University. --
--- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
 --                                                                          --
 ------------------------------------------------------------------------------
 
@@ -37,24 +35,24 @@ 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 Expander; use Expander;
 with Exp_Dist; use Exp_Dist;
-with Fname;    use Fname;
-with Hostparm; use Hostparm;
 with Lib;      use Lib;
+with Lib.Writ; use Lib.Writ;
+with Lib.Xref; use Lib.Xref;
 with Namet;    use Namet;
 with Nlists;   use Nlists;
 with Nmake;    use Nmake;
 with Opt;      use Opt;
 with Output;   use Output;
 with Restrict; use Restrict;
+with Rident;   use Rident;
 with Rtsfind;  use Rtsfind;
 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;
 with Sem_Intr; use Sem_Intr;
@@ -63,6 +61,7 @@ with Sem_Res;  use Sem_Res;
 with Sem_Type; use Sem_Type;
 with Sem_Util; use Sem_Util;
 with Sem_VFpt; use Sem_VFpt;
+with Sem_Warn; use Sem_Warn;
 with Stand;    use Stand;
 with Sinfo;    use Sinfo;
 with Sinfo.CN; use Sinfo.CN;
@@ -70,6 +69,7 @@ with Sinput;   use Sinput;
 with Snames;   use Snames;
 with Stringt;  use Stringt;
 with Stylesw;  use Stylesw;
+with Table;
 with Targparm; use Targparm;
 with Tbuild;   use Tbuild;
 with Ttypes;
@@ -77,6 +77,8 @@ with Uintp;    use Uintp;
 with Urealp;   use Urealp;
 with Validsw;  use Validsw;
 
+with GNAT.Spelling_Checker; use GNAT.Spelling_Checker;
+
 package body Sem_Prag is
 
    ----------------------------------------------
@@ -134,6 +136,26 @@ package body Sem_Prag is
    --  design and implementation and are intended to be fully compatible
    --  with the use of these pragmas in the DEC Ada compiler.
 
+   --------------------------------------------
+   -- Checking for Duplicated External Names --
+   --------------------------------------------
+
+   --  It is suspicious if two separate Export pragmas use the same external
+   --  name. The following table is used to diagnose this situation so that
+   --  an appropriate warning can be issued.
+
+   --  The Node_Id stored is for the N_String_Literal node created to
+   --  hold the value of the external name. The Sloc of this node is
+   --  used to cross-reference the location of the duplication.
+
+   package Externals is new Table.Table (
+     Table_Component_Type => Node_Id,
+     Table_Index_Type     => Int,
+     Table_Low_Bound      => 0,
+     Table_Initial        => 100,
+     Table_Increment      => 100,
+     Table_Name           => "Name_Externals");
+
    -------------------------------------
    -- Local Subprograms and Variables --
    -------------------------------------
@@ -146,28 +168,22 @@ package body Sem_Prag is
    --  it is set to Uppercase or Lowercase, then a new string literal with
    --  appropriate casing is constructed.
 
-   function Is_Generic_Subprogram (Id : Entity_Id) return Boolean;
-   --  Return True if Id is a generic procedure or a function
-
    function Get_Base_Subprogram (Def_Id : Entity_Id) return Entity_Id;
    --  If Def_Id refers to a renamed subprogram, then the base subprogram
    --  (the original one, following the renaming chain) is returned.
    --  Otherwise the entity is returned unchanged. Should be in Einfo???
 
+   procedure rv;
+   --  This is a dummy function called by the processing for pragma Reviewable.
+   --  It is there for assisting front end debugging. By placing a Reviewable
+   --  pragma in the source program, a breakpoint on rv catches this place in
+   --  the source, allowing convenient stepping to the point of interest.
+
    procedure Set_Unit_Name (N : Node_Id; With_Item : Node_Id);
    --  Place semantic information on the argument of an Elaborate or
    --  Elaborate_All pragma. Entity name for unit and its parents is
    --  taken from item in previous with_clause that mentions the unit.
 
-   Locking_Policy_Sloc          : Source_Ptr := No_Location;
-   Queuing_Policy_Sloc          : Source_Ptr := No_Location;
-   Task_Dispatching_Policy_Sloc : Source_Ptr := No_Location;
-   --  These global variables remember the location of a previous locking,
-   --  queuing or task dispatching policy pragma, so that appropriate error
-   --  messages can be generated for inconsistent pragmas. Note that it is
-   --  fine that these are global locations, because the check for consistency
-   --  is over the entire program.
-
    -------------------------------
    -- Adjust_External_Name_Case --
    -------------------------------
@@ -224,8 +240,9 @@ package body Sem_Prag is
 
       Pragma_Exit : exception;
       --  This exception is used to exit pragma processing completely. It
-      --  is used when an error is detected, and in other situations where
-      --  it is known that no further processing is required.
+      --  is used when an error is detected, and no further processing is
+      --  required. It is also used if an earlier error has left the tree
+      --  in a state where the pragma should not be processed.
 
       Arg_Count : Nat;
       --  Number of pragma argument associations
@@ -237,6 +254,15 @@ package body Sem_Prag is
       --  First four pragma arguments (pragma argument association nodes,
       --  or Empty if the corresponding argument does not exist).
 
+      type Name_List is array (Natural range <>) of Name_Id;
+      type Args_List is array (Natural range <>) of Node_Id;
+      --  Types used for arguments to Check_Arg_Order and Gather_Associations
+
+      procedure Ada_2005_Pragma;
+      --  Called for pragmas defined in Ada 2005, that are not in Ada 95. In
+      --  Ada 95 mode, these are implementation defined pragmas, so should be
+      --  caught by the No_Implementation_Pragmas restriction
+
       procedure Check_Ada_83_Warning;
       --  Issues a warning message for the current pragma if operating in Ada
       --  83 mode (used for language pragmas that are not a standard part of
@@ -252,6 +278,12 @@ package body Sem_Prag is
       --  in which case the check is applied to the expression of the
       --  association or an expression directly.
 
+      procedure Check_Arg_Is_External_Name (Arg : Node_Id);
+      --  Check that an argument has the right form for an EXTERNAL_NAME
+      --  parameter of an extended import/export pragma. The rule is that
+      --  the name must be an identifier or string literal (in Ada 83 mode)
+      --  or a static string expression (in Ada 95 mode).
+
       procedure Check_Arg_Is_Identifier (Arg : Node_Id);
       --  Check the specified argument Arg to make sure that it is an
       --  identifier. If not give error and raise Pragma_Exit.
@@ -304,12 +336,27 @@ package body Sem_Prag is
       --  valid task dispatching policy name. If not give error and raise
       --  Pragma_Exit.
 
+      procedure Check_Arg_Order (Names : Name_List);
+      --  Checks for an instance of two arguments with identifiers for the
+      --  current pragma which are not in the sequence indicated by Names,
+      --  and if so, generates a fatal message about bad order of arguments.
+
       procedure Check_At_Least_N_Arguments (N : Nat);
       --  Check there are at least N arguments present
 
       procedure Check_At_Most_N_Arguments (N : Nat);
       --  Check there are no more than N arguments present
 
+      procedure Check_Component (Comp : Node_Id);
+      --  Examine Unchecked_Union component for correct use of per-object
+      --  constrained subtypes, and for restrictions on finalizable components.
+
+      procedure Check_Duplicated_Export_Name (Nam : Node_Id);
+      --  Nam is an N_String_Literal node containing the external name set
+      --  by an Import or Export pragma (or extended Import or Export pragma).
+      --  This procedure checks for possible duplications if this is the
+      --  export case, and if found, issues an appropriate error message.
+
       procedure Check_First_Subtype (Arg : Node_Id);
       --  Checks that Arg, whose expression is an entity name referencing
       --  a subtype, does not reference a type that is not a first subtype.
@@ -337,10 +384,6 @@ package body Sem_Prag is
       --  If any argument has an identifier, then an error message is issued,
       --  and Pragma_Exit is raised.
 
-      procedure Check_Non_Overloaded_Function (Arg : Node_Id);
-      --  Check that the given argument is the name of a local function of
-      --  one argument that is not overloaded in the current local scope.
-
       procedure Check_Optional_Identifier (Arg : Node_Id; Id : Name_Id);
       --  Checks if the given argument has an identifier, and if so, requires
       --  it to match the given identifier name. If there is a non-matching
@@ -371,6 +414,10 @@ package body Sem_Prag is
       --  and to library level instantiations), and they are simply ignored,
       --  which is implemented by rewriting them as null statements.
 
+      procedure Check_Variant (Variant : Node_Id);
+      --  Check Unchecked_Union variant for lack of nested variants and
+      --  presence of at least one component.
+
       procedure Error_Pragma (Msg : String);
       pragma No_Return (Error_Pragma);
       --  Outputs error message for current pragma. The message contains an %
@@ -415,8 +462,13 @@ package body Sem_Prag is
       --  unit pragma that is not a compilation unit pragma, then the
       --  identifier must be visible.
 
-      type Name_List is array (Natural range <>) of Name_Id;
-      type Args_List is array (Natural range <>) of Node_Id;
+      function Find_Unique_Parameterless_Procedure
+        (Name : Entity_Id;
+         Arg  : Node_Id) return Entity_Id;
+      --  Used for a procedure pragma to find the unique parameterless
+      --  procedure identified by Name, returns it if it exists, otherwise
+      --  errors out and uses Arg as the pragma argument for the message.
+
       procedure Gather_Associations
         (Names : Name_List;
          Args  : out Args_List);
@@ -440,19 +492,26 @@ package body Sem_Prag is
       --  returned, otherwise Arg is returned unchanged.
 
       procedure GNAT_Pragma;
-      --  Called for all GNAT defined pragmas to note the use of the feature,
-      --  and also check the relevant restriction (No_Implementation_Pragmas).
+      --  Called for all GNAT defined pragmas to check the relevant restriction
+      --  (No_Implementation_Pragmas).
 
       function Is_Before_First_Decl
         (Pragma_Node : Node_Id;
-         Decls       : List_Id)
-         return        Boolean;
+         Decls       : List_Id) return Boolean;
       --  Return True if Pragma_Node is before the first declarative item in
       --  Decls where Decls is the list of declarative items.
 
       function Is_Configuration_Pragma return Boolean;
       --  Deterermines if the placement of the current pragma is appropriate
-      --  for a configuration pragma (precedes the current compilation unit)
+      --  for a configuration pragma (precedes the current compilation unit).
+
+      function Is_In_Context_Clause return Boolean;
+      --  Returns True if pragma appears within the context clause of a unit,
+      --  and False for any other placement (does not generate any messages).
+
+      function Is_Static_String_Expression (Arg : Node_Id) return Boolean;
+      --  Analyzes the argument, and determines if it is a static string
+      --  expression, returns True if so, False if non-static or not String.
 
       procedure Pragma_Misplaced;
       --  Issue fatal error message for misplaced pragma
@@ -462,6 +521,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
@@ -536,7 +598,11 @@ package body Sem_Prag is
       --  is set to the default from the subprogram name.
 
       procedure Process_Interrupt_Or_Attach_Handler;
-      --  Attach the pragmas to the rep item chain.
+      --  Common processing for Interrupt and Attach_Handler pragmas
+
+      procedure Process_Restrictions_Or_Restriction_Warnings (Warn : Boolean);
+      --  Common processing for Restrictions and Restriction_Warnings pragmas.
+      --  Warn is False for Restrictions, True for Restriction_Warnings.
 
       procedure Process_Suppress_Unsuppress (Suppress_Case : Boolean);
       --  Common processing for Suppress and Unsuppress. The boolean parameter
@@ -546,7 +612,8 @@ package body Sem_Prag is
       procedure Set_Exported (E : Entity_Id; Arg : Node_Id);
       --  This procedure sets the Is_Exported flag for the given entity,
       --  checking that the entity was not previously imported. Arg is
-      --  the argument that specified the entity.
+      --  the argument that specified the entity. A check is also made
+      --  for exporting inappropriate entities.
 
       procedure Set_Extended_Import_Export_External_Name
         (Internal_Ent : Entity_Id;
@@ -570,15 +637,30 @@ package body Sem_Prag is
       --  argument has the right form then the Mechanism field of Ent is
       --  set appropriately.
 
+      procedure Set_Ravenscar_Profile (N : Node_Id);
+      --  Activate the set of configuration pragmas and restrictions that
+      --  make up the Ravenscar Profile. N is the corresponding pragma
+      --  node, which is used for error messages on any constructs
+      --  that violate the profile.
+
+      ---------------------
+      -- Ada_2005_Pragma --
+      ---------------------
+
+      procedure Ada_2005_Pragma is
+      begin
+         if Ada_Version <= Ada_95 then
+            Check_Restriction (No_Implementation_Pragmas, N);
+         end if;
+      end Ada_2005_Pragma;
+
       --------------------------
       -- Check_Ada_83_Warning --
       --------------------------
 
       procedure Check_Ada_83_Warning is
       begin
-         GNAT_Pragma;
-
-         if Ada_83 and then Comes_From_Source (N) then
+         if Ada_Version = Ada_83 and then Comes_From_Source (N) then
             Error_Msg_N ("(Ada 83) pragma& is non-standard?", N);
          end if;
       end Check_Ada_83_Warning;
@@ -594,13 +676,61 @@ package body Sem_Prag is
          end if;
       end Check_Arg_Count;
 
+      --------------------------------
+      -- Check_Arg_Is_External_Name --
+      --------------------------------
+
+      procedure Check_Arg_Is_External_Name (Arg : Node_Id) is
+         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
+
+      begin
+         if Nkind (Argx) = N_Identifier then
+            return;
+
+         else
+            Analyze_And_Resolve (Argx, Standard_String);
+
+            if Is_OK_Static_Expression (Argx) then
+               return;
+
+            elsif Etype (Argx) = Any_Type then
+               raise Pragma_Exit;
+
+            --  An interesting special case, if we have a string literal and
+            --  we are in Ada 83 mode, then we allow it even though it will
+            --  not be flagged as static. This allows expected Ada 83 mode
+            --  use of external names which are string literals, even though
+            --  technically these are not static in Ada 83.
+
+            elsif Ada_Version = Ada_83
+              and then Nkind (Argx) = N_String_Literal
+            then
+               return;
+
+            --  Static expression that raises Constraint_Error. This has
+            --  already been flagged, so just exit from pragma processing.
+
+            elsif Is_Static_Expression (Argx) then
+               raise Pragma_Exit;
+
+            --  Here we have a real error (non-static expression)
+
+            else
+               Error_Msg_Name_1 := Chars (N);
+               Flag_Non_Static_Expr
+                 ("argument for pragma% must be a identifier or " &
+                  "static string expression!", Argx);
+               raise Pragma_Exit;
+            end if;
+         end if;
+      end Check_Arg_Is_External_Name;
+
       -----------------------------
       -- Check_Arg_Is_Identifier --
       -----------------------------
 
       procedure Check_Arg_Is_Identifier (Arg : Node_Id) is
          Argx : constant Node_Id := Get_Pragma_Arg (Arg);
-
       begin
          if Nkind (Argx) /= N_Identifier then
             Error_Pragma_Arg
@@ -614,7 +744,6 @@ package body Sem_Prag is
 
       procedure Check_Arg_Is_Integer_Literal (Arg : Node_Id) is
          Argx : constant Node_Id := Get_Pragma_Arg (Arg);
-
       begin
          if Nkind (Argx) /= N_Integer_Literal then
             Error_Pragma_Arg
@@ -767,7 +896,9 @@ package body Sem_Prag is
          --  pragmas like Import in Ada 83 mode. They will of course be
          --  flagged with warnings as usual, but will not cause errors.
 
-         elsif Ada_83 and then Nkind (Argx) = N_String_Literal then
+         elsif Ada_Version = Ada_83
+           and then Nkind (Argx) = N_String_Literal
+         then
             return;
 
          --  Static expression that raises Constraint_Error. This has
@@ -779,10 +910,11 @@ package body Sem_Prag is
          --  Finally, we have a real error
 
          else
-            Error_Pragma_Arg
-              ("argument for pragma% must be a static expression", Argx);
+            Error_Msg_Name_1 := Chars (N);
+            Flag_Non_Static_Expr
+              ("argument for pragma% must be a static expression!", Argx);
+            raise Pragma_Exit;
          end if;
-
       end Check_Arg_Is_Static_Expression;
 
       ---------------------------------
@@ -791,13 +923,11 @@ package body Sem_Prag is
 
       procedure Check_Arg_Is_String_Literal (Arg : Node_Id) is
          Argx : constant Node_Id := Get_Pragma_Arg (Arg);
-
       begin
          if Nkind (Argx) /= N_String_Literal then
             Error_Pragma_Arg
               ("argument for pragma% must be string literal", Argx);
          end if;
-
       end Check_Arg_Is_String_Literal;
 
       ------------------------------------------
@@ -816,6 +946,42 @@ package body Sem_Prag is
          end if;
       end Check_Arg_Is_Task_Dispatching_Policy;
 
+      ---------------------
+      -- Check_Arg_Order --
+      ---------------------
+
+      procedure Check_Arg_Order (Names : Name_List) is
+         Arg : Node_Id;
+
+         Highest_So_Far : Natural := 0;
+         --  Highest index in Names seen do far
+
+      begin
+         Arg := Arg1;
+         for J in 1 .. Arg_Count loop
+            if Chars (Arg) /= No_Name then
+               for K in Names'Range loop
+                  if Chars (Arg) = Names (K) then
+                     if K < Highest_So_Far then
+                        Error_Msg_Name_1 := Chars (N);
+                        Error_Msg_N
+                          ("parameters out of order for pragma%", Arg);
+                        Error_Msg_Name_1 := Names (K);
+                        Error_Msg_Name_2 := Names (Highest_So_Far);
+                        Error_Msg_N ("\% must appear before %", Arg);
+                        raise Pragma_Exit;
+
+                     else
+                        Highest_So_Far := K;
+                     end if;
+                  end if;
+               end loop;
+            end if;
+
+            Arg := Next (Arg);
+         end loop;
+      end Check_Arg_Order;
+
       --------------------------------
       -- Check_At_Least_N_Arguments --
       --------------------------------
@@ -833,11 +999,9 @@ package body Sem_Prag is
 
       procedure Check_At_Most_N_Arguments (N : Nat) is
          Arg : Node_Id;
-
       begin
          if Arg_Count > N then
             Arg := Arg1;
-
             for J in 1 .. N loop
                Next (Arg);
                Error_Pragma_Arg ("too many arguments for pragma%", Arg);
@@ -845,13 +1009,85 @@ package body Sem_Prag is
          end if;
       end Check_At_Most_N_Arguments;
 
+      ---------------------
+      -- Check_Component --
+      ---------------------
+
+      procedure Check_Component (Comp : Node_Id) is
+      begin
+         if Nkind (Comp) = N_Component_Declaration then
+            declare
+               Sindic : constant Node_Id :=
+                          Subtype_Indication (Component_Definition (Comp));
+               Typ    : constant Entity_Id :=
+                          Etype (Defining_Identifier (Comp));
+            begin
+               if Nkind (Sindic) = N_Subtype_Indication then
+
+                  --  Ada 2005 (AI-216): If a component subtype is subject to
+                  --  a per-object constraint, then the component type shall
+                  --  be an Unchecked_Union.
+
+                  if Has_Per_Object_Constraint (Defining_Identifier (Comp))
+                    and then
+                      not Is_Unchecked_Union (Etype (Subtype_Mark (Sindic)))
+                  then
+                     Error_Msg_N ("component subtype subject to per-object" &
+                       " constraint must be an Unchecked_Union", Comp);
+                  end if;
+               end if;
+
+               if Is_Controlled (Typ) then
+                  Error_Msg_N
+                   ("component of unchecked union cannot be controlled", Comp);
+
+               elsif Has_Task (Typ) then
+                  Error_Msg_N
+                   ("component of unchecked union cannot have tasks", Comp);
+               end if;
+            end;
+         end if;
+      end Check_Component;
+
+      ----------------------------------
+      -- Check_Duplicated_Export_Name --
+      ----------------------------------
+
+      procedure Check_Duplicated_Export_Name (Nam : Node_Id) is
+         String_Val : constant String_Id := Strval (Nam);
+
+      begin
+         --  We are only interested in the export case, and in the case of
+         --  generics, it is the instance, not the template, that is the
+         --  problem (the template will generate a warning in any case).
+
+         if not Inside_A_Generic
+           and then (Prag_Id = Pragma_Export
+                       or else
+                     Prag_Id = Pragma_Export_Procedure
+                       or else
+                     Prag_Id = Pragma_Export_Valued_Procedure
+                       or else
+                     Prag_Id = Pragma_Export_Function)
+         then
+            for J in Externals.First .. Externals.Last loop
+               if String_Equal (String_Val, Strval (Externals.Table (J))) then
+                  Error_Msg_Sloc := Sloc (Externals.Table (J));
+                  Error_Msg_N ("external name duplicates name given#", Nam);
+                  exit;
+               end if;
+            end loop;
+
+            Externals.Append (Nam);
+         end if;
+      end Check_Duplicated_Export_Name;
+
       -------------------------
       -- Check_First_Subtype --
       -------------------------
 
       procedure Check_First_Subtype (Arg : Node_Id) is
          Argx : constant Node_Id := Get_Pragma_Arg (Arg);
-
       begin
          if not Is_First_Subtype (Entity (Argx)) then
             Error_Pragma_Arg
@@ -875,7 +1111,7 @@ package body Sem_Prag is
          --  Otherwise warn if obviously not main program
 
          elsif Present (Parameter_Specifications (Specification (P)))
-           or else not Is_Library_Level_Entity (Defining_Entity (P))
+           or else not Is_Compilation_Unit (Defining_Entity (P))
          then
             Error_Msg_Name_1 := Chars (N);
             Error_Msg_N
@@ -889,91 +1125,41 @@ package body Sem_Prag is
 
       procedure Check_Interrupt_Or_Attach_Handler is
          Arg1_X : constant Node_Id := Expression (Arg1);
+         Handler_Proc, Proc_Scope : Entity_Id;
 
       begin
          Analyze (Arg1_X);
 
-         if not Is_Entity_Name (Arg1_X) then
-            Error_Pragma_Arg
-              ("argument of pragma% must be entity name", Arg1);
-
-         elsif Prag_Id = Pragma_Interrupt_Handler then
-            Check_Restriction (No_Dynamic_Interrupts, N);
+         if Prag_Id = Pragma_Interrupt_Handler then
+            Check_Restriction (No_Dynamic_Attachment, N);
          end if;
 
-         declare
-            Prot_Proc : Entity_Id := Empty;
-            Prot_Type : Entity_Id;
-            Found     : Boolean := False;
-
-         begin
-            if not Is_Overloaded (Arg1_X) then
-               Prot_Proc := Entity (Arg1_X);
-
-            else
-               declare
-                  It    : Interp;
-                  Index : Interp_Index;
-
-               begin
-                  Get_First_Interp (Arg1_X, Index, It);
-                  while Present (It.Nam) loop
-                     Prot_Proc := It.Nam;
-
-                     if Ekind (Prot_Proc) = E_Procedure
-                       and then No (First_Formal (Prot_Proc))
-                     then
-                        if not Found then
-                           Found := True;
-                           Set_Entity (Arg1_X, Prot_Proc);
-                           Set_Is_Overloaded (Arg1_X, False);
-                        else
-                           Error_Pragma_Arg
-                             ("ambiguous handler name for pragma% ", Arg1);
-                        end if;
-                     end if;
-
-                     Get_Next_Interp (Index, It);
-                  end loop;
-
-                  if not Found then
-                     Error_Pragma_Arg
-                       ("argument of pragma% must be parameterless procedure",
-                        Arg1);
-                  else
-                     Prot_Proc := Entity (Arg1_X);
-                  end if;
-               end;
-            end if;
-
-            Prot_Type := Scope (Prot_Proc);
-
-            if Ekind (Prot_Proc) /= E_Procedure
-              or else Ekind (Prot_Type) /= E_Protected_Type
-            then
-               Error_Pragma_Arg
-                 ("argument of pragma% must be protected procedure",
-                  Arg1);
-            end if;
+         Handler_Proc := Find_Unique_Parameterless_Procedure (Arg1_X, Arg1);
+         Proc_Scope := Scope (Handler_Proc);
 
-            if not Is_Library_Level_Entity (Prot_Type) then
-               Error_Pragma_Arg
-                 ("pragma% requires library level entity", Arg1);
-            end if;
+         --  On AAMP only, a pragma Interrupt_Handler is supported for
+         --  nonprotected parameterless procedures.
 
-            if Present (First_Formal (Prot_Proc)) then
+         if not AAMP_On_Target
+           or else Prag_Id = Pragma_Attach_Handler
+         then
+            if Ekind (Proc_Scope) /= E_Protected_Type then
                Error_Pragma_Arg
-                 ("argument of pragma% must be parameterless procedure",
-                  Arg1);
+                 ("argument of pragma% must be protected procedure", Arg1);
             end if;
 
-            if Parent (N) /=
-                 Protected_Definition (Parent (Prot_Type))
-            then
+            if Parent (N) /= Protected_Definition (Parent (Proc_Scope)) then
                Error_Pragma ("pragma% must be in protected definition");
             end if;
+         end if;
 
-         end;
+         if not Is_Library_Level_Entity (Proc_Scope)
+           or else (AAMP_On_Target
+                     and then not Is_Library_Level_Entity (Handler_Proc))
+         then
+            Error_Pragma_Arg
+              ("argument for pragma% must be library level entity", Arg1);
+         end if;
       end Check_Interrupt_Or_Attach_Handler;
 
       -------------------------------------------
@@ -1016,7 +1202,6 @@ package body Sem_Prag is
          end loop;
 
          Error_Pragma ("pragma% is not in declarative part or package spec");
-
       end Check_Is_In_Decl_Part_Or_Package_Spec;
 
       -------------------------
@@ -1037,11 +1222,9 @@ package body Sem_Prag is
 
       procedure Check_No_Identifiers is
          Arg_Node : Node_Id;
-
       begin
          if Arg_Count > 0 then
             Arg_Node := Arg1;
-
             while Present (Arg_Node) loop
                Check_No_Identifier (Arg_Node);
                Next (Arg_Node);
@@ -1049,33 +1232,6 @@ package body Sem_Prag is
          end if;
       end Check_No_Identifiers;
 
-      -----------------------------------
-      -- Check_Non_Overloaded_Function --
-      -----------------------------------
-
-      procedure Check_Non_Overloaded_Function (Arg : Node_Id) is
-         Ent : Entity_Id;
-
-      begin
-         Check_Arg_Is_Local_Name (Arg);
-         Ent := Entity (Expression (Arg));
-
-         if Present (Homonym (Ent))
-           and then Scope (Homonym (Ent)) = Current_Scope
-         then
-            Error_Pragma_Arg
-              ("argument for pragma% may not be overloaded", Arg);
-         end if;
-
-         if Ekind (Ent) /= E_Function
-           or else No (First_Formal (Ent))
-           or else Present (Next_Formal (First_Formal (Ent)))
-         then
-            Error_Pragma_Arg
-              ("argument for pragma% must be function of one argument", Arg);
-         end if;
-      end Check_Non_Overloaded_Function;
-
       -------------------------------
       -- Check_Optional_Identifier --
       -------------------------------
@@ -1106,6 +1262,7 @@ package body Sem_Prag is
       --  Note: for convenience in writing this procedure, in addition to
       --  the officially (i.e. by spec) allowed argument which is always
       --  a constraint, it also allows ranges and discriminant associations.
+      --  Above is not clear ???
 
       procedure Check_Static_Constraint (Constr : Node_Id) is
 
@@ -1119,8 +1276,8 @@ package body Sem_Prag is
          procedure Require_Static (E : Node_Id) is
          begin
             if not Is_OK_Static_Expression (E) then
-               Error_Msg_N
-                 ("non-static constraint not allowed in Unchecked_Union", E);
+               Flag_Non_Static_Expr
+                 ("non-static constraint not allowed in Unchecked_Union!", E);
                raise Pragma_Exit;
             end if;
          end Require_Static;
@@ -1145,9 +1302,9 @@ package body Sem_Prag is
 
             when N_Index_Or_Discriminant_Constraint =>
                declare
-                  IDC : Entity_Id := First (Constraints (Constr));
-
+                  IDC : Entity_Id;
                begin
+                  IDC := First (Constraints (Constr));
                   while Present (IDC) loop
                      Check_Static_Constraint (IDC);
                      Next (IDC);
@@ -1182,7 +1339,6 @@ package body Sem_Prag is
          Plist       : List_Id;
          Parent_Node : Node_Id;
          Unit_Name   : Entity_Id;
-         Valid       : Boolean := True;
          Unit_Kind   : Node_Kind;
          Unit_Node   : Node_Id;
          Sindex      : Source_File_Index;
@@ -1190,7 +1346,6 @@ package body Sem_Prag is
       begin
          if not Is_List_Member (N) then
             Pragma_Misplaced;
-            Valid := False;
 
          else
             Plist := List_Containing (N);
@@ -1219,15 +1374,12 @@ package body Sem_Prag is
 
                   Analyze (Expression (Arg1));
 
-                  if        Unit_Kind = N_Generic_Subprogram_Declaration
+                  if Unit_Kind = N_Generic_Subprogram_Declaration
                     or else Unit_Kind = N_Subprogram_Declaration
                   then
                      Unit_Name := Defining_Entity (Unit_Node);
 
-                  elsif     Unit_Kind = N_Function_Instantiation
-                    or else Unit_Kind = N_Package_Instantiation
-                    or else Unit_Kind = N_Procedure_Instantiation
-                  then
+                  elsif Unit_Kind in N_Generic_Instantiation then
                      Unit_Name := Defining_Entity (Unit_Node);
 
                   else
@@ -1286,8 +1438,8 @@ package body Sem_Prag is
                      Pragma_Misplaced;
 
                   elsif (Nkind (Parent_Node) = N_Generic_Package_Declaration
-                          or else Nkind (Parent_Node)
-                            = N_Generic_Subprogram_Declaration)
+                           or else Nkind (Parent_Node) =
+                                             N_Generic_Subprogram_Declaration)
                     and then Plist = Generic_Formal_Declarations (Parent_Node)
                   then
                      Pragma_Misplaced;
@@ -1318,9 +1470,31 @@ package body Sem_Prag is
                end if;
             end if;
          end if;
-
       end Check_Valid_Library_Unit_Pragma;
 
+      -------------------
+      -- Check_Variant --
+      -------------------
+
+      procedure Check_Variant (Variant : Node_Id) is
+         Clist : constant Node_Id := Component_List (Variant);
+         Comp  : Node_Id;
+
+      begin
+         if not Is_Non_Empty_List (Component_Items (Clist)) then
+            Error_Msg_N
+              ("Unchecked_Union may not have empty component list",
+               Variant);
+            return;
+         end if;
+
+         Comp := First (Component_Items (Clist));
+         while Present (Comp) loop
+            Check_Component (Comp);
+            Next (Comp);
+         end loop;
+      end Check_Variant;
+
       ------------------
       -- Error_Pragma --
       ------------------
@@ -1374,7 +1548,6 @@ package body Sem_Prag is
            and then Defining_Entity (Parent (N)) /= Current_Scope
          then
             return Defining_Entity (Parent (N));
-
          else
             return Current_Scope;
          end if;
@@ -1416,9 +1589,74 @@ package body Sem_Prag is
          else
             Analyze (Id);
          end if;
-
       end Find_Program_Unit_Name;
 
+      -----------------------------------------
+      -- Find_Unique_Parameterless_Procedure --
+      -----------------------------------------
+
+      function Find_Unique_Parameterless_Procedure
+        (Name : Entity_Id;
+         Arg  : Node_Id) return Entity_Id
+      is
+         Proc : Entity_Id := Empty;
+
+      begin
+         --  The body of this procedure needs some comments ???
+
+         if not Is_Entity_Name (Name) then
+            Error_Pragma_Arg
+              ("argument of pragma% must be entity name", Arg);
+
+         elsif not Is_Overloaded (Name) then
+            Proc := Entity (Name);
+
+            if Ekind (Proc) /= E_Procedure
+                 or else Present (First_Formal (Proc)) then
+               Error_Pragma_Arg
+                 ("argument of pragma% must be parameterless procedure", Arg);
+            end if;
+
+         else
+            declare
+               Found : Boolean := False;
+               It    : Interp;
+               Index : Interp_Index;
+
+            begin
+               Get_First_Interp (Name, Index, It);
+               while Present (It.Nam) loop
+                  Proc := It.Nam;
+
+                  if Ekind (Proc) = E_Procedure
+                    and then No (First_Formal (Proc))
+                  then
+                     if not Found then
+                        Found := True;
+                        Set_Entity (Name, Proc);
+                        Set_Is_Overloaded (Name, False);
+                     else
+                        Error_Pragma_Arg
+                          ("ambiguous handler name for pragma% ", Arg);
+                     end if;
+                  end if;
+
+                  Get_Next_Interp (Index, It);
+               end loop;
+
+               if not Found then
+                  Error_Pragma_Arg
+                    ("argument of pragma% must be parameterless procedure",
+                     Arg);
+               else
+                  Proc := Entity (Name);
+               end if;
+            end;
+         end if;
+
+         return Proc;
+      end Find_Unique_Parameterless_Procedure;
+
       -------------------------
       -- Gather_Associations --
       -------------------------
@@ -1445,7 +1683,6 @@ package body Sem_Prag is
          --  Otherwise first deal with any positional parameters present
 
          Arg := First (Pragma_Argument_Associations (N));
-
          for Index in Args'Range loop
             exit when No (Arg) or else Chars (Arg) /= No_Name;
             Args (Index) := Expression (Arg);
@@ -1481,8 +1718,23 @@ package body Sem_Prag is
                   end if;
 
                   if Index = Names'Last then
-                     Error_Pragma_Arg_Ident
-                       ("pragma% does not allow & argument", Arg);
+                     Error_Msg_Name_1 := Chars (N);
+                     Error_Msg_N ("pragma% does not allow & argument", Arg);
+
+                     --  Check for possible misspelling
+
+                     for Index1 in Names'Range loop
+                        if Is_Bad_Spelling_Of
+                             (Get_Name_String (Chars (Arg)),
+                              Get_Name_String (Names (Index1)))
+                        then
+                           Error_Msg_Name_1 := Names (Index1);
+                           Error_Msg_N ("\possible misspelling of%", Arg);
+                           exit;
+                        end if;
+                     end loop;
+
+                     raise Pragma_Exit;
                   end if;
                end loop;
             end if;
@@ -1519,8 +1771,7 @@ package body Sem_Prag is
 
       function Is_Before_First_Decl
         (Pragma_Node : Node_Id;
-         Decls       : List_Id)
-         return        Boolean
+         Decls       : List_Id) return Boolean
       is
          Item : Node_Id := First (Decls);
 
@@ -1537,7 +1788,6 @@ package body Sem_Prag is
 
             Next (Item);
          end loop;
-
       end Is_Before_First_Decl;
 
       -----------------------------
@@ -1582,14 +1832,53 @@ package body Sem_Prag is
          else
             return False;
          end if;
-
       end Is_Configuration_Pragma;
 
-      ----------------------
-      -- Pragma_Misplaced --
-      ----------------------
+      --------------------------
+      -- Is_In_Context_Clause --
+      --------------------------
+
+      function Is_In_Context_Clause return Boolean is
+         Plist       : List_Id;
+         Parent_Node : Node_Id;
 
-      procedure Pragma_Misplaced is
+      begin
+         if not Is_List_Member (N) then
+            return False;
+
+         else
+            Plist := List_Containing (N);
+            Parent_Node := Parent (Plist);
+
+            if Parent_Node = Empty
+              or else Nkind (Parent_Node) /= N_Compilation_Unit
+              or else Context_Items (Parent_Node) /= Plist
+            then
+               return False;
+            end if;
+         end if;
+
+         return True;
+      end Is_In_Context_Clause;
+
+      ---------------------------------
+      -- Is_Static_String_Expression --
+      ---------------------------------
+
+      function Is_Static_String_Expression (Arg : Node_Id) return Boolean is
+         Argx : constant Node_Id := Get_Pragma_Arg (Arg);
+
+      begin
+         Analyze_And_Resolve (Argx);
+         return Is_OK_Static_Expression (Argx)
+           and then Nkind (Argx) = N_String_Literal;
+      end Is_Static_String_Expression;
+
+      ----------------------
+      -- Pragma_Misplaced --
+      ----------------------
+
+      procedure Pragma_Misplaced is
       begin
          Error_Pragma ("incorrect placement of pragma%");
       end Pragma_Misplaced;
@@ -1603,9 +1892,30 @@ package body Sem_Prag is
          E    : Entity_Id;
          D    : Node_Id;
          K    : Node_Kind;
+         Utyp : Entity_Id;
+
+         procedure Set_Atomic (E : Entity_Id);
+         --  Set given type as atomic, and if no explicit alignment was
+         --  given, set alignment to unknown, since back end knows what
+         --  the alignment requirements are for atomic arrays. Note that
+         --  this step is necessary for derived types.
+
+         ----------------
+         -- Set_Atomic --
+         ----------------
+
+         procedure Set_Atomic (E : Entity_Id) is
+         begin
+            Set_Is_Atomic (E);
+
+            if not Has_Alignment_Clause (E) then
+               Set_Alignment (E, Uint_0);
+            end if;
+         end Set_Atomic;
+
+      --  Start of processing for Process_Atomic_Shared_Volatile
 
       begin
-         GNAT_Pragma;
          Check_Ada_83_Warning;
          Check_No_Identifiers;
          Check_Arg_Count (1);
@@ -1631,13 +1941,21 @@ package body Sem_Prag is
             end if;
 
             if Prag_Id /= Pragma_Volatile then
-               Set_Is_Atomic (E);
-               Set_Is_Atomic (Underlying_Type (E));
+               Set_Atomic (E);
+               Set_Atomic (Underlying_Type (E));
+               Set_Atomic (Base_Type (E));
             end if;
 
-            Set_Is_Volatile (E);
+            --  Attribute belongs on the base type. If the
+            --  view of the type is currently private, it also
+            --  belongs on the underlying type.
+
+            Set_Is_Volatile (Base_Type (E));
             Set_Is_Volatile (Underlying_Type (E));
 
+            Set_Treat_As_Volatile (E);
+            Set_Treat_As_Volatile (Underlying_Type (E));
+
          elsif K = N_Object_Declaration
            or else (K = N_Component_Declaration
                      and then Original_Record_Component (E) = E)
@@ -1648,9 +1966,40 @@ package body Sem_Prag is
 
             if Prag_Id /= Pragma_Volatile then
                Set_Is_Atomic (E);
+
+               --  If the object declaration has an explicit
+               --  initialization, a temporary may have to be
+               --  created to hold the expression, to insure
+               --  that access to the object remain atomic.
+
+               if Nkind (Parent (E)) = N_Object_Declaration
+                 and then Present (Expression (Parent (E)))
+               then
+                  Set_Has_Delayed_Freeze (E);
+               end if;
+
+               --  An interesting improvement here. If an object of type X
+               --  is declared atomic, and the type X is not atomic, that's
+               --  a pity, since it may not have appropraite alignment etc.
+               --  We can rescue this in the special case where the object
+               --  and type are in the same unit by just setting the type
+               --  as atomic, so that the back end will process it as atomic.
+
+               Utyp := Underlying_Type (Etype (E));
+
+               if Present (Utyp)
+                 and then Sloc (E) > No_Location
+                 and then Sloc (Utyp) > No_Location
+                 and then
+                   Get_Source_File_Index (Sloc (E)) =
+                   Get_Source_File_Index (Sloc (Underlying_Type (Etype (E))))
+               then
+                  Set_Is_Atomic (Underlying_Type (Etype (E)));
+               end if;
             end if;
 
             Set_Is_Volatile (E);
+            Set_Treat_As_Volatile (E);
 
          else
             Error_Pragma_Arg
@@ -1658,6 +2007,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 --
       ------------------------
@@ -1668,8 +2089,8 @@ package body Sem_Prag is
       is
          Id        : Node_Id;
          E1        : Entity_Id;
-         Comp_Unit : Unit_Number_Type;
          Cname     : Name_Id;
+         Comp_Unit : Unit_Number_Type;
 
          procedure Set_Convention_From_Pragma (E : Entity_Id);
          --  Set convention in entity E, and also flag that the entity has a
@@ -1683,6 +2104,24 @@ package body Sem_Prag is
 
          procedure Set_Convention_From_Pragma (E : Entity_Id) is
          begin
+            --  Ada 2005 (AI-430): Check invalid attempt to change convention
+            --  for an overridden dispatching operation. Technically this is
+            --  an amendment and should only be done in Ada 2005 mode.
+            --  However, this is clearly a mistake, since the problem that is
+            --  addressed by this AI is that there is a clear gap in the RM!
+
+            if Is_Dispatching_Operation (E)
+              and then Present (Overridden_Operation (E))
+              and then C /= Convention (Overridden_Operation (E))
+            then
+               Error_Pragma_Arg
+                 ("cannot change convention for " &
+                  "overridden dispatching operation",
+                  Arg1);
+            end if;
+
+            --  Set the convention
+
             Set_Convention (E, C);
             Set_Has_Convention_Pragma (E);
 
@@ -1739,8 +2178,8 @@ package body Sem_Prag is
 
       begin
          Check_At_Least_N_Arguments (2);
-         Check_Arg_Is_Identifier (Arg1);
          Check_Optional_Identifier (Arg1, Name_Convention);
+         Check_Arg_Is_Identifier (Arg1);
          Cname := Chars (Expression (Arg1));
 
          --  C_Pass_By_Copy is treated as a synonym for convention C
@@ -1761,7 +2200,7 @@ package body Sem_Prag is
          --  with a warning in the non-VMS case.
 
          else
-            if not OpenVMS_On_Target then
+            if Warn_On_Export_Import and not OpenVMS_On_Target then
                Error_Msg_N
                  ("?unrecognized convention name, C assumed",
                   Expression (Arg1));
@@ -1770,8 +2209,8 @@ package body Sem_Prag is
             C := Convention_C;
          end if;
 
-         Check_Arg_Is_Local_Name (Arg2);
          Check_Optional_Identifier (Arg2, Name_Entity);
+         Check_Arg_Is_Local_Name (Arg2);
 
          Id := Expression (Arg2);
          Analyze (Id);
@@ -1780,20 +2219,32 @@ package body Sem_Prag is
             Error_Pragma_Arg ("entity name required", Arg2);
          end if;
 
+         if Ekind (Entity (Id)) = E_Enumeration_Literal then
+            Error_Pragma ("enumeration literal not allowed for pragma%");
+         end if;
+
          E := Entity (Id);
 
          --  Go to renamed subprogram if present, since convention applies
          --  to the actual renamed entity, not to the renaming entity.
+         --  If subprogram is inherited, go to parent subprogram.
 
          if Is_Subprogram (E)
            and then Present (Alias (E))
-           and then Nkind (Parent (Declaration_Node (E))) =
-                      N_Subprogram_Renaming_Declaration
          then
-            E := Alias (E);
+            if Nkind (Parent (Declaration_Node (E))) =
+                                       N_Subprogram_Renaming_Declaration
+            then
+               E := Alias (E);
+
+            elsif Nkind (Parent (E)) = N_Full_Type_Declaration
+              and then Scope (E) = Scope (Alias (E))
+            then
+               E := Alias (E);
+            end if;
          end if;
 
-         --  Check that we not applying this to a specless body
+         --  Check that we are not applying this to a specless body
 
          if Is_Subprogram (E)
            and then Nkind (Parent (Declaration_Node (E))) = N_Subprogram_Body
@@ -1858,7 +2309,7 @@ package body Sem_Prag is
            and then Ekind (E) /= E_Variable
            and then not
              (Is_Access_Type (E)
-              and then Ekind (Designated_Type (E)) = E_Subprogram_Type)
+                and then Ekind (Designated_Type (E)) = E_Subprogram_Type)
          then
             Error_Pragma_Arg
               ("second argument of pragma% must be subprogram (type)",
@@ -1884,14 +2335,19 @@ package body Sem_Prag is
             end if;
 
          --  For the subprogram case, set proper convention for all homonyms
-         --  in same compilation unit.
-         --  Is the test of compilation unit really necessary ???
-         --  What about subprogram renamings here???
+         --  in same scope and the same declarative part, i.e. the same
+         --  compilation unit.
 
          else
             Comp_Unit := Get_Source_Unit (E);
             Set_Convention_From_Pragma (E);
 
+            --  Treat a pragma Import as an implicit body, for GPS use
+
+            if Prag_Id = Pragma_Import then
+               Generate_Reference (E, Id, 'b');
+            end if;
+
             E1 := E;
             loop
                E1 := Homonym (E1);
@@ -1901,12 +2357,19 @@ package body Sem_Prag is
                --  That is deliberate, we cannot chain the rep item on more
                --  than one Rep_Item chain, to be fixed later ???
 
-               if Comp_Unit = Get_Source_Unit (E1) then
+               if Comes_From_Source (E1)
+                 and then Comp_Unit = Get_Source_Unit (E1)
+                 and then Nkind (Original_Node (Parent (E1))) /=
+                   N_Full_Type_Declaration
+               then
                   Set_Convention_From_Pragma (E1);
+
+                  if Prag_Id = Pragma_Import then
+                     Generate_Reference (E, Id, 'b');
+                  end if;
                end if;
             end loop;
          end if;
-
       end Process_Convention;
 
       -----------------------------------------------------
@@ -1923,6 +2386,13 @@ package body Sem_Prag is
          Code_Val : Uint;
 
       begin
+         GNAT_Pragma;
+
+         if not OpenVMS_On_Target then
+            Error_Pragma
+              ("?pragma% ignored (applies only to Open'V'M'S)");
+         end if;
+
          Process_Extended_Import_Export_Internal_Arg (Arg_Internal);
          Def_Id := Entity (Arg_Internal);
 
@@ -1965,7 +2435,6 @@ package body Sem_Prag is
                Set_Exception_Code (Def_Id, Code_Val);
             end if;
          end if;
-
       end Process_Extended_Import_Export_Exception_Pragma;
 
       -------------------------------------------------
@@ -1998,7 +2467,6 @@ package body Sem_Prag is
          end if;
 
          Check_Arg_Is_Local_Name (Arg_Internal);
-
       end Process_Extended_Import_Export_Internal_Arg;
 
       --------------------------------------------------
@@ -2010,7 +2478,7 @@ package body Sem_Prag is
          Arg_External : Node_Id;
          Arg_Size     : Node_Id)
       is
-         Def_Id   : Entity_Id;
+         Def_Id : Entity_Id;
 
       begin
          Process_Extended_Import_Export_Internal_Arg (Arg_Internal);
@@ -2023,9 +2491,12 @@ package body Sem_Prag is
               ("pragma% must designate an object", Arg_Internal);
          end if;
 
-         if Is_Psected (Def_Id) then
+         if Has_Rep_Pragma (Def_Id, Name_Common_Object)
+              or else
+            Has_Rep_Pragma (Def_Id, Name_Psect_Object)
+         then
             Error_Pragma_Arg
-              ("previous Psect_Object applies, pragma % not permitted",
+              ("previous Common/Psect_Object applies, pragma % not permitted",
                Arg_Internal);
          end if;
 
@@ -2035,19 +2506,13 @@ package body Sem_Prag is
 
          Set_Extended_Import_Export_External_Name (Def_Id, Arg_External);
 
-         if Present (Arg_Size)
-           and then Nkind (Arg_Size) /= N_Identifier
-           and then Nkind (Arg_Size) /= N_String_Literal
-         then
-            Error_Pragma_Arg
-              ("pragma% Size argument must be identifier or string literal",
-               Arg_Size);
+         if Present (Arg_Size) then
+            Check_Arg_Is_External_Name (Arg_Size);
          end if;
 
          --  Export_Object case
 
          if Prag_Id = Pragma_Export_Object then
-
             if not Is_Library_Level_Entity (Def_Id) then
                Error_Pragma_Arg
                  ("argument for pragma% must be library level entity",
@@ -2064,7 +2529,7 @@ package body Sem_Prag is
                   Arg_Internal);
             end if;
 
-            if Is_Exported (Def_Id) then
+            if Warn_On_Export_Import and then Is_Exported (Def_Id) then
                Error_Msg_N
                  ("?duplicate Export_Object pragma", N);
             else
@@ -2085,24 +2550,45 @@ package body Sem_Prag is
                  ("cannot import a constant", Arg_Internal);
             end if;
 
-            if Has_Discriminants (Etype (Def_Id)) then
+            if Warn_On_Export_Import
+              and then Has_Discriminants (Etype (Def_Id))
+            then
                Error_Msg_N
                  ("imported value must be initialized?", Arg_Internal);
             end if;
 
-            if Is_Access_Type (Etype (Def_Id)) then
+            if Warn_On_Export_Import
+              and then Is_Access_Type (Etype (Def_Id))
+            then
                Error_Pragma_Arg
                  ("cannot import object of an access type?", Arg_Internal);
             end if;
 
-            if Is_Imported (Def_Id) then
+            if Warn_On_Export_Import
+              and then Is_Imported (Def_Id)
+            then
                Error_Msg_N
                  ("?duplicate Import_Object pragma", N);
+
+            --  Check for explicit initialization present. Note that an
+            --  initialization that generated by the code generator, e.g.
+            --  for an access type, does not count here.
+
+            elsif Present (Expression (Parent (Def_Id)))
+               and then
+                 Comes_From_Source
+                   (Original_Node (Expression (Parent (Def_Id))))
+            then
+               Error_Msg_Sloc := Sloc (Def_Id);
+               Error_Pragma_Arg
+                 ("no initialization allowed for declaration of& #",
+                  "\imported entities cannot be initialized ('R'M' 'B.1(24))",
+                  Arg1);
             else
                Set_Imported (Def_Id);
+               Note_Possible_Modification (Arg_Internal);
             end if;
          end if;
-
       end Process_Extended_Import_Export_Object_Pragma;
 
       ------------------------------------------------------
@@ -2126,21 +2612,64 @@ package body Sem_Prag is
          Match     : Boolean;
          Dval      : Node_Id;
 
-         function Same_Base_Type (Ptype, Formal : Entity_Id) return Boolean;
+         function Same_Base_Type
+          (Ptype  : Node_Id;
+           Formal : Entity_Id) return Boolean;
          --  Determines if Ptype references the type of Formal. Note that
-         --  only the base types need to match according to the spec.
+         --  only the base types need to match according to the spec. Ptype
+         --  here is the argument from the pragma, which is either a type
+         --  name, or an access attribute.
+
+         --------------------
+         -- Same_Base_Type --
+         --------------------
+
+         function Same_Base_Type
+           (Ptype  : Node_Id;
+            Formal : Entity_Id) return Boolean
+         is
+            Ftyp : constant Entity_Id := Base_Type (Etype (Formal));
+            Pref : Node_Id;
 
-         function Same_Base_Type (Ptype, Formal : Entity_Id) return Boolean is
          begin
-            Find_Type (Ptype);
+            --  Case where pragma argument is typ'Access
 
-            if not Is_Entity_Name (Ptype)
-              or else Entity (Ptype) = Any_Type
+            if Nkind (Ptype) = N_Attribute_Reference
+              and then Attribute_Name (Ptype) = Name_Access
             then
-               raise Pragma_Exit;
-            end if;
+               Pref := Prefix (Ptype);
+               Find_Type (Pref);
+
+               if not Is_Entity_Name (Pref)
+                 or else Entity (Pref) = Any_Type
+               then
+                  raise Pragma_Exit;
+               end if;
 
-            return Base_Type (Entity (Ptype)) = Base_Type (Etype (Formal));
+               --  We have a match if the corresponding argument is of an
+               --  anonymous access type, and its designicated type matches
+               --  the type of the prefix of the access attribute
+
+               return Ekind (Ftyp) = E_Anonymous_Access_Type
+                 and then Base_Type (Entity (Pref)) =
+                            Base_Type (Etype (Designated_Type (Ftyp)));
+
+            --  Case where pragma argument is a type name
+
+            else
+               Find_Type (Ptype);
+
+               if not Is_Entity_Name (Ptype)
+                 or else Entity (Ptype) = Any_Type
+               then
+                  raise Pragma_Exit;
+               end if;
+
+               --  We have a match if the corresponding argument is of
+               --  the type given in the pragma (comparing base types)
+
+               return Base_Type (Entity (Ptype)) = Ftyp;
+            end if;
          end Same_Base_Type;
 
       --  Start of processing for
@@ -2148,12 +2677,12 @@ package body Sem_Prag is
 
       begin
          Process_Extended_Import_Export_Internal_Arg (Arg_Internal);
-         Hom_Id := Entity (Arg_Internal);
          Ent := Empty;
          Ambiguous := False;
 
-         --  Loop through homonyms (overloadings) of Hom_Id
+         --  Loop through homonyms (overloadings) of the entity
 
+         Hom_Id := Entity (Arg_Internal);
          while Present (Hom_Id) loop
             Def_Id := Get_Base_Subprogram (Hom_Id);
 
@@ -2187,6 +2716,13 @@ package body Sem_Prag is
                then
                   Match := False;
 
+               elsif Etype (Def_Id) /= Standard_Void_Type
+                 and then
+                   (Chars (N) = Name_Export_Procedure
+                      or else Chars (N) = Name_Import_Procedure)
+               then
+                  Match := False;
+
                --  Test parameter types if given. Note that this parameter
                --  has not been analyzed (and must not be, since it is
                --  semantic nonsense), so we get it as the parser left it.
@@ -2225,7 +2761,6 @@ package body Sem_Prag is
                        and then Paren_Count (Arg_Parameter_Types) = 0
                      then
                         Ptype := First (Expressions (Arg_Parameter_Types));
-
                         while Present (Ptype) or else Present (Formal) loop
                            if No (Ptype)
                              or else No (Formal)
@@ -2299,20 +2834,29 @@ package body Sem_Prag is
 
          --  Import pragmas must be be for imported entities
 
-         if (Prag_Id = Pragma_Import_Function
-               or else
-             Prag_Id = Pragma_Import_Procedure
-               or else
-             Prag_Id = Pragma_Import_Valued_Procedure)
+         if Prag_Id = Pragma_Import_Function
+              or else
+            Prag_Id = Pragma_Import_Procedure
+              or else
+            Prag_Id = Pragma_Import_Valued_Procedure
          then
             if not Is_Imported (Ent) then
                Error_Pragma
                  ("pragma Import or Interface must precede pragma%");
             end if;
 
-         --  For the Export cases, the pragma Export is sufficient to set
-         --  the entity as exported, if it is not exported already. We
-         --  leave the default Ada convention in this case.
+         --  Here we have the Export case which can set the entity as exported
+
+         --  But does not do so if the specified external name is null,
+         --  since that is taken as a signal in DEC Ada 83 (with which
+         --  we want to be compatible) to request no external name.
+
+         elsif Nkind (Arg_External) = N_String_Literal
+           and then String_Length (Strval (Arg_External)) = 0
+         then
+            null;
+
+         --  In all other cases, set entit as exported
 
          else
             Set_Exported (Ent, Arg_Internal);
@@ -2353,7 +2897,6 @@ package body Sem_Prag is
          --  nonsense, so we get it in exactly as the parser left it.
 
          if Present (Arg_Mechanism) then
-
             declare
                Formal : Entity_Id;
                Massoc : Node_Id;
@@ -2396,6 +2939,7 @@ package body Sem_Prag is
                   --  Deal with positional ones first
 
                   Formal := First_Formal (Ent);
+
                   if Present (Expressions (Arg_Mechanism)) then
                      Mname := First (Expressions (Arg_Mechanism));
 
@@ -2487,7 +3031,7 @@ package body Sem_Prag is
                else
                   Dval := Default_Value (Formal);
 
-                  if not Present (Dval) then
+                  if No (Dval) then
                      Error_Msg_NE
                        ("optional formal& does not have default value!",
                         Arg_First_Optional_Parameter, Formal);
@@ -2496,7 +3040,7 @@ package body Sem_Prag is
                      null;
 
                   else
-                     Error_Msg_NE
+                     Error_Msg_FE
                        ("default value for optional formal& is non-static!",
                         Arg_First_Optional_Parameter, Formal);
                   end if;
@@ -2506,7 +3050,6 @@ package body Sem_Prag is
                Next_Formal (Formal);
             end loop;
          end if;
-
       end Process_Extended_Import_Export_Subprogram_Pragma;
 
       --------------------------
@@ -2560,12 +3103,20 @@ package body Sem_Prag is
               or else
             Ekind (Def_Id) = E_Constant
          then
+            --  We do not permit Import to apply to a renaming declaration
+
+            if Present (Renamed_Object (Def_Id)) then
+               Error_Pragma_Arg
+                 ("pragma% not allowed for object renaming", Arg2);
+
             --  User initialization is not allowed for imported object, but
             --  the object declaration may contain a default initialization,
-            --  that will be discarded.
+            --  that will be discarded. Note that an explicit initialization
+            --  only counts if it comes from source, otherwise it is simply
+            --  the code generator making an implicit initialization explicit.
 
-            if Present (Expression (Parent (Def_Id)))
-               and then Comes_From_Source (Expression (Parent (Def_Id)))
+            elsif Present (Expression (Parent (Def_Id)))
+              and then Comes_From_Source (Expression (Parent (Def_Id)))
             then
                Error_Msg_Sloc := Sloc (Def_Id);
                Error_Pragma_Arg
@@ -2575,8 +3126,30 @@ package body Sem_Prag is
 
             else
                Set_Imported (Def_Id);
-               Set_Is_Public (Def_Id);
                Process_Interface_Name (Def_Id, Arg3, Arg4);
+
+               --  Note that we do not set Is_Public here. That's because we
+               --  only want to set if if there is no address clause, and we
+               --  don't know that yet, so we delay that processing till
+               --  freeze time.
+
+               --  pragma Import completes deferred constants
+
+               if Ekind (Def_Id) = E_Constant then
+                  Set_Has_Completion (Def_Id);
+               end if;
+
+               --  It is not possible to import a constant of an unconstrained
+               --  array type (e.g. string) because there is no simple way to
+               --  write a meaningful subtype for it.
+
+               if Is_Array_Type (Etype (Def_Id))
+                 and then not Is_Constrained (Etype (Def_Id))
+               then
+                  Error_Msg_NE
+                    ("imported constant& must have a constrained subtype",
+                      N, Def_Id);
+               end if;
             end if;
 
          elsif Is_Subprogram (Def_Id)
@@ -2586,7 +3159,6 @@ package body Sem_Prag is
             --  denoted entities in the same declarative part.
 
             Hom_Id := Def_Id;
-
             while Present (Hom_Id) loop
                Def_Id := Get_Base_Subprogram (Hom_Id);
 
@@ -2598,6 +3170,14 @@ package body Sem_Prag is
                then
                   null;
 
+               --  If it is not a subprogram, it must be in an outer
+               --  scope and pragma does not apply.
+
+               elsif not Is_Subprogram (Def_Id)
+                 and then not Is_Generic_Subprogram (Def_Id)
+               then
+                  null;
+
                --  Verify that the homonym is in the same declarative
                --  part (not just the same scope).
 
@@ -2609,20 +3189,66 @@ package body Sem_Prag is
                else
                   Set_Imported (Def_Id);
 
-                  --  If Import intrinsic, set intrinsic flag
-                  --  and verify that it is known as such.
+                  --  Special processing for Convention_Intrinsic
 
                   if C = Convention_Intrinsic then
+
+                     --  Link_Name argument not allowed for intrinsic
+
+                     if Present (Arg3)
+                       and then Chars (Arg3) = Name_Link_Name
+                     then
+                        Arg4 := Arg3;
+                     end if;
+
+                     if Present (Arg4) then
+                        Error_Pragma_Arg
+                          ("Link_Name argument not allowed for " &
+                           "Import Intrinsic",
+                           Arg4);
+                     end if;
+
                      Set_Is_Intrinsic_Subprogram (Def_Id);
-                     Check_Intrinsic_Subprogram
-                       (Def_Id, Expression (Arg2));
+
+                     --  If no external name is present, then check that
+                     --  this is a valid intrinsic subprogram. If an external
+                     --  name is present, then this is handled by the back end.
+
+                     if No (Arg3) then
+                        Check_Intrinsic_Subprogram (Def_Id, Expression (Arg2));
+                     end if;
                   end if;
 
-                  --  All interfaced procedures need an external
-                  --  symbol created for them since they are
-                  --  always referenced from another object file.
+                  --  All interfaced procedures need an external symbol
+                  --  created for them since they are always referenced
+                  --  from another object file.
 
                   Set_Is_Public (Def_Id);
+
+                  --  Verify that the subprogram does not have a completion
+                  --  through a renaming declaration. For other completions
+                  --  the pragma appears as a too late representation.
+
+                  declare
+                     Decl : constant Node_Id := Unit_Declaration_Node (Def_Id);
+
+                  begin
+                     if Present (Decl)
+                       and then Nkind (Decl) = N_Subprogram_Declaration
+                       and then Present (Corresponding_Body (Decl))
+                       and then
+                         Nkind
+                           (Unit_Declaration_Node
+                             (Corresponding_Body (Decl))) =
+                                             N_Subprogram_Renaming_Declaration
+                     then
+                        Error_Msg_Sloc := Sloc (Def_Id);
+                        Error_Msg_NE ("cannot import&#," &
+                           " already completed by a renaming",
+                           N, Def_Id);
+                     end if;
+                  end;
+
                   Set_Has_Completion (Def_Id);
                   Process_Interface_Name (Def_Id, Arg3, Arg4);
                end if;
@@ -2640,18 +3266,51 @@ package body Sem_Prag is
                end if;
             end loop;
 
-         --  When the convention is Java, we also allow Import to be given
-         --  for packages, exceptions, and record components.
+         --  When the convention is Java or CIL, we also allow Import to be
+         --  given for packages, generic packages, exceptions, and record
+         --  components.
 
-         elsif C = Convention_Java
-           and then (Ekind (Def_Id) = E_Package
-                     or else Ekind (Def_Id) = E_Exception
-                     or else Nkind (Parent (Def_Id)) = N_Component_Declaration)
+         elsif (C = Convention_Java or else C = Convention_CIL)
+           and then
+             (Ekind (Def_Id) = E_Package
+                or else Ekind (Def_Id) = E_Generic_Package
+                or else Ekind (Def_Id) = E_Exception
+                or else Nkind (Parent (Def_Id)) = N_Component_Declaration)
          then
             Set_Imported (Def_Id);
             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
+               --  Types treated as CPP classes are treated as limited, but we
+               --  don't require them to be declared this way. A warning is
+               --  issued to encourage the user to declare them as limited.
+               --  This is not an error, for compatibility reasons, because
+               --  these types have been supported this way for some time.
+
+               if not Is_Limited_Type (Def_Id) then
+                  Error_Msg_N
+                    ("imported 'C'P'P type should be " &
+                       "explicitly declared limited?",
+                     Get_Pragma_Arg (Arg2));
+                  Error_Msg_N
+                    ("\type will be considered limited",
+                     Get_Pragma_Arg (Arg2));
+               end if;
+
+               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",
@@ -2665,12 +3324,10 @@ package body Sem_Prag is
          if Nkind (Parent (N)) = N_Compilation_Unit_Aux then
             declare
                Cunit : constant Node_Id := Parent (Parent (N));
-
             begin
-               Set_Body_Required    (Cunit, False);
+               Set_Body_Required (Cunit, False);
             end;
          end if;
-
       end Process_Import_Or_Interface;
 
       --------------------
@@ -2678,11 +3335,12 @@ package body Sem_Prag is
       --------------------
 
       procedure Process_Inline (Active : Boolean) is
-         Assoc   : Node_Id;
-         Decl    : Node_Id;
-         Subp_Id : Node_Id;
-         Subp    : Entity_Id;
-         Applies : Boolean;
+         Assoc     : Node_Id;
+         Decl      : Node_Id;
+         Subp_Id   : Node_Id;
+         Subp      : Entity_Id;
+         Applies   : Boolean;
+         Effective : Boolean := False;
 
          procedure Make_Inline (Subp : Entity_Id);
          --  Subp is the defining unit name of the subprogram
@@ -2692,18 +3350,85 @@ package body Sem_Prag is
          procedure Set_Inline_Flags (Subp : Entity_Id);
          --  Sets Is_Inlined and Has_Pragma_Inline flags for Subp
 
+         function Inlining_Not_Possible (Subp : Entity_Id) return Boolean;
+         --  Returns True if it can be determined at this stage that inlining
+         --  is not possible, for examle if the body is available and contains
+         --  exception handlers, we prevent inlining, since otherwise we can
+         --  get undefined symbols at link time. This function also emits a
+         --  warning if front-end inlining is enabled and the pragma appears
+         --  too late.
+         --  ??? is business with link symbols still valid, or does it relate
+         --  to front end ZCX which is being phased out ???
+
+         ---------------------------
+         -- Inlining_Not_Possible --
+         ---------------------------
+
+         function Inlining_Not_Possible (Subp : Entity_Id) return Boolean is
+            Decl  : constant Node_Id := Unit_Declaration_Node (Subp);
+            Stats : Node_Id;
+
+         begin
+            if Nkind (Decl) = N_Subprogram_Body then
+               Stats := Handled_Statement_Sequence (Decl);
+               return Present (Exception_Handlers (Stats))
+                 or else Present (At_End_Proc (Stats));
+
+            elsif Nkind (Decl) = N_Subprogram_Declaration
+              and then Present (Corresponding_Body (Decl))
+            then
+               if Front_End_Inlining
+                 and then Analyzed (Corresponding_Body (Decl))
+               then
+                  Error_Msg_N ("pragma appears too late, ignored?", N);
+                  return True;
+
+               --  If the subprogram is a renaming as body, the body is
+               --  just a call to the renamed subprogram, and inlining is
+               --  trivially possible.
+
+               elsif
+                 Nkind (Unit_Declaration_Node (Corresponding_Body (Decl))) =
+                                             N_Subprogram_Renaming_Declaration
+               then
+                  return False;
+
+               else
+                  Stats :=
+                    Handled_Statement_Sequence
+                        (Unit_Declaration_Node (Corresponding_Body (Decl)));
+
+                  return
+                    Present (Exception_Handlers (Stats))
+                      or else Present (At_End_Proc (Stats));
+               end if;
+
+            else
+               --  If body is not available, assume the best, the check is
+               --  performed again when compiling enclosing package bodies.
+
+               return False;
+            end if;
+         end Inlining_Not_Possible;
+
          -----------------
          -- Make_Inline --
          -----------------
 
          procedure Make_Inline (Subp : Entity_Id) is
-            Kind       : Entity_Kind := Ekind (Subp);
+            Kind       : constant Entity_Kind := Ekind (Subp);
             Inner_Subp : Entity_Id   := Subp;
 
          begin
             if Etype (Subp) = Any_Type then
                return;
 
+            --  If inlining is not possible, for now do not treat as an error
+
+            elsif Inlining_Not_Possible (Subp) then
+               Applies := True;
+               return;
+
             --  Here we have a candidate for inlining, but we must exclude
             --  derived operations. Otherwise we will end up trying to
             --  inline a phantom declaration, and the result would be to
@@ -2738,24 +3463,24 @@ package body Sem_Prag is
 
             --  Processing for procedure, operator or function.
             --  If subprogram is aliased (as for an instance) indicate
-            --  that the renamed entity is inlined.
+            --  that the renamed entity (if declared in the same unit)
+            --  is inlined.
 
-            if Kind = E_Procedure
-              or else Kind = E_Function
-              or else Kind = E_Operator
-            then
+            if Is_Subprogram (Subp) then
                while Present (Alias (Inner_Subp)) loop
                   Inner_Subp := Alias (Inner_Subp);
                end loop;
 
-               Set_Inline_Flags (Inner_Subp);
+               if In_Same_Source_Unit (Subp, Inner_Subp) then
+                  Set_Inline_Flags (Inner_Subp);
 
-               Decl := Parent (Parent (Inner_Subp));
+                  Decl := Parent (Parent (Inner_Subp));
 
-               if Nkind (Decl) = N_Subprogram_Declaration
-                 and then Present (Corresponding_Body (Decl))
-               then
-                  Set_Inline_Flags (Corresponding_Body (Decl));
+                  if Nkind (Decl) = N_Subprogram_Declaration
+                    and then Present (Corresponding_Body (Decl))
+                  then
+                     Set_Inline_Flags (Corresponding_Body (Decl));
+                  end if;
                end if;
 
                Applies := True;
@@ -2764,13 +3489,11 @@ package body Sem_Prag is
             --  the point of instantiation, to determine whether the
             --  body should be generated.
 
-            elsif Kind = E_Generic_Procedure
-              or else Kind = E_Generic_Function
-            then
+            elsif Is_Generic_Subprogram (Subp) then
                Set_Inline_Flags (Subp);
                Applies := True;
 
-            --  Literals are by definition inlined.
+            --  Literals are by definition inlined
 
             elsif Kind = E_Enumeration_Literal then
                null;
@@ -2797,6 +3520,7 @@ package body Sem_Prag is
                Set_Has_Pragma_Inline (Subp);
                Set_Next_Rep_Item (N, First_Rep_Item (Subp));
                Set_First_Rep_Item (Subp, N);
+               Effective := True;
             end if;
          end Set_Inline_Flags;
 
@@ -2820,7 +3544,11 @@ package body Sem_Prag is
                Subp := Entity (Subp_Id);
 
                if Subp = Any_Id then
+
+                  --  If previous error, avoid cascaded errors
+
                   Applies := True;
+                  Effective := True;
 
                else
                   Make_Inline (Subp);
@@ -2837,11 +3565,21 @@ package body Sem_Prag is
             if not Applies then
                Error_Pragma_Arg
                  ("inappropriate argument for pragma%", Assoc);
+
+            elsif not Effective
+              and then Warn_On_Redundant_Constructs
+            then
+               if Inlining_Not_Possible (Subp) then
+                  Error_Msg_NE
+                    ("pragma Inline for& is ignored?", N, Entity (Subp_Id));
+               else
+                  Error_Msg_NE
+                    ("pragma Inline for& is redundant?", N, Entity (Subp_Id));
+               end if;
             end if;
 
             Next (Assoc);
          end loop;
-
       end Process_Inline;
 
       ----------------------------
@@ -2863,6 +3601,10 @@ package body Sem_Prag is
          --  particular that no spaces or other obviously incorrect characters
          --  appear. This is only a warning, since any characters are allowed.
 
+         ----------------------------------
+         -- Check_Form_Of_Interface_Name --
+         ----------------------------------
+
          procedure Check_Form_Of_Interface_Name (SN : Node_Id) is
             S  : constant String_Id := Strval (Expr_Value_S (SN));
             SL : constant Nat       := String_Length (S);
@@ -2876,9 +3618,12 @@ package body Sem_Prag is
             for J in 1 .. SL loop
                C := Get_String_Char (S, J);
 
-               if not In_Character_Range (C)
-                 or else Get_Character (C) = ' '
-                 or else Get_Character (C) = ','
+               if Warn_On_Export_Import
+                 and then
+                   (not In_Character_Range (C)
+                     or else (Get_Character (C) = ' '
+                               and then VM_Target /= CLI_Target)
+                     or else Get_Character (C) = ',')
                then
                   Error_Msg_N
                     ("?interface name contains illegal character", SN);
@@ -2891,6 +3636,18 @@ package body Sem_Prag is
       begin
          if No (Link_Arg) then
             if No (Ext_Arg) then
+               if VM_Target = CLI_Target
+                 and then Ekind (Subprogram_Def) = E_Package
+                 and then Nkind (Parent (Subprogram_Def)) =
+                                                 N_Package_Specification
+                 and then Present (Generic_Parent (Parent (Subprogram_Def)))
+               then
+                  Set_Interface_Name
+                     (Subprogram_Def,
+                      Interface_Name
+                        (Generic_Parent (Parent (Subprogram_Def))));
+               end if;
+
                return;
 
             elsif Chars (Ext_Arg) = Name_Link_Name then
@@ -2966,9 +3723,7 @@ package body Sem_Prag is
          --  If there is no link name, just set the external name
 
          if No (Link_Nam) then
-            Set_Encoded_Interface_Name
-              (Get_Base_Subprogram (Subprogram_Def),
-               Adjust_External_Name_Case (Expr_Value_S (Ext_Nam)));
+            Link_Nam := Adjust_External_Name_Case (Expr_Value_S (Ext_Nam));
 
          --  For the Link_Name case, the given literal is preceded by an
          --  asterisk, which indicates to GCC that the given name should
@@ -2978,7 +3733,11 @@ package body Sem_Prag is
 
          else
             Start_String;
-            Store_String_Char (Get_Char_Code ('*'));
+
+            if VM_Target = No_VM then
+               Store_String_Char (Get_Char_Code ('*'));
+            end if;
+
             String_Val := Strval (Expr_Value_S (Link_Nam));
 
             for J in 1 .. String_Length (String_Val) loop
@@ -2987,10 +3746,11 @@ package body Sem_Prag is
 
             Link_Nam :=
               Make_String_Literal (Sloc (Link_Nam), End_String);
-
-            Set_Encoded_Interface_Name
-              (Get_Base_Subprogram (Subprogram_Def), Link_Nam);
          end if;
+
+         Set_Encoded_Interface_Name
+           (Get_Base_Subprogram (Subprogram_Def), Link_Nam);
+         Check_Duplicated_Export_Name (Link_Nam);
       end Process_Interface_Name;
 
       -----------------------------------------
@@ -2998,108 +3758,234 @@ package body Sem_Prag is
       -----------------------------------------
 
       procedure Process_Interrupt_Or_Attach_Handler is
-         Arg1_X    : constant Node_Id   := Expression (Arg1);
-         Prot_Proc : constant Entity_Id := Entity (Arg1_X);
-         Prot_Type : constant Entity_Id := Scope (Prot_Proc);
+         Arg1_X       : constant Node_Id   := Expression (Arg1);
+         Handler_Proc : constant Entity_Id := Entity (Arg1_X);
+         Proc_Scope   : constant Entity_Id := Scope (Handler_Proc);
 
       begin
-         Set_Is_Interrupt_Handler (Prot_Proc);
+         Set_Is_Interrupt_Handler (Handler_Proc);
 
-         if Prag_Id = Pragma_Interrupt_Handler
-           or Prag_Id = Pragma_Attach_Handler
-         then
-            Record_Rep_Item (Prot_Type, N);
-         end if;
+         --  If the pragma is not associated with a handler procedure
+         --  within a protected type, then it must be for a nonprotected
+         --  procedure for the AAMP target, in which case we don't
+         --  associate a representation item with the procedure's scope.
 
+         if Ekind (Proc_Scope) = E_Protected_Type then
+            if Prag_Id = Pragma_Interrupt_Handler
+                 or else
+               Prag_Id = Pragma_Attach_Handler
+            then
+               Record_Rep_Item (Proc_Scope, N);
+            end if;
+         end if;
       end Process_Interrupt_Or_Attach_Handler;
 
+      --------------------------------------------------
+      -- Process_Restrictions_Or_Restriction_Warnings --
+      --------------------------------------------------
+
+      --  Note: some of the simple identifier cases were handled in par-prag,
+      --  but it is harmless (and more straightforward) to simply handle all
+      --  cases here, even if it means we repeat a bit of work in some cases.
+
+      procedure Process_Restrictions_Or_Restriction_Warnings
+        (Warn : Boolean)
+      is
+         Arg   : Node_Id;
+         R_Id  : Restriction_Id;
+         Id    : Name_Id;
+         Expr  : Node_Id;
+         Val   : Uint;
+
+         procedure Check_Unit_Name (N : Node_Id);
+         --  Checks unit name parameter for No_Dependence. Returns if it has
+         --  an appropriate form, otherwise raises pragma argument error.
+
+         ---------------------
+         -- Check_Unit_Name --
+         ---------------------
+
+         procedure Check_Unit_Name (N : Node_Id) is
+         begin
+            if Nkind (N) = N_Selected_Component then
+               Check_Unit_Name (Prefix (N));
+               Check_Unit_Name (Selector_Name (N));
+
+            elsif Nkind (N) = N_Identifier then
+               return;
+
+            else
+               Error_Pragma_Arg
+                 ("wrong form for unit name for No_Dependence", N);
+            end if;
+         end Check_Unit_Name;
+
+      --  Start of processing for Process_Restrictions_Or_Restriction_Warnings
+
+      begin
+         Check_Ada_83_Warning;
+         Check_At_Least_N_Arguments (1);
+         Check_Valid_Configuration_Pragma;
+
+         Arg := Arg1;
+         while Present (Arg) loop
+            Id := Chars (Arg);
+            Expr := Expression (Arg);
+
+            --  Case of no restriction identifier present
+
+            if Id = No_Name then
+               if Nkind (Expr) /= N_Identifier then
+                  Error_Pragma_Arg
+                    ("invalid form for restriction", Arg);
+               end if;
+
+               R_Id :=
+                 Get_Restriction_Id
+                   (Process_Restriction_Synonyms (Expr));
+
+               if R_Id not in All_Boolean_Restrictions then
+                  Error_Pragma_Arg
+                    ("invalid restriction identifier", Arg);
+               end if;
+
+               if Implementation_Restriction (R_Id) then
+                  Check_Restriction
+                    (No_Implementation_Restrictions, Arg);
+               end if;
+
+               --  If this is a warning, then set the warning unless we already
+               --  have a real restriction active (we never want a warning to
+               --  override a real restriction).
+
+               if Warn then
+                  if not Restriction_Active (R_Id) then
+                     Set_Restriction (R_Id, N);
+                     Restriction_Warnings (R_Id) := True;
+                  end if;
+
+               --  If real restriction case, then set it and make sure that the
+               --  restriction warning flag is off, since a real restriction
+               --  always overrides a warning.
+
+               else
+                  Set_Restriction (R_Id, N);
+                  Restriction_Warnings (R_Id) := False;
+               end if;
+
+               --  A very special case that must be processed here: pragma
+               --  Restrictions (No_Exceptions) turns off all run-time
+               --  checking. This is a bit dubious in terms of the formal
+               --  language definition, but it is what is intended by RM
+               --  H.4(12). Restriction_Warnings never affects generated code
+               --  so this is done only in the real restriction case.
+
+               if R_Id = No_Exceptions and then not Warn then
+                  Scope_Suppress := (others => True);
+               end if;
+
+            --  Case of No_Dependence => unit-name. Note that the parser
+            --  already made the necessary entry in the No_Dependence table.
+
+            elsif Id = Name_No_Dependence then
+               Check_Unit_Name (Expr);
+
+            --  All other cases of restriction identifier present
+
+            else
+               R_Id := Get_Restriction_Id (Process_Restriction_Synonyms (Arg));
+               Analyze_And_Resolve (Expr, Any_Integer);
+
+               if R_Id not in All_Parameter_Restrictions then
+                  Error_Pragma_Arg
+                    ("invalid restriction parameter identifier", Arg);
+
+               elsif not Is_OK_Static_Expression (Expr) then
+                  Flag_Non_Static_Expr
+                    ("value must be static expression!", Expr);
+                  raise Pragma_Exit;
+
+               elsif not Is_Integer_Type (Etype (Expr))
+                 or else Expr_Value (Expr) < 0
+               then
+                  Error_Pragma_Arg
+                    ("value must be non-negative integer", Arg);
+               end if;
+
+               --  Restriction pragma is active
+
+               Val := Expr_Value (Expr);
+
+               if not UI_Is_In_Int_Range (Val) then
+                  Error_Pragma_Arg
+                    ("pragma ignored, value too large?", Arg);
+               end if;
+
+               --  Warning case. If the real restriction is active, then we
+               --  ignore the request, since warning never overrides a real
+               --  restriction. Otherwise we set the proper warning. Note that
+               --  this circuit sets the warning again if it is already set,
+               --  which is what we want, since the constant may have changed.
+
+               if Warn then
+                  if not Restriction_Active (R_Id) then
+                     Set_Restriction
+                       (R_Id, N, Integer (UI_To_Int (Val)));
+                     Restriction_Warnings (R_Id) := True;
+                  end if;
+
+               --  Real restriction case, set restriction and make sure warning
+               --  flag is off since real restriction always overrides warning.
+
+               else
+                  Set_Restriction (R_Id, N, Integer (UI_To_Int (Val)));
+                  Restriction_Warnings (R_Id) := False;
+               end if;
+            end if;
+
+            Next (Arg);
+         end loop;
+      end Process_Restrictions_Or_Restriction_Warnings;
+
       ---------------------------------
       -- Process_Suppress_Unsuppress --
       ---------------------------------
 
+      --  Note: this procedure makes entries in the check suppress data
+      --  structures managed by Sem. See spec of package Sem for full
+      --  details on how we handle recording of check suppression.
+
       procedure Process_Suppress_Unsuppress (Suppress_Case : Boolean) is
-         C         : Check_Id;
-         E_Id      : Node_Id;
-         E         : Entity_Id;
-         Effective : Boolean;
+         C    : Check_Id;
+         E_Id : Node_Id;
+         E    : Entity_Id;
+
+         In_Package_Spec : constant Boolean :=
+                             (Ekind (Current_Scope) = E_Package
+                                or else
+                              Ekind (Current_Scope) = E_Generic_Package)
+                               and then not In_Package_Body (Current_Scope);
 
          procedure Suppress_Unsuppress_Echeck (E : Entity_Id; C : Check_Id);
          --  Used to suppress a single check on the given entity
 
+         --------------------------------
+         -- Suppress_Unsuppress_Echeck --
+         --------------------------------
+
          procedure Suppress_Unsuppress_Echeck (E : Entity_Id; C : Check_Id) is
-         begin
-            --  First set appropriate suppress flags in the entity
-
-            case C is
-               when Access_Check =>
-                  Effective := Suppress_Access_Checks (E);
-                  Set_Suppress_Access_Checks (E, Suppress_Case);
-
-               when Accessibility_Check =>
-                  Effective := Suppress_Accessibility_Checks (E);
-                  Set_Suppress_Accessibility_Checks (E, Suppress_Case);
-
-               when Discriminant_Check =>
-                  Effective := Suppress_Discriminant_Checks  (E);
-                  Set_Suppress_Discriminant_Checks (E, Suppress_Case);
-
-               when Division_Check =>
-                  Effective := Suppress_Division_Checks (E);
-                  Set_Suppress_Division_Checks (E, Suppress_Case);
-
-               when Elaboration_Check =>
-                  Effective := Suppress_Elaboration_Checks (E);
-                  Set_Suppress_Elaboration_Checks (E, Suppress_Case);
-
-               when Index_Check =>
-                  Effective := Suppress_Index_Checks (E);
-                  Set_Suppress_Index_Checks (E, Suppress_Case);
-
-               when Length_Check =>
-                  Effective := Suppress_Length_Checks (E);
-                  Set_Suppress_Length_Checks (E, Suppress_Case);
-
-               when Overflow_Check =>
-                  Effective := Suppress_Overflow_Checks (E);
-                  Set_Suppress_Overflow_Checks (E, Suppress_Case);
-
-               when Range_Check =>
-                  Effective := Suppress_Range_Checks (E);
-                  Set_Suppress_Range_Checks (E, Suppress_Case);
-
-               when Storage_Check =>
-                  Effective := Suppress_Storage_Checks (E);
-                  Set_Suppress_Storage_Checks (E, Suppress_Case);
-
-               when Tag_Check =>
-                  Effective := Suppress_Tag_Checks (E);
-                  Set_Suppress_Tag_Checks (E, Suppress_Case);
-
-               when All_Checks =>
-                  Suppress_Unsuppress_Echeck (E, Access_Check);
-                  Suppress_Unsuppress_Echeck (E, Accessibility_Check);
-                  Suppress_Unsuppress_Echeck (E, Discriminant_Check);
-                  Suppress_Unsuppress_Echeck (E, Division_Check);
-                  Suppress_Unsuppress_Echeck (E, Elaboration_Check);
-                  Suppress_Unsuppress_Echeck (E, Index_Check);
-                  Suppress_Unsuppress_Echeck (E, Length_Check);
-                  Suppress_Unsuppress_Echeck (E, Overflow_Check);
-                  Suppress_Unsuppress_Echeck (E, Range_Check);
-                  Suppress_Unsuppress_Echeck (E, Storage_Check);
-                  Suppress_Unsuppress_Echeck (E, Tag_Check);
-            end case;
+            ESR : constant Entity_Check_Suppress_Record :=
+                    (Entity   => E,
+                     Check    => C,
+                     Suppress => Suppress_Case);
 
-            --  If the entity is not declared in the current scope, then we
-            --  make an entry in the Entity_Suppress table so that the flag
-            --  will be removed on exit. This entry is only made if the
-            --  suppress did something (i.e. the flag was not already set).
+         begin
+            Set_Checks_May_Be_Suppressed (E);
 
-            if Effective and then Scope (E) /= Current_Scope then
-               Entity_Suppress.Increment_Last;
-               Entity_Suppress.Table
-                 (Entity_Suppress.Last).Entity := E;
-               Entity_Suppress.Table
-                 (Entity_Suppress.Last).Check  := C;
+            if In_Package_Spec then
+               Global_Entity_Suppress.Append (ESR);
+            else
+               Local_Entity_Suppress.Append (ESR);
             end if;
 
             --  If this is a first subtype, and the base type is distinct,
@@ -3130,50 +4016,49 @@ package body Sem_Prag is
          if not Is_Check_Name (Chars (Expression (Arg1))) then
             Error_Pragma_Arg
               ("argument of pragma% is not valid check name", Arg1);
-
          else
             C := Get_Check_Id (Chars (Expression (Arg1)));
          end if;
 
-         if Arg_Count = 1 then
-            case C is
-               when Access_Check =>
-                  Scope_Suppress.Access_Checks := Suppress_Case;
-
-               when Accessibility_Check =>
-                  Scope_Suppress.Accessibility_Checks := Suppress_Case;
-
-               when Discriminant_Check =>
-                  Scope_Suppress.Discriminant_Checks := Suppress_Case;
-
-               when Division_Check =>
-                  Scope_Suppress.Division_Checks := Suppress_Case;
+         if not Suppress_Case
+           and then (C = All_Checks or else C = Overflow_Check)
+         then
+            Opt.Overflow_Checks_Unsuppressed := True;
+         end if;
 
-               when Elaboration_Check =>
-                  Scope_Suppress.Elaboration_Checks := Suppress_Case;
+         if Arg_Count = 1 then
 
-               when Index_Check =>
-                  Scope_Suppress.Index_Checks := Suppress_Case;
+            --  Make an entry in the local scope suppress table. This is the
+            --  table that directly shows the current value of the scope
+            --  suppress check for any check id value.
 
-               when Length_Check =>
-                  Scope_Suppress.Length_Checks := Suppress_Case;
+            if C = All_Checks then
 
-               when Overflow_Check =>
-                  Scope_Suppress.Overflow_Checks := Suppress_Case;
+               --  For All_Checks, we set all specific checks with the
+               --  exception of Elaboration_Check, which is handled specially
+               --  because of not wanting All_Checks to have the effect of
+               --  deactivating static elaboration order processing.
 
-               when Range_Check =>
-                  Scope_Suppress.Range_Checks := Suppress_Case;
+               for J in Scope_Suppress'Range loop
+                  if J /= Elaboration_Check then
+                     Scope_Suppress (J) := Suppress_Case;
+                  end if;
+               end loop;
 
-               when Storage_Check =>
-                  Scope_Suppress.Storage_Checks := Suppress_Case;
+            --  If not All_Checks, just set appropriate entry. Note that we
+            --  will set Elaboration_Check if this is explicitly specified.
 
-               when Tag_Check =>
-                  Scope_Suppress.Tag_Checks := Suppress_Case;
+            else
+               Scope_Suppress (C) := Suppress_Case;
+            end if;
 
-               when All_Checks =>
-                  Scope_Suppress := (others => Suppress_Case);
+            --  Also make an entry in the Local_Entity_Suppress table. See
+            --  extended description in the package spec of Sem for details.
 
-            end case;
+            Local_Entity_Suppress.Append
+              ((Entity   => Empty,
+                Check    => C,
+                Suppress => Suppress_Case));
 
          --  Case of two arguments present, where the check is
          --  suppressed for a specified entity (given as the second
@@ -3193,34 +4078,48 @@ package body Sem_Prag is
 
             if E = Any_Id then
                return;
-            else
-               loop
-                  Suppress_Unsuppress_Echeck (E, C);
+            end if;
 
-                  if Is_Generic_Instance (E)
-                    and then Is_Subprogram (E)
-                    and then Present (Alias (E))
-                  then
-                     Suppress_Unsuppress_Echeck (Alias (E), C);
-                  end if;
+            --  Enforce RM 11.5(7) which requires that for a pragma that
+            --  appears within a package spec, the named entity must be
+            --  within the package spec. We allow the package name itself
+            --  to be mentioned since that makes sense, although it is not
+            --  strictly allowed by 11.5(7).
 
-                  if C = Elaboration_Check and then Suppress_Case then
-                     Set_Suppress_Elaboration_Warnings (E);
-                  end if;
+            if In_Package_Spec
+              and then E /= Current_Scope
+              and then Scope (E) /= Current_Scope
+            then
+               Error_Pragma_Arg
+                 ("entity in pragma% is not in package spec ('R'M 11.5(7))",
+                  Arg2);
+            end if;
+
+            --  Loop through homonyms. As noted below, in the case of a package
+            --  spec, only homonyms within the package spec are considered.
 
-                  --  If we are within a package specification, the
-                  --  pragma only applies to homonyms in the same scope.
+            loop
+               Suppress_Unsuppress_Echeck (E, C);
 
-                  exit when No (Homonym (E))
-                    or else (Scope (Homonym (E)) /= Current_Scope
-                              and then Ekind (Current_Scope) = E_Package
-                              and then not In_Package_Body (Current_Scope));
+               if Is_Generic_Instance (E)
+                 and then Is_Subprogram (E)
+                 and then Present (Alias (E))
+               then
+                  Suppress_Unsuppress_Echeck (Alias (E), C);
+               end if;
 
-                  E := Homonym (E);
-               end loop;
-            end if;
-         end if;
+               --  Move to next homonym
+
+               E := Homonym (E);
+               exit when No (E);
+
+               --  If we are within a package specification, the
+               --  pragma only applies to homonyms in the same scope.
 
+               exit when In_Package_Spec
+                 and then Scope (E) /= Current_Scope;
+            end loop;
+         end if;
       end Process_Suppress_Unsuppress;
 
       ------------------
@@ -3240,6 +4139,12 @@ package body Sem_Prag is
 
          Set_Is_Exported (E);
 
+         --  Generate a reference for entity explicitly, because the
+         --  identifier may be overloaded and name resolution will not
+         --  generate one.
+
+         Generate_Reference (E, Arg);
+
          --  Deal with exporting non-library level entity
 
          if not Is_Library_Level_Entity (E) then
@@ -3254,14 +4159,34 @@ package body Sem_Prag is
             else
                Set_Is_Public (E);
                Set_Is_Statically_Allocated (E);
+
+               --  Warn if the corresponding W flag is set and the pragma
+               --  comes from source. The latter may not be true e.g. on
+               --  VMS where we expand export pragmas for exception codes
+               --  associated with imported or exported exceptions. We do
+               --  not want to generate a warning for something that the
+               --  user did not write.
+
+               if Warn_On_Export_Import
+                 and then Comes_From_Source (Arg)
+               then
+                  Error_Msg_NE
+                    ("?& has been made static as a result of Export", Arg, E);
+                  Error_Msg_N
+                    ("\this usage is non-standard and non-portable", Arg);
+               end if;
             end if;
          end if;
 
-         if Inside_A_Generic then
+         if Warn_On_Export_Import and then Is_Type (E) then
             Error_Msg_NE
-              ("all instances of& will have the same external name?", Arg, E);
+              ("exporting a type has no effect?", Arg, E);
          end if;
 
+         if Warn_On_Export_Import and Inside_A_Generic then
+            Error_Msg_NE
+              ("all instances of& will have the same external name?", Arg, E);
+         end if;
       end Set_Exported;
 
       ----------------------------------------------
@@ -3278,8 +4203,11 @@ package body Sem_Prag is
       begin
          if No (Arg_External) then
             return;
+         end if;
+
+         Check_Arg_Is_External_Name (Arg_External);
 
-         elsif Nkind (Arg_External) = N_String_Literal then
+         if Nkind (Arg_External) = N_String_Literal then
             if String_Length (Strval (Arg_External)) = 0 then
                return;
             else
@@ -3289,23 +4217,29 @@ package body Sem_Prag is
          elsif Nkind (Arg_External) = N_Identifier then
             New_Name := Get_Default_External_Name (Arg_External);
 
+         --  Check_Arg_Is_External_Name should let through only
+         --  identifiers and string literals or static string
+         --  expressions (which are folded to string literals).
+
          else
-            Error_Pragma_Arg
-              ("incorrect form for External parameter for pragma%",
-               Arg_External);
+            raise Program_Error;
          end if;
 
          --  If we already have an external name set (by a prior normal
          --  Import or Export pragma), then the external names must match
 
          if Present (Interface_Name (Internal_Ent)) then
-            declare
+            Check_Matching_Internal_Names : declare
                S1 : constant String_Id := Strval (Old_Name);
                S2 : constant String_Id := Strval (New_Name);
 
                procedure Mismatch;
                --  Called if names do not match
 
+               --------------
+               -- Mismatch --
+               --------------
+
                procedure Mismatch is
                begin
                   Error_Msg_Sloc := Sloc (Old_Name);
@@ -3314,6 +4248,8 @@ package body Sem_Prag is
                      Arg_External);
                end Mismatch;
 
+            --  Start of processing for Check_Matching_Internal_Names
+
             begin
                if String_Length (S1) /= String_Length (S2) then
                   Mismatch;
@@ -3325,14 +4261,14 @@ package body Sem_Prag is
                      end if;
                   end loop;
                end if;
-            end;
+            end Check_Matching_Internal_Names;
 
          --  Otherwise set the given name
 
          else
             Set_Encoded_Interface_Name (Internal_Ent, New_Name);
+            Check_Duplicated_Export_Name (New_Name);
          end if;
-
       end Set_Extended_Import_Export_External_Name;
 
       ------------------
@@ -3389,11 +4325,19 @@ package body Sem_Prag is
          procedure Bad_Mechanism;
          --  Signal bad mechanism name
 
+         ---------------
+         -- Bad_Class --
+         ---------------
+
          procedure Bad_Class is
          begin
             Error_Pragma_Arg ("unrecognized descriptor class name", Class);
          end Bad_Class;
 
+         -------------------------
+         -- Bad_Mechanism_Value --
+         -------------------------
+
          procedure Bad_Mechanism is
          begin
             Error_Pragma_Arg ("unrecognized mechanism name", Mech_Name);
@@ -3501,14 +4445,82 @@ package body Sem_Prag is
          else
             Bad_Class;
          end if;
-
       end Set_Mechanism_Value;
 
+      ---------------------------
+      -- Set_Ravenscar_Profile --
+      ---------------------------
+
+      --  The tasks to be done here are
+
+      --    Set required policies
+
+      --      pragma Task_Dispatching_Policy (FIFO_Within_Priorities)
+      --      pragma Locking_Policy (Ceiling_Locking)
+
+      --    Set Detect_Blocking mode
+
+      --    Set required restrictions (see System.Rident for detailed list)
+
+      procedure Set_Ravenscar_Profile (N : Node_Id) is
+      begin
+         --  pragma Task_Dispatching_Policy (FIFO_Within_Priorities)
+
+         if Task_Dispatching_Policy /= ' '
+           and then Task_Dispatching_Policy /= 'F'
+         then
+            Error_Msg_Sloc := Task_Dispatching_Policy_Sloc;
+            Error_Pragma ("Profile (Ravenscar) incompatible with policy#");
+
+         --  Set the FIFO_Within_Priorities policy, but always preserve
+         --  System_Location since we like the error message with the run time
+         --  name.
+
+         else
+            Task_Dispatching_Policy := 'F';
+
+            if Task_Dispatching_Policy_Sloc /= System_Location then
+               Task_Dispatching_Policy_Sloc := Loc;
+            end if;
+         end if;
+
+         --  pragma Locking_Policy (Ceiling_Locking)
+
+         if Locking_Policy /= ' '
+           and then Locking_Policy /= 'C'
+         then
+            Error_Msg_Sloc := Locking_Policy_Sloc;
+            Error_Pragma ("Profile (Ravenscar) incompatible with policy#");
+
+         --  Set the Ceiling_Locking policy, but preserve System_Location since
+         --  we like the error message with the run time name.
+
+         else
+            Locking_Policy := 'C';
+
+            if Locking_Policy_Sloc /= System_Location then
+               Locking_Policy_Sloc := Loc;
+            end if;
+         end if;
+
+         --  pragma Detect_Blocking
+
+         Detect_Blocking := True;
+
+         --  Set the corresponding restrictions
+
+         Set_Profile_Restrictions (Ravenscar, N, Warn => False);
+      end Set_Ravenscar_Profile;
+
    --  Start of processing for Analyze_Pragma
 
    begin
       if not Is_Pragma_Name (Chars (N)) then
-         Error_Pragma ("unrecognized pragma%!?");
+         if Warn_On_Unrecognized_Pragma then
+            Error_Pragma ("unrecognized pragma%?");
+         else
+            return;
+         end if;
       else
          Prag_Id := Get_Pragma_Id (Chars (N));
       end if;
@@ -3540,11 +4552,9 @@ package body Sem_Prag is
 
       declare
          Arg_Node : Node_Id;
-
       begin
          Arg_Count := 0;
          Arg_Node := Arg1;
-
          while Present (Arg_Node) loop
             Arg_Count := Arg_Count + 1;
             Next (Arg_Node);
@@ -3584,12 +4594,12 @@ package body Sem_Prag is
          --  pragma Ada_83;
 
          --  Note: this pragma also has some specific processing in Par.Prag
-         --  because we want to set the Ada 83 mode switch during parsing.
+         --  because we want to set the Ada version mode during parsing.
 
          when Pragma_Ada_83 =>
             GNAT_Pragma;
-            Ada_83 := True;
-            Ada_95 := False;
+            Ada_Version := Ada_83;
+            Ada_Version_Explicit := Ada_Version;
             Check_Arg_Count (0);
 
          ------------
@@ -3599,14 +4609,50 @@ package body Sem_Prag is
          --  pragma Ada_95;
 
          --  Note: this pragma also has some specific processing in Par.Prag
-         --  because we want to set the Ada 83 mode switch during parsing.
+         --  because we want to set the Ada 83 version mode during parsing.
 
          when Pragma_Ada_95 =>
             GNAT_Pragma;
-            Ada_83 := False;
-            Ada_95 := True;
+            Ada_Version := Ada_95;
+            Ada_Version_Explicit := Ada_Version;
             Check_Arg_Count (0);
 
+         ---------------------
+         -- Ada_05/Ada_2005 --
+         ---------------------
+
+         --  pragma Ada_05;
+         --  pragma Ada_05 (LOCAL_NAME);
+
+         --  pragma Ada_2005;
+         --  pragma Ada_2005 (LOCAL_NAME):
+
+         --  Note: these pragma also have some specific processing in Par.Prag
+         --  because we want to set the Ada 2005 version mode during parsing.
+
+         when Pragma_Ada_05 | Pragma_Ada_2005 => declare
+            E_Id : Node_Id;
+
+         begin
+            GNAT_Pragma;
+
+            if Arg_Count = 1 then
+               Check_Arg_Is_Local_Name (Arg1);
+               E_Id := Expression (Arg1);
+
+               if Etype (E_Id) = Any_Type then
+                  return;
+               end if;
+
+               Set_Is_Ada_2005_Only (Entity (E_Id));
+
+            else
+               Check_Arg_Count (0);
+               Ada_Version := Ada_05;
+               Ada_Version_Explicit := Ada_05;
+            end if;
+         end;
+
          ----------------------
          -- All_Calls_Remote --
          ----------------------
@@ -3626,7 +4672,7 @@ package body Sem_Prag is
 
             Lib_Entity := Find_Lib_Unit_Name;
 
-            --  This pragma should only apply to a RCI unit (RM E.2.3(23)).
+            --  This pragma should only apply to a RCI unit (RM E.2.3(23))
 
             if Present (Lib_Entity)
               and then not Debug_Flag_U
@@ -3674,7 +4720,7 @@ package body Sem_Prag is
                      Error_Pragma_Arg ("ambiguous argument for pragma%", Exp);
 
                   else
-                     Resolve (Exp, Etype (Exp));
+                     Resolve (Exp);
                   end if;
 
                   Next (Arg);
@@ -3686,14 +4732,21 @@ package body Sem_Prag is
          -- Assert --
          ------------
 
-         --  pragma Assert (Boolean_EXPRESSION [, static_string_EXPRESSION]);
+         --  pragma Assert ([Check =>] Boolean_EXPRESSION
+         --                 [, [Message =>] Static_String_EXPRESSION]);
 
-         when Pragma_Assert =>
-            GNAT_Pragma;
-            Check_No_Identifiers;
+         when Pragma_Assert => Assert : declare
+            Expr : Node_Id;
+
+         begin
+            Ada_2005_Pragma;
+            Check_At_Least_N_Arguments (1);
+            Check_At_Most_N_Arguments (2);
+            Check_Arg_Order ((Name_Check, Name_Message));
+            Check_Optional_Identifier (Arg1, Name_Check);
 
             if Arg_Count > 1 then
-               Check_Arg_Count (2);
+               Check_Optional_Identifier (Arg2, Name_Message);
                Check_Arg_Is_Static_Expression (Arg2, Standard_String);
             end if;
 
@@ -3710,13 +4763,15 @@ package body Sem_Prag is
             --  directly, or it may cause insertion of actions that would
             --  escape the attempt to suppress the assertion code.
 
+            Expr := Expression (Arg1);
+
             if Expander_Active and not Assertions_Enabled then
                Rewrite (N,
                  Make_If_Statement (Loc,
                    Condition =>
                      Make_And_Then (Loc,
                        Left_Opnd  => New_Occurrence_Of (Standard_False, Loc),
-                       Right_Opnd => Get_Pragma_Arg (Arg1)),
+                       Right_Opnd => Expr),
                    Then_Statements => New_List (
                      Make_Null_Statement (Loc))));
 
@@ -3727,17 +4782,49 @@ package body Sem_Prag is
             --  and resolve the expression.
 
             else
-               Analyze_And_Resolve (Expression (Arg1), Any_Boolean);
+               Analyze_And_Resolve (Expr, Any_Boolean);
             end if;
 
-         ---------------
-         -- AST_Entry --
-         ---------------
-
-         --  pragma AST_Entry (entry_IDENTIFIER);
+            --  If assertion is of the form (X'First = literal), where X is
+            --  formal parameter, then set Low_Bound_Known flag on this formal.
 
-         when Pragma_AST_Entry => AST_Entry : declare
-            Ent : Node_Id;
+            if Nkind (Expr) = N_Op_Eq then
+               declare
+                  Right : constant Node_Id := Right_Opnd (Expr);
+                  Left  : constant Node_Id := Left_Opnd  (Expr);
+               begin
+                  if Nkind (Left) = N_Attribute_Reference
+                    and then Attribute_Name (Left) = Name_First
+                    and then Is_Entity_Name (Prefix (Left))
+                    and then Is_Formal (Entity (Prefix (Left)))
+                    and then Nkind (Right) = N_Integer_Literal
+                  then
+                     Set_Low_Bound_Known (Entity (Prefix (Left)));
+                  end if;
+               end;
+            end if;
+         end Assert;
+
+         ----------------------
+         -- Assertion_Policy --
+         ----------------------
+
+         --  pragma Assertion_Policy (Check | Ignore)
+
+         when Pragma_Assertion_Policy =>
+            Ada_2005_Pragma;
+            Check_Arg_Count (1);
+            Check_Arg_Is_One_Of (Arg1, Name_Check, Name_Ignore);
+            Assertions_Enabled := Chars (Expression (Arg1)) = Name_Check;
+
+         ---------------
+         -- AST_Entry --
+         ---------------
+
+         --  pragma AST_Entry (entry_IDENTIFIER);
+
+         when Pragma_AST_Entry => AST_Entry : declare
+            Ent : Node_Id;
 
          begin
             GNAT_Pragma;
@@ -3810,7 +4897,7 @@ package body Sem_Prag is
 
             procedure Process_Async_Pragma is
             begin
-               if not Present (L) then
+               if No (L) then
                   Set_Is_Asynchronous (Nm);
                   return;
                end if;
@@ -3879,10 +4966,20 @@ package body Sem_Prag is
                Error_Pragma_Arg
                  ("pragma% cannot be applied to function", Arg1);
 
-            elsif Ekind (Nm) = E_Record_Type
-              and then Present (Corresponding_Remote_Type (Nm))
-            then
-               N := Declaration_Node (Corresponding_Remote_Type (Nm));
+            elsif Is_Remote_Access_To_Subprogram_Type (Nm) then
+
+               if Is_Record_Type (Nm) then
+                  --  A record type that is the Equivalent_Type for
+                  --  a remote access-to-subprogram type.
+
+                  N := Declaration_Node (Corresponding_Remote_Type (Nm));
+
+               else
+                  --  A non-expanded RAS type (case where distribution is
+                  --  not enabled).
+
+                  N := Declaration_Node (Nm);
+               end if;
 
                if Nkind (N) = N_Full_Type_Declaration
                  and then Nkind (Type_Definition (N)) =
@@ -3891,6 +4988,13 @@ package body Sem_Prag is
                   L := Parameter_Specifications (Type_Definition (N));
                   Process_Async_Pragma;
 
+                  if Is_Asynchronous (Nm)
+                    and then Expander_Active
+                    and then Get_PCS_Name /= Name_No_DSA
+                  then
+                     RACW_Type_Is_Asynchronous (Underlying_RACW_Type (Nm));
+                  end if;
+
                else
                   Error_Pragma_Arg
                     ("pragma% cannot reference access-to-function type",
@@ -3911,7 +5015,6 @@ package body Sem_Prag is
             else
                Error_Pragma_Arg ("inappropriate argument for pragma%", Arg1);
             end if;
-
          end Asynchronous;
 
          ------------
@@ -3941,7 +5044,6 @@ package body Sem_Prag is
             K    : Node_Kind;
 
          begin
-            GNAT_Pragma;
             Check_Ada_83_Warning;
             Check_No_Identifiers;
             Check_Arg_Count (1);
@@ -4006,9 +5108,34 @@ package body Sem_Prag is
             Check_Ada_83_Warning;
             Check_No_Identifiers;
             Check_Arg_Count (2);
-            Check_Interrupt_Or_Attach_Handler;
-            Analyze_And_Resolve (Expression (Arg2), RTE (RE_Interrupt_Id));
-            Process_Interrupt_Or_Attach_Handler;
+
+            if No_Run_Time_Mode then
+               Error_Msg_CRT ("Attach_Handler pragma", N);
+            else
+               Check_Interrupt_Or_Attach_Handler;
+
+               --  The expression that designates the attribute may
+               --  depend on a discriminant, and is therefore a per-
+               --  object expression, to be expanded in the init proc.
+               --  If expansion is enabled, perform semantic checks
+               --  on a copy only.
+
+               if Expander_Active then
+                  declare
+                     Temp : constant Node_Id :=
+                              New_Copy_Tree (Expression (Arg2));
+                  begin
+                     Set_Parent (Temp, N);
+                     Pre_Analyze_And_Resolve (Temp, RTE (RE_Interrupt_ID));
+                  end;
+
+               else
+                  Analyze (Expression (Arg2));
+                  Resolve (Expression (Arg2), RTE (RE_Interrupt_ID));
+               end if;
+
+               Process_Interrupt_Or_Attach_Handler;
+            end if;
 
          --------------------
          -- C_Pass_By_Copy --
@@ -4070,6 +5197,41 @@ 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 --
+         --------------------------
+
+         --  pragma Compile_Time_Warning
+         --    (boolean_EXPRESSION, static_string_EXPRESSION);
+
+         when Pragma_Compile_Time_Warning =>
+            Process_Compile_Time_Warning_Or_Error;
+
+         -----------------------------
+         -- Complete_Representation --
+         -----------------------------
+
+         --  pragma Complete_Representation;
+
+         when Pragma_Complete_Representation =>
+            GNAT_Pragma;
+            Check_Arg_Count (0);
+
+            if Nkind (Parent (N)) /= N_Record_Representation_Clause then
+               Error_Pragma
+                 ("pragma & must appear within record representation clause");
+            end if;
+
          ----------------------------
          -- Complex_Representation --
          ----------------------------
@@ -4132,7 +5294,7 @@ package body Sem_Prag is
 
          when Pragma_Component_Alignment => Component_AlignmentP : declare
             Args  : Args_List (1 .. 2);
-            Names : Name_List (1 .. 2) := (
+            Names : constant Name_List (1 .. 2) := (
                       Name_Form,
                       Name_Name);
 
@@ -4212,7 +5374,6 @@ package body Sem_Prag is
                   Set_Component_Alignment (Base_Type (Typ), Atype);
                end if;
             end if;
-
          end Component_AlignmentP;
 
          ----------------
@@ -4249,13 +5410,44 @@ package body Sem_Prag is
          when Pragma_Convention => Convention : declare
             C : Convention_Id;
             E : Entity_Id;
-
          begin
+            Check_Arg_Order ((Name_Convention, Name_Entity));
             Check_Ada_83_Warning;
             Check_Arg_Count (2);
             Process_Convention (C, E);
          end Convention;
 
+         ---------------------------
+         -- Convention_Identifier --
+         ---------------------------
+
+         --  pragma Convention_Identifier ([Name =>] IDENTIFIER,
+         --    [Convention =>] convention_IDENTIFIER);
+
+         when Pragma_Convention_Identifier => Convention_Identifier : declare
+            Idnam : Name_Id;
+            Cname : Name_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_Arg_Order ((Name_Name, Name_Convention));
+            Check_Arg_Count (2);
+            Check_Optional_Identifier (Arg1, Name_Name);
+            Check_Optional_Identifier (Arg2, Name_Convention);
+            Check_Arg_Is_Identifier (Arg1);
+            Check_Arg_Is_Identifier (Arg1);
+            Idnam := Chars (Expression (Arg1));
+            Cname := Chars (Expression (Arg2));
+
+            if Is_Convention_Name (Cname) then
+               Record_Convention_Identifier
+                 (Idnam, Get_Convention_Id (Cname));
+            else
+               Error_Pragma_Arg
+                 ("second arg for % pragma must be convention", Arg2);
+            end if;
+         end Convention_Identifier;
+
          ---------------
          -- CPP_Class --
          ---------------
@@ -4263,14 +5455,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);
@@ -4291,80 +5485,38 @@ 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 vtable ptr
-
-            --  What is test for Typ = Root_Typ (Typ) about here ???
-
-            elsif Is_Tagged_Type (Typ)
-              and then Typ = Root_Type (Typ)
-              and then No (Default_DTC)
-            then
-               Error_Pragma_Arg
-                 ("a cpp_class must contain a vtable pointer", Arg1);
-
-            --  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_Suppress_Tag_Checks (Typ);
-               Set_Suppress_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 := Tag_Component (Typ);
-                  C := First_Entity (Typ);
-
-                  if C = Tag_C then
-                     Set_First_Entity (Typ, Next_Entity (Tag_C));
+               Error_Pragma_Arg ("pragma% applicable to tagged types ", Arg1);
+            end if;
 
-                  else
-                     while Next_Entity (C) /= Tag_C loop
-                        Next_Entity (C);
-                     end loop;
+            --  Types treated as CPP classes are treated as limited, but we
+            --  don't require them to be declared this way. A warning is issued
+            --  to encourage the user to declare them as limited. This is not
+            --  an error, for compatibility reasons, because these types have
+            --  been supported this way for some time.
 
-                     Set_Next_Entity (C, Next_Entity (Tag_C));
-                  end if;
-               end if;
+            if not Is_Limited_Type (Typ) then
+               Error_Msg_N
+                 ("imported 'C'P'P type should be " &
+                    "explicitly declared limited?",
+                  Get_Pragma_Arg (Arg1));
+               Error_Msg_N
+                 ("\type will be considered limited",
+                  Get_Pragma_Arg (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;
@@ -4372,7 +5524,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);
 
@@ -4391,10 +5544,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;
 
@@ -4417,115 +5569,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;
-
-            if Arg_Count = 3 then
-               Check_Optional_Identifier (Arg2, "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_Position then
-                  Check_Optional_Identifier (Arg3, "entry_count");
-               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, 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;
-
-            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
-               Error_Pragma_Arg
-                 ("third argument of pragma% must be a static expression",
-                  Arg3);
-
-            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;
 
@@ -4533,144 +5582,78 @@ 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_Count (3);
-            Check_Optional_Identifier (Arg1, Name_Entity);
-            Check_Optional_Identifier (Arg2, "vtable_ptr");
-            Check_Optional_Identifier (Arg3, "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 (Tag_Component (Typ)) = No_Uint
-            then
-               Set_Is_Tag (Tag_Component (Typ), False);
-               Set_Is_Tag (DTC, True);
-               Set_DT_Entry_Count (DTC, No_Uint);
+            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;
 
-            --  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)
+         -----------
+         -- Debug --
+         -----------
 
-            Arg := Expression (Arg3);
-            Analyze_And_Resolve (Arg, Any_Integer);
+         --  pragma Debug ([boolean_EXPRESSION,] PROCEDURE_CALL_STATEMENT);
 
-            if not Is_Static_Expression (Arg) then
-               Error_Pragma_Arg
-                 ("entry count for pragma% must be a static expression", Arg3);
+         when Pragma_Debug => Debug : declare
+               Cond : Node_Id;
 
-            else
-               V := Expr_Value (Expression (Arg3));
+         begin
+            GNAT_Pragma;
 
-               if V <= 0 then
-                  Error_Pragma_Arg
-                    ("entry count for pragma% must be positive", Arg3);
-               else
-                  Set_DT_Entry_Count (DTC, V);
-               end if;
-            end if;
+            Cond :=
+              New_Occurrence_Of
+                (Boolean_Literals (Debug_Pragmas_Enabled and Expander_Active),
+                 Loc);
 
-         end CPP_Vtable;
+            if Arg_Count = 2 then
+               Cond :=
+                 Make_And_Then (Loc,
+                   Left_Opnd   => Relocate_Node (Cond),
+                   Right_Opnd  => Expression (Arg1));
+            end if;
+
+            --  Rewrite into a conditional with an appropriate condition. We
+            --  wrap the procedure call in a block so that overhead from e.g.
+            --  use of the secondary stack does not generate execution overhead
+            --  for suppressed conditions.
+
+            Rewrite (N, Make_Implicit_If_Statement (N,
+              Condition => Cond,
+                 Then_Statements => New_List (
+                   Make_Block_Statement (Loc,
+                     Handled_Statement_Sequence =>
+                       Make_Handled_Sequence_Of_Statements (Loc,
+                         Statements => New_List (
+                           Relocate_Node (Debug_Statement (N))))))));
+            Analyze (N);
+         end Debug;
 
-         -----------
-         -- Debug --
-         -----------
+         ------------------
+         -- Debug_Policy --
+         ------------------
 
-         --  pragma Debug (PROCEDURE_CALL_STATEMENT);
+         --  pragma Debug_Policy (Check | Ignore)
 
-         when Pragma_Debug => Debug : begin
+         when Pragma_Debug_Policy =>
             GNAT_Pragma;
+            Check_Arg_Count (1);
+            Check_Arg_Is_One_Of (Arg1, Name_Check, Name_Ignore);
+            Debug_Pragmas_Enabled := Chars (Expression (Arg1)) = Name_Check;
 
-            --  If assertions are enabled, and we are expanding code, then
-            --  we rewrite the pragma with its corresponding procedure call
-            --  and then analyze the call.
-
-            if Assertions_Enabled and Expander_Active then
-               Rewrite (N, Relocate_Node (Debug_Statement (N)));
-               Analyze (N);
+         ---------------------
+         -- Detect_Blocking --
+         ---------------------
 
-            --  Otherwise we work a bit to get a tree that makes sense
-            --  for ASIS purposes, namely a pragma with an analyzed
-            --  argument that looks like a procedure call.
+         --  pragma Detect_Blocking;
 
-            else
-               Expander_Mode_Save_And_Set (False);
-               Rewrite (N, Relocate_Node (Debug_Statement (N)));
-               Analyze (N);
-               Rewrite (N,
-                 Make_Pragma (Loc,
-                   Chars => Name_Debug,
-                   Pragma_Argument_Associations =>
-                     New_List (Relocate_Node (N))));
-               Expander_Mode_Restore;
-            end if;
-         end Debug;
+         when Pragma_Detect_Blocking =>
+            Ada_2005_Pragma;
+            Check_Arg_Count (0);
+            Check_Valid_Configuration_Pragma;
+            Detect_Blocking := True;
 
          -------------------
          -- Discard_Names --
@@ -4683,7 +5666,6 @@ package body Sem_Prag is
             E    : Entity_Id;
 
          begin
-            GNAT_Pragma;
             Check_Ada_83_Warning;
 
             --  Deal with configuration pragma case
@@ -4701,7 +5683,8 @@ package body Sem_Prag is
 
                   --  If there is no parameter, then from now on this pragma
                   --  applies to any enumeration, exception or tagged type
-                  --  defined in the current declarative part.
+                  --  defined in the current declarative part, and recursively
+                  --  to any nested scope.
 
                   Set_Discard_Names (Current_Scope);
                   return;
@@ -4739,30 +5722,15 @@ package body Sem_Prag is
          --  pragma Elaborate (library_unit_NAME {, library_unit_NAME});
 
          when Pragma_Elaborate => Elaborate : declare
-            Plist       : List_Id;
-            Parent_Node : Node_Id;
-            Arg         : Node_Id;
-            Citem       : Node_Id;
+            Arg   : Node_Id;
+            Citem : Node_Id;
 
          begin
             --  Pragma must be in context items list of a compilation unit
 
-            if not Is_List_Member (N) then
+            if not Is_In_Context_Clause then
                Pragma_Misplaced;
-               return;
-
-            else
-               Plist := List_Containing (N);
-               Parent_Node := Parent (Plist);
-
-               if Parent_Node = Empty
-                 or else Nkind (Parent_Node) /= N_Compilation_Unit
-                 or else Context_Items (Parent_Node) /= Plist
-               then
-                  Pragma_Misplaced;
-                  return;
-               end if;
-            end if;
+            end if;
 
             --  Must be at least one argument
 
@@ -4775,9 +5743,8 @@ package body Sem_Prag is
             --  (e.g. those added by use of Rtsfind). In Ada 95 mode, this
             --  placement rule does not apply.
 
-            if Ada_83 and then Comes_From_Source (N) then
+            if Ada_Version = Ada_83 and then Comes_From_Source (N) then
                Citem := Next (N);
-
                while Present (Citem) loop
                   if Nkind (Citem) = N_Pragma
                     or else (Nkind (Citem) = N_With_Clause
@@ -4794,20 +5761,33 @@ package body Sem_Prag is
             end if;
 
             --  Finally, the arguments must all be units mentioned in a with
-            --  clause in the same context clause. Note we already checked
-            --  (in Par.Prag) that the arguments are either identifiers or
+            --  clause in the same context clause. Note we already checked (in
+            --  Par.Prag) that the arguments are all identifiers or selected
+            --  components.
 
             Arg := Arg1;
             Outer : while Present (Arg) loop
-               Citem := First (Plist);
-
+               Citem := First (List_Containing (N));
                Inner : while Citem /= N loop
                   if Nkind (Citem) = N_With_Clause
                     and then Same_Name (Name (Citem), Expression (Arg))
                   then
                      Set_Elaborate_Present (Citem, True);
                      Set_Unit_Name (Expression (Arg), Name (Citem));
-                     Set_Suppress_Elaboration_Warnings (Entity (Name (Citem)));
+
+                     --  With the pragma present, elaboration calls on
+                     --  subprograms from the named unit need no further
+                     --  checks, as long as the pragma appears in the current
+                     --  compilation unit. If the pragma appears in some unit
+                     --  in the context, there might still be a need for an
+                     --  Elaborate_All_Desirable from the current compilation
+                     --  to the the named unit, so we keep the check enabled.
+
+                     if In_Extended_Main_Source_Unit (N) then
+                        Set_Suppress_Elaboration_Warnings
+                          (Entity (Name (Citem)));
+                     end if;
+
                      exit Inner;
                   end if;
 
@@ -4821,6 +5801,16 @@ package body Sem_Prag is
 
                Next (Arg);
             end loop Outer;
+
+            --  Give a warning if operating in static mode with -gnatwl
+            --  (elaboration warnings eanbled) switch set.
+
+            if Elab_Warnings and not Dynamic_Elaboration_Checks then
+               Error_Msg_N
+                 ("?use of pragma Elaborate may not be safe", N);
+               Error_Msg_N
+                 ("?use pragma Elaborate_All instead if possible", N);
+            end if;
          end Elaborate;
 
          -------------------
@@ -4830,31 +5820,16 @@ package body Sem_Prag is
          --  pragma Elaborate_All (library_unit_NAME {, library_unit_NAME});
 
          when Pragma_Elaborate_All => Elaborate_All : declare
-            Plist       : List_Id;
-            Parent_Node : Node_Id;
-            Arg         : Node_Id;
-            Citem       : Node_Id;
+            Arg   : Node_Id;
+            Citem : Node_Id;
 
          begin
             Check_Ada_83_Warning;
 
             --  Pragma must be in context items list of a compilation unit
 
-            if not Is_List_Member (N) then
+            if not Is_In_Context_Clause then
                Pragma_Misplaced;
-               return;
-
-            else
-               Plist := List_Containing (N);
-               Parent_Node := Parent (Plist);
-
-               if Parent_Node = Empty
-                 or else Nkind (Parent_Node) /= N_Compilation_Unit
-                 or else Context_Items (Parent_Node) /= Plist
-               then
-                  Pragma_Misplaced;
-                  return;
-               end if;
             end if;
 
             --  Must be at least one argument
@@ -4874,7 +5849,7 @@ package body Sem_Prag is
 
             Arg := Arg1;
             Outr : while Present (Arg) loop
-               Citem := First (Plist);
+               Citem := First (List_Containing (N));
 
                Innr : while Citem /= N loop
                   if Nkind (Citem) = N_With_Clause
@@ -4882,7 +5857,15 @@ package body Sem_Prag is
                   then
                      Set_Elaborate_All_Present (Citem, True);
                      Set_Unit_Name (Expression (Arg), Name (Citem));
-                     Set_Suppress_Elaboration_Warnings (Entity (Name (Citem)));
+
+                     --  Suppress warnings and elaboration checks on the named
+                     --  unit if the pragma is in the current compilation, as
+                     --  for pragma Elaborate.
+
+                     if In_Extended_Main_Source_Unit (N) then
+                        Set_Suppress_Elaboration_Warnings
+                          (Entity (Name (Citem)));
+                     end if;
                      exit Innr;
                   end if;
 
@@ -4890,6 +5873,7 @@ package body Sem_Prag is
                end loop Innr;
 
                if Citem = N then
+                  Set_Error_Posted (N);
                   Error_Pragma_Arg
                     ("argument of pragma% is not with'ed unit", Arg);
                end if;
@@ -4926,7 +5910,7 @@ package body Sem_Prag is
                Error_Pragma ("pragma% must refer to a spec, not a body");
             else
                Set_Body_Required (Cunit_Node, True);
-               Set_Has_Pragma_Elaborate_Body     (Cunit_Ent);
+               Set_Has_Pragma_Elaborate_Body (Cunit_Ent);
 
                --  If we are in dynamic elaboration mode, then we suppress
                --  elaboration warnings for the unit, since it is definitely
@@ -4972,34 +5956,77 @@ package body Sem_Prag is
          --    [,[Entity          =>]  IDENTIFIER |
          --                            SELECTED_COMPONENT |
          --                            STRING_LITERAL]
-         --    [,[Parameter_Types =>]  PARAMETER_TYPES]
-         --    [,[Result_Type     =>]  result_SUBTYPE_MARK]);
+         --    [,]OVERLOADING_RESOLUTION);
 
-         --  PARAMETER_TYPES ::=
-         --    null
-         --    (SUBTYPE_MARK, SUBTYPE_MARK, ...)
+         --  OVERLOADING_RESOLUTION ::= PARAMETER_AND_RESULT_TYPE_PROFILE |
+         --                             SOURCE_LOCATION
 
-         when Pragma_Eliminate => Eliminate : begin
+         --  PARAMETER_AND_RESULT_TYPE_PROFILE ::= PROCEDURE_PROFILE |
+         --                                        FUNCTION_PROFILE
+
+         --  PROCEDURE_PROFILE ::= Parameter_Types => PARAMETER_TYPES
+
+         --  FUNCTION_PROFILE ::= [Parameter_Types => PARAMETER_TYPES,]
+         --                       Result_Type => result_SUBTYPE_NAME]
+
+         --  PARAMETER_TYPES ::= (SUBTYPE_NAME {, SUBTYPE_NAME})
+         --  SUBTYPE_NAME    ::= STRING_LITERAL
+
+         --  SOURCE_LOCATION ::= Source_Location => SOURCE_TRACE
+         --  SOURCE_TRACE    ::= STRING_LITERAL
+
+         when Pragma_Eliminate => Eliminate : declare
+            Args  : Args_List (1 .. 5);
+            Names : constant Name_List (1 .. 5) := (
+                      Name_Unit_Name,
+                      Name_Entity,
+                      Name_Parameter_Types,
+                      Name_Result_Type,
+                      Name_Source_Location);
+
+            Unit_Name       : Node_Id renames Args (1);
+            Entity          : Node_Id renames Args (2);
+            Parameter_Types : Node_Id renames Args (3);
+            Result_Type     : Node_Id renames Args (4);
+            Source_Location : Node_Id renames Args (5);
+
+         begin
             GNAT_Pragma;
-            Check_Ada_83_Warning;
             Check_Valid_Configuration_Pragma;
-            Check_At_Least_N_Arguments (1);
-            Check_At_Most_N_Arguments (4);
+            Gather_Associations (Names, Args);
+
+            if No (Unit_Name) then
+               Error_Pragma ("missing Unit_Name argument for pragma%");
+            end if;
 
-            if Arg_Count = 3
-              and then Chars (Arg3) = Name_Result_Type
+            if No (Entity)
+              and then (Present (Parameter_Types)
+                          or else
+                        Present (Result_Type)
+                          or else
+                        Present (Source_Location))
             then
-               Arg4 := Arg3;
-               Arg3 := Empty;
+               Error_Pragma ("missing Entity argument for pragma%");
+            end if;
 
-            else
-               Check_Optional_Identifier (Arg1, "unit_name");
-               Check_Optional_Identifier (Arg2, Name_Entity);
-               Check_Optional_Identifier (Arg3, Name_Parameter_Types);
-               Check_Optional_Identifier (Arg4, Name_Result_Type);
+            if (Present (Parameter_Types)
+                       or else
+                Present (Result_Type))
+              and then
+                Present (Source_Location)
+            then
+               Error_Pragma
+                 ("parameter profile and source location cannot " &
+                  "be used together in pragma%");
             end if;
 
-            Process_Eliminate_Pragma (Arg1, Arg2, Arg3, Arg4);
+            Process_Eliminate_Pragma
+              (N,
+               Unit_Name,
+               Entity,
+               Parameter_Types,
+               Result_Type,
+               Source_Location);
          end Eliminate;
 
          ------------
@@ -5018,10 +6045,19 @@ package body Sem_Prag is
 
          begin
             Check_Ada_83_Warning;
+            Check_Arg_Order
+              ((Name_Convention,
+                Name_Entity,
+                Name_External_Name,
+                Name_Link_Name));
             Check_At_Least_N_Arguments (2);
             Check_At_Most_N_Arguments  (4);
             Process_Convention (C, Def_Id);
-            Note_Possible_Modification (Expression (Arg2));
+
+            if Ekind (Def_Id) /= E_Constant then
+               Note_Possible_Modification (Expression (Arg2));
+            end if;
+
             Process_Interface_Name (Def_Id, Arg3, Arg4);
             Set_Exported (Def_Id, Arg2);
          end Export;
@@ -5038,7 +6074,7 @@ package body Sem_Prag is
 
          when Pragma_Export_Exception => Export_Exception : declare
             Args  : Args_List (1 .. 4);
-            Names : Name_List (1 .. 4) := (
+            Names : constant Name_List (1 .. 4) := (
                       Name_Internal,
                       Name_External,
                       Name_Form,
@@ -5050,8 +6086,6 @@ package body Sem_Prag is
             Code     : Node_Id renames Args (4);
 
          begin
-            GNAT_Pragma;
-
             if Inside_A_Generic then
                Error_Pragma ("pragma% cannot be used for generic entities");
             end if;
@@ -5066,7 +6100,6 @@ package body Sem_Prag is
             if not Is_VMS_Exception (Entity (Internal)) then
                Set_Exported (Entity (Internal), Internal);
             end if;
-
          end Export_Exception;
 
          ---------------------
@@ -5077,13 +6110,39 @@ package body Sem_Prag is
          --        [Internal         =>] LOCAL_NAME,
          --     [, [External         =>] EXTERNAL_SYMBOL,]
          --     [, [Parameter_Types  =>] (PARAMETER_TYPES)]
-         --     [, [Result_Type      =>] SUBTYPE_MARK]
+         --     [, [Result_Type      =>] TYPE_DESIGNATOR]
          --     [, [Mechanism        =>] MECHANISM]
          --     [, [Result_Mechanism =>] MECHANISM_NAME]);
 
+         --  EXTERNAL_SYMBOL ::=
+         --    IDENTIFIER
+         --  | static_string_EXPRESSION
+
+         --  PARAMETER_TYPES ::=
+         --    null
+         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+         --  TYPE_DESIGNATOR ::=
+         --    subtype_NAME
+         --  | subtype_Name ' Access
+
+         --  MECHANISM ::=
+         --    MECHANISM_NAME
+         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+         --  MECHANISM_ASSOCIATION ::=
+         --    [formal_parameter_NAME =>] MECHANISM_NAME
+
+         --  MECHANISM_NAME ::=
+         --    Value
+         --  | Reference
+         --  | Descriptor [([Class =>] CLASS_NAME)]
+
+         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+
          when Pragma_Export_Function => Export_Function : declare
             Args  : Args_List (1 .. 6);
-            Names : Name_List (1 .. 6) := (
+            Names : constant Name_List (1 .. 6) := (
                       Name_Internal,
                       Name_External,
                       Name_Parameter_Types,
@@ -5119,9 +6178,35 @@ package body Sem_Prag is
          --     [, [External =>] EXTERNAL_SYMBOL]
          --     [, [Size     =>] EXTERNAL_SYMBOL]);
 
+         --  EXTERNAL_SYMBOL ::=
+         --    IDENTIFIER
+         --  | static_string_EXPRESSION
+
+         --  PARAMETER_TYPES ::=
+         --    null
+         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+         --  TYPE_DESIGNATOR ::=
+         --    subtype_NAME
+         --  | subtype_Name ' Access
+
+         --  MECHANISM ::=
+         --    MECHANISM_NAME
+         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+         --  MECHANISM_ASSOCIATION ::=
+         --    [formal_parameter_NAME =>] MECHANISM_NAME
+
+         --  MECHANISM_NAME ::=
+         --    Value
+         --  | Reference
+         --  | Descriptor [([Class =>] CLASS_NAME)]
+
+         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+
          when Pragma_Export_Object => Export_Object : declare
             Args  : Args_List (1 .. 3);
-            Names : Name_List (1 .. 3) := (
+            Names : constant Name_List (1 .. 3) := (
                       Name_Internal,
                       Name_External,
                       Name_Size);
@@ -5149,9 +6234,35 @@ package body Sem_Prag is
          --     [, [Parameter_Types  =>] (PARAMETER_TYPES)]
          --     [, [Mechanism        =>] MECHANISM]);
 
+         --  EXTERNAL_SYMBOL ::=
+         --    IDENTIFIER
+         --  | static_string_EXPRESSION
+
+         --  PARAMETER_TYPES ::=
+         --    null
+         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+         --  TYPE_DESIGNATOR ::=
+         --    subtype_NAME
+         --  | subtype_Name ' Access
+
+         --  MECHANISM ::=
+         --    MECHANISM_NAME
+         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+         --  MECHANISM_ASSOCIATION ::=
+         --    [formal_parameter_NAME =>] MECHANISM_NAME
+
+         --  MECHANISM_NAME ::=
+         --    Value
+         --  | Reference
+         --  | Descriptor [([Class =>] CLASS_NAME)]
+
+         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+
          when Pragma_Export_Procedure => Export_Procedure : declare
             Args  : Args_List (1 .. 4);
-            Names : Name_List (1 .. 4) := (
+            Names : constant Name_List (1 .. 4) := (
                       Name_Internal,
                       Name_External,
                       Name_Parameter_Types,
@@ -5172,6 +6283,25 @@ package body Sem_Prag is
               Arg_Mechanism       => Mechanism);
          end Export_Procedure;
 
+         ------------------
+         -- Export_Value --
+         ------------------
+
+         --  pragma Export_Value (
+         --     [Value     =>] static_integer_EXPRESSION,
+         --     [Link_Name =>] static_string_EXPRESSION);
+
+         when Pragma_Export_Value =>
+            GNAT_Pragma;
+            Check_Arg_Order ((Name_Value, Name_Link_Name));
+            Check_Arg_Count (2);
+
+            Check_Optional_Identifier (Arg1, Name_Value);
+            Check_Arg_Is_Static_Expression (Arg1, Any_Integer);
+
+            Check_Optional_Identifier (Arg2, Name_Link_Name);
+            Check_Arg_Is_Static_Expression (Arg2, Standard_String);
+
          -----------------------------
          -- Export_Valued_Procedure --
          -----------------------------
@@ -5182,10 +6312,36 @@ package body Sem_Prag is
          --     [, [Parameter_Types  =>] (PARAMETER_TYPES)]
          --     [, [Mechanism        =>] MECHANISM]);
 
+         --  EXTERNAL_SYMBOL ::=
+         --    IDENTIFIER
+         --  | static_string_EXPRESSION
+
+         --  PARAMETER_TYPES ::=
+         --    null
+         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+         --  TYPE_DESIGNATOR ::=
+         --    subtype_NAME
+         --  | subtype_Name ' Access
+
+         --  MECHANISM ::=
+         --    MECHANISM_NAME
+         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+         --  MECHANISM_ASSOCIATION ::=
+         --    [formal_parameter_NAME =>] MECHANISM_NAME
+
+         --  MECHANISM_NAME ::=
+         --    Value
+         --  | Reference
+         --  | Descriptor [([Class =>] CLASS_NAME)]
+
+         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+
          when Pragma_Export_Valued_Procedure =>
          Export_Valued_Procedure : declare
             Args  : Args_List (1 .. 4);
-            Names : Name_List (1 .. 4) := (
+            Names : constant Name_List (1 .. 4) := (
                       Name_Internal,
                       Name_External,
                       Name_Parameter_Types,
@@ -5237,6 +6393,10 @@ package body Sem_Prag is
 
                else
                   System_Extend_Pragma_Arg := Arg1;
+
+                  if not GNAT_Mode then
+                     System_Extend_Unit := Arg1;
+                  end if;
                end if;
             else
                Error_Pragma ("incorrect name for pragma%, must be Aux_xxx");
@@ -5254,7 +6414,12 @@ package body Sem_Prag is
             Check_Arg_Count (1);
             Check_No_Identifiers;
             Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
-            Extensions_Allowed := (Chars (Expression (Arg1)) = Name_On);
+
+            if Chars (Expression (Arg1)) = Name_On then
+               Extensions_Allowed := True;
+            else
+               Extensions_Allowed := False;
+            end if;
 
          --------------
          -- External --
@@ -5269,9 +6434,13 @@ package body Sem_Prag is
          when Pragma_External => External : declare
             C      : Convention_Id;
             Def_Id : Entity_Id;
-
          begin
             GNAT_Pragma;
+            Check_Arg_Order
+              ((Name_Convention,
+                Name_Entity,
+                Name_External_Name,
+                Name_Link_Name));
             Check_At_Least_N_Arguments (2);
             Check_At_Most_N_Arguments  (4);
             Process_Convention (C, Def_Id);
@@ -5288,9 +6457,7 @@ package body Sem_Prag is
          --    UPPERCASE | LOWERCASE
          --    [, AS_IS | UPPERCASE | LOWERCASE]);
 
-         when Pragma_External_Name_Casing =>
-
-         External_Name_Casing : declare
+         when Pragma_External_Name_Casing => External_Name_Casing : declare
          begin
             GNAT_Pragma;
             Check_No_Identifiers;
@@ -5329,7 +6496,6 @@ package body Sem_Prag is
                when others =>
                   null;
             end case;
-
          end External_Name_Casing;
 
          ---------------------------
@@ -5339,8 +6505,8 @@ package body Sem_Prag is
          --  pragma Finalize_Storage_Only (first_subtype_LOCAL_NAME);
 
          when Pragma_Finalize_Storage_Only => Finalize_Storage : declare
-            Assoc   : Node_Id := Arg1;
-            Type_Id : Node_Id := Expression (Assoc);
+            Assoc   : constant Node_Id := Arg1;
+            Type_Id : constant Node_Id := Expression (Assoc);
             Typ     : Entity_Id;
 
          begin
@@ -5369,7 +6535,7 @@ package body Sem_Prag is
                Error_Pragma ("duplicate pragma%, only one allowed");
 
             elsif not Rep_Item_Too_Late (Typ, N) then
-               Set_Finalize_Storage_Only (Typ, True);
+               Set_Finalize_Storage_Only (Base_Type (Typ), True);
             end if;
          end Finalize_Storage;
 
@@ -5377,7 +6543,9 @@ package body Sem_Prag is
          -- Float_Representation --
          --------------------------
 
-         --  pragma Float_Representation (VAX_Float | IEEE_Float);
+         --  pragma Float_Representation (FLOAT_REP[, float_type_LOCAL_NAME]);
+
+         --  FLOAT_REP ::= VAX_Float | IEEE_Float
 
          when Pragma_Float_Representation => Float_Representation : declare
             Argx : Node_Id;
@@ -5410,9 +6578,7 @@ package body Sem_Prag is
             --  One argument case
 
             if Arg_Count = 1 then
-
                if Chars (Expression (Arg1)) = Name_VAX_Float then
-
                   if Opt.Float_Format = 'I' then
                      Error_Pragma ("'I'E'E'E format previously specified");
                   end if;
@@ -5448,7 +6614,6 @@ package body Sem_Prag is
                --  Two arguments, VAX_Float case
 
                if Chars (Expression (Arg1)) = Name_VAX_Float then
-
                   case Digs is
                      when  6 => Set_F_Float (Ent);
                      when  9 => Set_D_Float (Ent);
@@ -5472,7 +6637,6 @@ package body Sem_Prag is
                   end case;
                end if;
             end if;
-
          end Float_Representation;
 
          -----------
@@ -5504,16 +6668,6 @@ package body Sem_Prag is
 
             Str := Expr_Value_S (Expression (Arg1));
 
-            --  For pragma Ident, preserve DEC compatibility by limiting
-            --  the length to 31 characters.
-
-            if Prag_Id = Pragma_Ident
-              and then String_Length (Strval (Str)) > 31
-            then
-               Error_Pragma_Arg
-                 ("argument for pragma% is too long, maximum is 31", Arg1);
-            end if;
-
             declare
                CS : Node_Id;
                GP : Node_Id;
@@ -5544,7 +6698,7 @@ package body Sem_Prag is
                      --  For Comment, we concatenate the string, unless we
                      --  want to preserve the tree structure for ASIS.
 
-                     elsif not Tree_Output then
+                     elsif not ASIS_Mode then
                         Start_String (Strval (CS));
                         Store_String_Char (' ');
                         Store_String_Chars (Strval (Str));
@@ -5605,6 +6759,11 @@ package body Sem_Prag is
 
          when Pragma_Import =>
             Check_Ada_83_Warning;
+            Check_Arg_Order
+              ((Name_Convention,
+                Name_Entity,
+                Name_External_Name,
+                Name_Link_Name));
             Check_At_Least_N_Arguments (2);
             Check_At_Most_N_Arguments  (4);
             Process_Import_Or_Interface;
@@ -5621,7 +6780,7 @@ package body Sem_Prag is
 
          when Pragma_Import_Exception => Import_Exception : declare
             Args  : Args_List (1 .. 4);
-            Names : Name_List (1 .. 4) := (
+            Names : constant Name_List (1 .. 4) := (
                       Name_Internal,
                       Name_External,
                       Name_Form,
@@ -5633,7 +6792,6 @@ package body Sem_Prag is
             Code     : Node_Id renames Args (4);
 
          begin
-            GNAT_Pragma;
             Gather_Associations (Names, Args);
 
             if Present (External) and then Present (Code) then
@@ -5650,7 +6808,6 @@ package body Sem_Prag is
             if not Is_VMS_Exception (Entity (Internal)) then
                Set_Imported (Entity (Internal));
             end if;
-
          end Import_Exception;
 
          ---------------------
@@ -5666,9 +6823,35 @@ package body Sem_Prag is
          --     [, [Result_Mechanism         =>] MECHANISM_NAME]
          --     [, [First_Optional_Parameter =>] IDENTIFIER]);
 
+         --  EXTERNAL_SYMBOL ::=
+         --    IDENTIFIER
+         --  | static_string_EXPRESSION
+
+         --  PARAMETER_TYPES ::=
+         --    null
+         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+         --  TYPE_DESIGNATOR ::=
+         --    subtype_NAME
+         --  | subtype_Name ' Access
+
+         --  MECHANISM ::=
+         --    MECHANISM_NAME
+         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+         --  MECHANISM_ASSOCIATION ::=
+         --    [formal_parameter_NAME =>] MECHANISM_NAME
+
+         --  MECHANISM_NAME ::=
+         --    Value
+         --  | Reference
+         --  | Descriptor [([Class =>] CLASS_NAME)]
+
+         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+
          when Pragma_Import_Function => Import_Function : declare
             Args  : Args_List (1 .. 7);
-            Names : Name_List (1 .. 7) := (
+            Names : constant Name_List (1 .. 7) := (
                       Name_Internal,
                       Name_External,
                       Name_Parameter_Types,
@@ -5707,9 +6890,13 @@ package body Sem_Prag is
          --     [, [External =>] EXTERNAL_SYMBOL]
          --     [, [Size     =>] EXTERNAL_SYMBOL]);
 
+         --  EXTERNAL_SYMBOL ::=
+         --    IDENTIFIER
+         --  | static_string_EXPRESSION
+
          when Pragma_Import_Object => Import_Object : declare
             Args  : Args_List (1 .. 3);
-            Names : Name_List (1 .. 3) := (
+            Names : constant Name_List (1 .. 3) := (
                       Name_Internal,
                       Name_External,
                       Name_Size);
@@ -5738,9 +6925,35 @@ package body Sem_Prag is
          --     [, [Mechanism                =>] MECHANISM]
          --     [, [First_Optional_Parameter =>] IDENTIFIER]);
 
+         --  EXTERNAL_SYMBOL ::=
+         --    IDENTIFIER
+         --  | static_string_EXPRESSION
+
+         --  PARAMETER_TYPES ::=
+         --    null
+         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+         --  TYPE_DESIGNATOR ::=
+         --    subtype_NAME
+         --  | subtype_Name ' Access
+
+         --  MECHANISM ::=
+         --    MECHANISM_NAME
+         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+         --  MECHANISM_ASSOCIATION ::=
+         --    [formal_parameter_NAME =>] MECHANISM_NAME
+
+         --  MECHANISM_NAME ::=
+         --    Value
+         --  | Reference
+         --  | Descriptor [([Class =>] CLASS_NAME)]
+
+         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+
          when Pragma_Import_Procedure => Import_Procedure : declare
             Args  : Args_List (1 .. 5);
-            Names : Name_List (1 .. 5) := (
+            Names : constant Name_List (1 .. 5) := (
                       Name_Internal,
                       Name_External,
                       Name_Parameter_Types,
@@ -5775,10 +6988,36 @@ package body Sem_Prag is
          --     [, [Mechanism                =>] MECHANISM]
          --     [, [First_Optional_Parameter =>] IDENTIFIER]);
 
+         --  EXTERNAL_SYMBOL ::=
+         --    IDENTIFIER
+         --  | static_string_EXPRESSION
+
+         --  PARAMETER_TYPES ::=
+         --    null
+         --  | TYPE_DESIGNATOR @{, TYPE_DESIGNATOR@}
+
+         --  TYPE_DESIGNATOR ::=
+         --    subtype_NAME
+         --  | subtype_Name ' Access
+
+         --  MECHANISM ::=
+         --    MECHANISM_NAME
+         --  | (MECHANISM_ASSOCIATION @{, MECHANISM_ASSOCIATION@})
+
+         --  MECHANISM_ASSOCIATION ::=
+         --    [formal_parameter_NAME =>] MECHANISM_NAME
+
+         --  MECHANISM_NAME ::=
+         --    Value
+         --  | Reference
+         --  | Descriptor [([Class =>] CLASS_NAME)]
+
+         --  CLASS_NAME ::= ubs | ubsb | uba | s | sb | a | nca
+
          when Pragma_Import_Valued_Procedure =>
          Import_Valued_Procedure : declare
             Args  : Args_List (1 .. 5);
-            Names : Name_List (1 .. 5) := (
+            Names : constant Name_List (1 .. 5) := (
                       Name_Internal,
                       Name_External,
                       Name_Parameter_Types,
@@ -5812,8 +7051,12 @@ package body Sem_Prag is
             GNAT_Pragma;
             Check_Arg_Count (0);
             Check_Valid_Configuration_Pragma;
-            Init_Or_Norm_Scalars := True;
-            Initialize_Scalars := True;
+            Check_Restriction (No_Initialize_Scalars, N);
+
+            if not Restriction_Active (No_Initialize_Scalars) then
+               Init_Or_Norm_Scalars := True;
+               Initialize_Scalars := True;
+            end if;
 
          ------------
          -- Inline --
@@ -5825,20 +7068,7 @@ package body Sem_Prag is
 
             --  Pragma is active if inlining option is active
 
-            if Inline_Active then
-               Process_Inline (True);
-
-            --  Pragma is active in a predefined file in no run time mode
-
-            elsif No_Run_Time
-              and then
-                Is_Predefined_File_Name (Unit_File_Name (Current_Sem_Unit))
-            then
-               Process_Inline (True);
-
-            else
-               Process_Inline (False);
-            end if;
+            Process_Inline (Inline_Active);
 
          -------------------
          -- Inline_Always --
@@ -5892,13 +7122,20 @@ package body Sem_Prag is
          ---------------
 
          --  pragma Interface (
-         --    convention_IDENTIFIER,
-         --    local_NAME );
+         --    [   Convention    =>] convention_IDENTIFIER,
+         --    [   Entity        =>] local_NAME
+         --    [, [External_Name =>] static_string_EXPRESSION ]
+         --    [, [Link_Name     =>] static_string_EXPRESSION ]);
 
          when Pragma_Interface =>
             GNAT_Pragma;
-            Check_Arg_Count (2);
-            Check_No_Identifiers;
+            Check_Arg_Order
+              ((Name_Convention,
+                Name_Entity,
+                Name_External_Name,
+                Name_Link_Name));
+            Check_At_Least_N_Arguments (2);
+            Check_At_Most_N_Arguments  (4);
             Process_Import_Or_Interface;
 
          --------------------
@@ -5918,6 +7155,8 @@ package body Sem_Prag is
 
          begin
             GNAT_Pragma;
+            Check_Arg_Order
+              ((Name_Entity, Name_External_Name, Name_Link_Name));
             Check_At_Least_N_Arguments (2);
             Check_At_Most_N_Arguments  (3);
             Id := Expression (Arg1);
@@ -6013,8 +7252,13 @@ package body Sem_Prag is
             Check_Ada_83_Warning;
             Check_Arg_Count (1);
             Check_No_Identifiers;
-            Check_Interrupt_Or_Attach_Handler;
-            Process_Interrupt_Or_Attach_Handler;
+
+            if No_Run_Time_Mode then
+               Error_Msg_CRT ("Interrupt_Handler pragma", N);
+            else
+               Check_Interrupt_Or_Attach_Handler;
+               Process_Interrupt_Or_Attach_Handler;
+            end if;
 
          ------------------------
          -- Interrupt_Priority --
@@ -6034,13 +7278,11 @@ package body Sem_Prag is
                Check_Arg_Count (1);
                Check_No_Identifiers;
 
-               --  Set In_Default_Expression for per-object case???
+               --  The expression must be analyzed in the special manner
+               --  described in "Handling of Default and Per-Object
+               --  Expressions" in sem.ads.
 
-               Analyze_And_Resolve (Arg, Standard_Integer);
-               if Expander_Active then
-                  Rewrite (Arg,
-                    Convert_To (RTE (RE_Interrupt_Priority), Arg));
-               end if;
+               Analyze_Per_Use_Expression (Arg, RTE (RE_Interrupt_Priority));
             end if;
 
             if Nkind (P) /= N_Task_Definition
@@ -6058,16 +7300,147 @@ package body Sem_Prag is
             end if;
          end Interrupt_Priority;
 
+         ---------------------
+         -- Interrupt_State --
+         ---------------------
+
+         --  pragma Interrupt_State (
+         --    [Name  =>] INTERRUPT_ID,
+         --    [State =>] INTERRUPT_STATE);
+
+         --  INTERRUPT_ID => IDENTIFIER | static_integer_EXPRESSION
+         --  INTERRUPT_STATE => System | Runtime | User
+
+         --  Note: if the interrupt id is given as an identifier, then
+         --  it must be one of the identifiers in Ada.Interrupts.Names.
+         --  Otherwise it is given as a static integer expression which
+         --  must be in the range of Ada.Interrupts.Interrupt_ID.
+
+         when Pragma_Interrupt_State => Interrupt_State : declare
+
+            Int_Id : constant Entity_Id := RTE (RE_Interrupt_ID);
+            --  This is the entity Ada.Interrupts.Interrupt_ID;
+
+            State_Type : Character;
+            --  Set to 's'/'r'/'u' for System/Runtime/User
+
+            IST_Num : Pos;
+            --  Index to entry in Interrupt_States table
+
+            Int_Val : Uint;
+            --  Value of interrupt
+
+            Arg1X : constant Node_Id := Get_Pragma_Arg (Arg1);
+            --  The first argument to the pragma
+
+            Int_Ent : Entity_Id;
+            --  Interrupt entity in Ada.Interrupts.Names
+
+         begin
+            GNAT_Pragma;
+            Check_Arg_Order ((Name_Name, Name_State));
+            Check_Arg_Count (2);
+
+            Check_Optional_Identifier (Arg1, Name_Name);
+            Check_Optional_Identifier (Arg2, Name_State);
+            Check_Arg_Is_Identifier (Arg2);
+
+            --  First argument is identifier
+
+            if Nkind (Arg1X) = N_Identifier then
+
+               --  Search list of names in Ada.Interrupts.Names
+
+               Int_Ent := First_Entity (RTE (RE_Names));
+               loop
+                  if No (Int_Ent) then
+                     Error_Pragma_Arg ("invalid interrupt name", Arg1);
+
+                  elsif Chars (Int_Ent) = Chars (Arg1X) then
+                     Int_Val := Expr_Value (Constant_Value (Int_Ent));
+                     exit;
+                  end if;
+
+                  Next_Entity (Int_Ent);
+               end loop;
+
+            --  First argument is not an identifier, so it must be a
+            --  static expression of type Ada.Interrupts.Interrupt_ID.
+
+            else
+               Check_Arg_Is_Static_Expression (Arg1, Any_Integer);
+               Int_Val := Expr_Value (Arg1X);
+
+               if Int_Val < Expr_Value (Type_Low_Bound (Int_Id))
+                    or else
+                  Int_Val > Expr_Value (Type_High_Bound (Int_Id))
+               then
+                  Error_Pragma_Arg
+                    ("value not in range of type " &
+                     """Ada.Interrupts.Interrupt_'I'D""", Arg1);
+               end if;
+            end if;
+
+            --  Check OK state
+
+            case Chars (Get_Pragma_Arg (Arg2)) is
+               when Name_Runtime => State_Type := 'r';
+               when Name_System  => State_Type := 's';
+               when Name_User    => State_Type := 'u';
+
+               when others =>
+                  Error_Pragma_Arg ("invalid interrupt state", Arg2);
+            end case;
+
+            --  Check if entry is already stored
+
+            IST_Num := Interrupt_States.First;
+            loop
+               --  If entry not found, add it
+
+               if IST_Num > Interrupt_States.Last then
+                  Interrupt_States.Append
+                    ((Interrupt_Number => UI_To_Int (Int_Val),
+                      Interrupt_State  => State_Type,
+                      Pragma_Loc       => Loc));
+                  exit;
+
+               --  Case of entry for the same entry
+
+               elsif Int_Val = Interrupt_States.Table (IST_Num).
+                                                           Interrupt_Number
+               then
+                  --  If state matches, done, no need to make redundant entry
+
+                  exit when
+                    State_Type = Interrupt_States.Table (IST_Num).
+                                                           Interrupt_State;
+
+                  --  Otherwise if state does not match, error
+
+                  Error_Msg_Sloc :=
+                    Interrupt_States.Table (IST_Num).Pragma_Loc;
+                  Error_Pragma_Arg
+                    ("state conflicts with that given #", Arg2);
+                  exit;
+               end if;
+
+               IST_Num := IST_Num + 1;
+            end loop;
+         end Interrupt_State;
+
          ----------------------
          -- Java_Constructor --
          ----------------------
 
          --  pragma Java_Constructor ([Entity =>] LOCAL_NAME);
 
-         when Pragma_Java_Constructor => Java_Constructor : declare
-            Id     : Entity_Id;
-            Def_Id : Entity_Id;
-            Hom_Id : Entity_Id;
+         when Pragma_CIL_Constructor | Pragma_Java_Constructor =>
+         Java_Constructor : declare
+            Id         : Entity_Id;
+            Def_Id     : Entity_Id;
+            Hom_Id     : Entity_Id;
+            Convention : Convention_Id;
 
          begin
             GNAT_Pragma;
@@ -6084,6 +7457,12 @@ package body Sem_Prag is
                return;
             end if;
 
+            case Prag_Id is
+               when Pragma_CIL_Constructor  => Convention := Convention_CIL;
+               when Pragma_Java_Constructor => Convention := Convention_Java;
+               when others                  => null;
+            end case;
+
             Hom_Id := Entity (Id);
 
             --  Loop through homonyms
@@ -6091,26 +7470,37 @@ package body Sem_Prag is
             loop
                Def_Id := Get_Base_Subprogram (Hom_Id);
 
-               --  The constructor is required to be a function returning
-               --  an access type whose designated type has convention Java.
+               --  The constructor is required to be a function returning an
+               --  access type whose designated type has convention Java/CIL.
 
                if Ekind (Def_Id) = E_Function
-                 and then Ekind (Etype (Def_Id)) in Access_Kind
                  and then
-                   (Atree.Convention
-                      (Designated_Type (Etype (Def_Id))) = Convention_Java
-                   or else
-                     Atree.Convention
-                      (Root_Type (Designated_Type (Etype (Def_Id))))
-                        = Convention_Java)
+                   (Is_Value_Type (Etype (Def_Id))
+                     or else
+                       (Ekind (Etype (Def_Id)) in Access_Kind
+                         and then
+                          (Atree.Convention
+                             (Designated_Type (Etype (Def_Id))) = Convention
+                            or else
+                              Atree.Convention
+                               (Root_Type (Designated_Type (Etype (Def_Id)))) =
+                                                                 Convention)))
                then
                   Set_Is_Constructor (Def_Id);
-                  Set_Convention     (Def_Id, Convention_Java);
+                  Set_Convention     (Def_Id, Convention);
+                  Set_Is_Imported    (Def_Id);
 
                else
-                  Error_Pragma_Arg
-                    ("pragma% requires function returning a 'Java access type",
-                      Arg1);
+                  if Convention = Convention_Java then
+                     Error_Pragma_Arg
+                       ("pragma% requires function returning a " &
+                        "'Java access type", Arg1);
+                  else
+                     pragma Assert (Convention = Convention_CIL);
+                     Error_Pragma_Arg
+                       ("pragma% requires function returning a " &
+                        "'CIL access type", Arg1);
+                  end if;
                end if;
 
                Hom_Id := Homonym (Hom_Id);
@@ -6156,7 +7546,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);
 
@@ -6172,13 +7562,45 @@ package body Sem_Prag is
             end if;
          end Java_Interface;
 
-         -------------
-         -- License --
-         -------------
+         ----------------
+         -- Keep_Names --
+         ----------------
 
-         --  pragma License (RESTRICTED | UNRESRICTED | GPL | MODIFIED_GPL);
+         --  pragma Keep_Names ([On => ] local_NAME);
 
-         when Pragma_License =>
+         when Pragma_Keep_Names => Keep_Names : declare
+            Arg : Node_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_Arg_Count (1);
+            Check_Optional_Identifier (Arg1, Name_On);
+            Check_Arg_Is_Local_Name (Arg1);
+
+            Arg := Expression (Arg1);
+            Analyze (Arg);
+
+            if Etype (Arg) = Any_Type then
+               return;
+            end if;
+
+            if not Is_Entity_Name (Arg)
+              or else Ekind (Entity (Arg)) /= E_Enumeration_Type
+            then
+               Error_Pragma_Arg
+                 ("pragma% requires a local enumeration type", Arg1);
+            end if;
+
+            Set_Discard_Names (Entity (Arg), False);
+         end Keep_Names;
+
+         -------------
+         -- License --
+         -------------
+
+         --  pragma License (RESTRICTED | UNRESTRICTED | GPL | MODIFIED_GPL);
+
+         when Pragma_License =>
             GNAT_Pragma;
             Check_Arg_Count (1);
             Check_No_Identifiers;
@@ -6233,17 +7655,17 @@ package body Sem_Prag is
                while Present (Arg) loop
                   Check_Arg_Is_Static_Expression (Arg, Standard_String);
 
-                  --  Store argument, converting sequences of spaces to
-                  --  a single null character (this is the difference in
-                  --  processing between Link_With, and Linker_Options).
+                  --  Store argument, converting sequences of spaces
+                  --  to a single null character (this is one of the
+                  --  differences in processing between Link_With
+                  --  and Linker_Options).
 
                   declare
                      C : constant Char_Code := Get_Char_Code (' ');
                      S : constant String_Id :=
                            Strval (Expr_Value_S (Expression (Arg)));
-
+                     L : constant Nat := String_Length (S);
                      F : Nat := 1;
-                     L : Nat := String_Length (S);
 
                      procedure Skip_Spaces;
                      --  Advance F past any spaces
@@ -6292,13 +7714,14 @@ package body Sem_Prag is
 
          --  pragma Linker_Alias (
          --      [Entity =>]  LOCAL_NAME
-         --      [Alias  =>]  static_string_EXPRESSION);
+         --      [Target =>]  static_string_EXPRESSION);
 
          when Pragma_Linker_Alias =>
             GNAT_Pragma;
+            Check_Arg_Order ((Name_Entity, Name_Target));
             Check_Arg_Count (2);
             Check_Optional_Identifier (Arg1, Name_Entity);
-            Check_Optional_Identifier (Arg2, "alias");
+            Check_Optional_Identifier (Arg2, Name_Target);
             Check_Arg_Is_Library_Level_Local_Name (Arg1);
             Check_Arg_Is_Static_Expression (Arg2, Standard_String);
 
@@ -6313,25 +7736,70 @@ package body Sem_Prag is
                Set_Has_Gigi_Rep_Item (Entity (Expression (Arg1)));
             end if;
 
+         ------------------------
+         -- Linker_Constructor --
+         ------------------------
+
+         --  pragma Linker_Constructor (procedure_LOCAL_NAME);
+
+         --  Code is shared with Linker_Destructor
+
+         -----------------------
+         -- Linker_Destructor --
+         -----------------------
+
+         --  pragma Linker_Destructor (procedure_LOCAL_NAME);
+
+         when Pragma_Linker_Constructor |
+              Pragma_Linker_Destructor =>
+         Linker_Constructor : declare
+            Arg1_X : Node_Id;
+            Proc   : Entity_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_Arg_Count (1);
+            Check_No_Identifiers;
+            Check_Arg_Is_Local_Name (Arg1);
+            Arg1_X := Expression (Arg1);
+            Analyze (Arg1_X);
+            Proc := Find_Unique_Parameterless_Procedure (Arg1_X, Arg1);
+
+            if not Is_Library_Level_Entity (Proc) then
+               Error_Pragma_Arg
+                ("argument for pragma% must be library level entity", Arg1);
+            end if;
+
+            --  The only processing required is to link this item on to the
+            --  list of rep items for the given entity. This is accomplished
+            --  by the call to Rep_Item_Too_Late (when no error is detected
+            --  and False is returned).
+
+            if Rep_Item_Too_Late (Proc, N) then
+               return;
+            else
+               Set_Has_Gigi_Rep_Item (Proc);
+            end if;
+         end Linker_Constructor;
+
          --------------------
          -- Linker_Options --
          --------------------
 
          --  pragma Linker_Options (string_EXPRESSION {, string_EXPRESSION});
 
-         --  Note: the use of multiple arguments is a GNAT extension
-
          when Pragma_Linker_Options => Linker_Options : declare
             Arg : Node_Id;
 
          begin
+            Check_Ada_83_Warning;
+            Check_No_Identifiers;
+            Check_Arg_Count (1);
+            Check_Is_In_Decl_Part_Or_Package_Spec;
+
             if Operating_Mode = Generate_Code
               and then In_Extended_Main_Source_Unit (N)
             then
-               Check_Ada_83_Warning;
-               Check_At_Least_N_Arguments (1);
-               Check_No_Identifiers;
-               Check_Is_In_Decl_Part_Or_Package_Spec;
                Check_Arg_Is_Static_Expression (Arg1, Standard_String);
                Start_String (Strval (Expr_Value_S (Expression (Arg1))));
 
@@ -6358,6 +7826,7 @@ package body Sem_Prag is
 
          when Pragma_Linker_Section =>
             GNAT_Pragma;
+            Check_Arg_Order ((Name_Entity, Name_Section));
             Check_Arg_Count (2);
             Check_Optional_Identifier (Arg1, Name_Entity);
             Check_Optional_Identifier (Arg2, Name_Section);
@@ -6411,9 +7880,16 @@ package body Sem_Prag is
             then
                Error_Msg_Sloc := Locking_Policy_Sloc;
                Error_Pragma ("locking policy incompatible with policy#");
+
+            --  Set new policy, but always preserve System_Location since
+            --  we like the error message with the run time name.
+
             else
                Locking_Policy := LP;
-               Locking_Policy_Sloc := Loc;
+
+               if Locking_Policy_Sloc /= System_Location then
+                  Locking_Policy_Sloc := Loc;
+               end if;
             end if;
          end;
 
@@ -6469,17 +7945,18 @@ package body Sem_Prag is
 
          begin
             GNAT_Pragma;
+            Check_Arg_Order ((Name_Entity, Name_Attribute_Name, Name_Info));
 
             if Arg_Count = 3 then
-               Check_Optional_Identifier (Arg3, "info");
+               Check_Optional_Identifier (Arg3, Name_Info);
                Check_Arg_Is_Static_Expression (Arg3, Standard_String);
             else
                Check_Arg_Count (2);
             end if;
 
-            Check_Arg_Is_Local_Name (Arg1);
-            Check_Optional_Identifier (Arg2, "attribute_name");
             Check_Optional_Identifier (Arg1, Name_Entity);
+            Check_Optional_Identifier (Arg2, Name_Attribute_Name);
+            Check_Arg_Is_Local_Name (Arg1);
             Check_Arg_Is_Static_Expression (Arg2, Standard_String);
             Def_Id := Entity (Expression (Arg1));
 
@@ -6518,7 +7995,7 @@ package body Sem_Prag is
 
          when Pragma_Main => Main : declare
             Args  : Args_List (1 .. 3);
-            Names : Name_List (1 .. 3) := (
+            Names : constant Name_List (1 .. 3) := (
                       Name_Stack_Size,
                       Name_Task_Stack_Size_Default,
                       Name_Time_Slicing_Enabled);
@@ -6565,7 +8042,7 @@ package body Sem_Prag is
 
          when Pragma_Main_Storage => Main_Storage : declare
             Args  : Args_List (1 .. 2);
-            Names : Name_List (1 .. 2) := (
+            Names : constant Name_List (1 .. 2) := (
                       Name_Working_Storage,
                       Name_Top_Guard);
 
@@ -6594,7 +8071,6 @@ package body Sem_Prag is
 
                Next (Nod);
             end loop;
-
          end Main_Storage;
 
          -----------------
@@ -6612,53 +8088,315 @@ package body Sem_Prag is
             Check_Arg_Count (1);
             Check_Arg_Is_Integer_Literal (Arg1);
 
+         -------------
+         -- No_Body --
+         -------------
+
+         --  pragma No_Body;
+
+         --  The only correct use of this pragma is on its own in a file, in
+         --  which case it is specially processed (see Gnat1drv.Check_Bad_Body
+         --  and Frontend, which use Sinput.L.Source_File_Is_Pragma_No_Body to
+         --  check for a file containing nothing but a No_Body pragma). If we
+         --  attempt to process it during normal semantics processing, it means
+         --  it was misplaced.
+
+         when Pragma_No_Body =>
+            Error_Pragma ("misplaced pragma %");
+
          ---------------
          -- No_Return --
          ---------------
 
-         --  pragma No_Return (procedure_LOCAL_NAME);
+         --  pragma No_Return (procedure_LOCAL_NAME {, procedure_Local_Name});
 
-         when Pragma_No_Return => declare
+         when Pragma_No_Return => No_Return : declare
             Id    : Node_Id;
             E     : Entity_Id;
             Found : Boolean;
+            Arg   : Node_Id;
 
          begin
             GNAT_Pragma;
-            Check_Arg_Count (1);
-            Check_No_Identifiers;
-            Check_Arg_Is_Local_Name (Arg1);
-            Id := Expression (Arg1);
-            Analyze (Id);
+            Check_At_Least_N_Arguments (1);
 
-            if not Is_Entity_Name (Id) then
-               Error_Pragma_Arg ("entity name required", Arg1);
-            end if;
+            --  Loop through arguments of pragma
 
-            if Etype (Id) = Any_Type then
-               raise Pragma_Exit;
+            Arg := Arg1;
+            while Present (Arg) loop
+               Check_Arg_Is_Local_Name (Arg);
+               Id := Expression (Arg);
+               Analyze (Id);
+
+               if not Is_Entity_Name (Id) then
+                  Error_Pragma_Arg ("entity name required", Arg);
+               end if;
+
+               if Etype (Id) = Any_Type then
+                  raise Pragma_Exit;
+               end if;
+
+               --  Loop to find matching procedures
+
+               E := Entity (Id);
+               Found := False;
+               while Present (E)
+                 and then Scope (E) = Current_Scope
+               loop
+                  if Ekind (E) = E_Procedure
+                    or else Ekind (E) = E_Generic_Procedure
+                  then
+                     Set_No_Return (E);
+                     Found := True;
+                  end if;
+
+                  E := Homonym (E);
+               end loop;
+
+               if not Found then
+                  Error_Pragma_Arg ("no procedure & found for pragma%", Arg);
+               end if;
+
+               Next (Arg);
+            end loop;
+         end No_Return;
+
+         ------------------------
+         -- No_Strict_Aliasing --
+         ------------------------
+
+         --  pragma No_Strict_Aliasing [([Entity =>] type_LOCAL_NAME)];
+
+         when Pragma_No_Strict_Aliasing => No_Strict_Alias : declare
+            E_Id : Entity_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_At_Most_N_Arguments (1);
+
+            if Arg_Count = 0 then
+               Check_Valid_Configuration_Pragma;
+               Opt.No_Strict_Aliasing := True;
+
+            else
+               Check_Optional_Identifier (Arg2, Name_Entity);
+               Check_Arg_Is_Local_Name (Arg1);
+               E_Id := Entity (Expression (Arg1));
+
+               if E_Id = Any_Type then
+                  return;
+               elsif No (E_Id) or else not Is_Access_Type (E_Id) then
+                  Error_Pragma_Arg ("pragma% requires access type", Arg1);
+               end if;
+
+               Set_No_Strict_Aliasing (Implementation_Base_Type (E_Id));
             end if;
+         end No_Strict_Alias;
+
+         -----------------
+         -- Obsolescent --
+         -----------------
 
-            E := Entity (Id);
+         --  pragma Obsolescent [(
+         --    [Entity => NAME,]
+         --    [(static_string_EXPRESSION [, Ada_05])];
 
-            Found := False;
-            while Present (E)
-              and then Scope (E) = Current_Scope
-            loop
-               if Ekind (E) = E_Procedure
-                 or else Ekind (E) = E_Generic_Procedure
+         when Pragma_Obsolescent => Obsolescent : declare
+            Ename : Node_Id;
+            Decl  : Node_Id;
+
+            procedure Set_Obsolescent (E : Entity_Id);
+            --  Given an entity Ent, mark it as obsolescent if appropriate
+
+            ---------------------
+            -- Set_Obsolescent --
+            ---------------------
+
+            procedure Set_Obsolescent (E : Entity_Id) is
+               Active : Boolean;
+               Ent    : Entity_Id;
+               S      : String_Id;
+
+            begin
+               Active := True;
+               Ent    := E;
+
+               --  Entity name was given
+
+               if Present (Ename) then
+
+                  --  If entity name matches, we are fine
+
+                  if Chars (Ename) = Chars (Ent) then
+                     null;
+
+                  --  If entity name does not match, only possibility is an
+                  --  enumeration literal from an enumeration type declaration.
+
+                  elsif Ekind (Ent) /= E_Enumeration_Type then
+                     Error_Pragma
+                       ("pragma % entity name does not match declaration");
+
+                  else
+                     Ent := First_Literal (E);
+                     loop
+                        if No (Ent) then
+                           Error_Pragma
+                             ("pragma % entity name does not match any " &
+                              "enumeration literal");
+
+                        elsif Chars (Ent) = Chars (Ename) then
+                           exit;
+
+                        else
+                           Ent := Next_Literal (Ent);
+                        end if;
+                     end loop;
+                  end if;
+               end if;
+
+               --  Ent points to entity to be marked
+
+               if Arg_Count >= 1 then
+
+                  --  Deal with static string argument
+
+                  Check_Arg_Is_Static_Expression (Arg1, Standard_String);
+                  S := Strval (Expression (Arg1));
+
+                  for J in 1 .. String_Length (S) loop
+                     if not In_Character_Range (Get_String_Char (S, J)) then
+                        Error_Pragma_Arg
+                          ("pragma% argument does not allow wide characters",
+                           Arg1);
+                     end if;
+                  end loop;
+
+                  Set_Obsolescent_Warning (Ent, Expression (Arg1));
+
+                  --  Check for Ada_05 parameter
+
+                  if Arg_Count /= 1 then
+                     Check_Arg_Count (2);
+
+                     declare
+                        Argx : constant Node_Id := Get_Pragma_Arg (Arg2);
+
+                     begin
+                        Check_Arg_Is_Identifier (Argx);
+
+                        if Chars (Argx) /= Name_Ada_05 then
+                           Error_Msg_Name_2 := Name_Ada_05;
+                           Error_Pragma_Arg
+                             ("only allowed argument for pragma% is %", Argx);
+                        end if;
+
+                        if Ada_Version_Explicit < Ada_05
+                          or else not Warn_On_Ada_2005_Compatibility
+                        then
+                           Active := False;
+                        end if;
+                     end;
+                  end if;
+               end if;
+
+               --  Set flag if pragma active
+
+               if Active then
+                  Set_Is_Obsolescent (Ent);
+               end if;
+
+               return;
+            end Set_Obsolescent;
+
+         --  Start of processing for pragma Obsolescent
+
+         begin
+            GNAT_Pragma;
+
+            Check_At_Most_N_Arguments (3);
+
+            --  See if first argument specifies an entity name
+
+            if Arg_Count >= 1
+              and then Chars (Arg1) = Name_Entity
+            then
+               Ename := Get_Pragma_Arg (Arg1);
+
+               if Nkind (Ename) /= N_Character_Literal
+                    and then
+                  Nkind (Ename) /= N_Identifier
+                    and then
+                  Nkind (Ename) /= N_Operator_Symbol
                then
-                  Set_No_Return (E);
-                  Found := True;
+                  Error_Pragma_Arg ("entity name expected for pragma%", Arg1);
                end if;
 
-               E := Homonym (E);
+               --  Eliminate first argument, so we can share processing
+
+               Arg1 := Arg2;
+               Arg2 := Arg3;
+               Arg_Count := Arg_Count - 1;
+
+            --  No Entity name argument given
+
+            else
+               Ename := Empty;
+            end if;
+
+            Check_No_Identifiers;
+
+            --  Get immediately preceding declaration
+
+            Decl := Prev (N);
+            while Present (Decl) and then Nkind (Decl) = N_Pragma loop
+               Prev (Decl);
             end loop;
 
-            if not Found then
-               Error_Pragma ("no procedures found for pragma%");
+            --  Cases where we do not follow anything other than another pragma
+
+            if No (Decl) then
+
+               --  First case: library level compilation unit declaration with
+               --  the pragma immediately following the declaration.
+
+               if Nkind (Parent (N)) = N_Compilation_Unit_Aux then
+                  Set_Obsolescent
+                    (Defining_Entity (Unit (Parent (Parent (N)))));
+                  return;
+
+               --  Case 2: library unit placement for package
+
+               else
+                  declare
+                     Ent : constant Entity_Id := Find_Lib_Unit_Name;
+                  begin
+                     if Ekind (Ent) = E_Package
+                       or else Ekind (Ent) = E_Generic_Package
+                     then
+                        Set_Obsolescent (Ent);
+                        return;
+                     end if;
+                  end;
+               end if;
+
+            --  Cases where we must follow a declaration
+
+            else
+               if Nkind (Decl) not in N_Declaration
+                 and then Nkind (Decl) not in N_Later_Decl_Item
+                 and then Nkind (Decl) not in N_Generic_Declaration
+               then
+                  Error_Pragma
+                    ("pragma% misplaced, " &
+                     "must immediately follow a declaration");
+
+               else
+                  Set_Obsolescent (Defining_Entity (Decl));
+                  return;
+               end if;
             end if;
-         end;
+         end Obsolescent;
 
          -----------------
          -- No_Run_Time --
@@ -6666,11 +8404,29 @@ package body Sem_Prag is
 
          --  pragma No_Run_Time
 
+         --  Note: this pragma is retained for backwards compatibiltiy.
+         --  See body of Rtsfind for full details on its handling.
+
          when Pragma_No_Run_Time =>
             GNAT_Pragma;
             Check_Valid_Configuration_Pragma;
             Check_Arg_Count (0);
-            Set_No_Run_Time_Mode;
+
+            No_Run_Time_Mode           := True;
+            Configurable_Run_Time_Mode := True;
+
+            declare
+               Word32 : constant Boolean := Ttypes.System_Word_Size = 32;
+            begin
+               if Word32 then
+                  Duration_32_Bits_On_Target := True;
+               end if;
+            end;
+
+            Set_Restriction (No_Finalization, N);
+            Set_Restriction (No_Exception_Handlers, N);
+            Set_Restriction (Max_Tasks, N, 0);
+            Set_Restriction (No_Tasking, N);
 
          -----------------------
          -- Normalize_Scalars --
@@ -6707,7 +8463,7 @@ package body Sem_Prag is
          --  pragma Pack (first_subtype_LOCAL_NAME);
 
          when Pragma_Pack => Pack : declare
-            Assoc   : Node_Id := Arg1;
+            Assoc   : constant Node_Id := Arg1;
             Type_Id : Node_Id;
             Typ     : Entity_Id;
 
@@ -6737,44 +8493,74 @@ package body Sem_Prag is
             if Has_Pragma_Pack (Typ) then
                Error_Pragma ("duplicate pragma%, only one allowed");
 
-            --  Array type. We set the Has_Pragma_Pack flag, and Is_Packed,
-            --  but not Has_Non_Standard_Rep, because we don't actually know
-            --  till freeze time if the array can have packed representation.
-            --  That's because in the general case we do not know enough about
-            --  the component type until it in turn is frozen, which certainly
-            --  happens before the array type is frozen, but not necessarily
-            --  till that point (i.e. right now it may be unfrozen).
+            --  Array type
 
             elsif Is_Array_Type (Typ) then
 
+               --  Pack not allowed for aliased or atomic components
+
                if Has_Aliased_Components (Base_Type (Typ)) then
                   Error_Pragma
                     ("pragma% ignored, cannot pack aliased components?");
 
-               elsif Has_Atomic_Components (Typ) then
+               elsif Has_Atomic_Components (Typ)
+                 or else Is_Atomic (Component_Type (Typ))
+               then
                   Error_Pragma
-                    ("?pragma% ignored, cannot pack atomic components");
-
-               elsif not Rep_Item_Too_Late (Typ, N) then
-                  Set_Is_Packed            (Base_Type (Typ));
-                  Set_Has_Pragma_Pack      (Base_Type (Typ));
-                  Set_Has_Non_Standard_Rep (Base_Type (Typ));
-               end if;
-
-            --  Record type. For record types, the pack is always effective
-
-            else -- Is_Record_Type (Typ)
-               if not Rep_Item_Too_Late (Typ, N) then
-                  Set_Has_Pragma_Pack      (Base_Type (Typ));
-                  Set_Is_Packed            (Base_Type (Typ));
-                  Set_Has_Non_Standard_Rep (Base_Type (Typ));
+                       ("?pragma% ignored, cannot pack atomic components");
                end if;
-            end if;
-         end Pack;
 
-         ----------
-         -- Page --
-         ----------
+               --  If we had an explicit component size given, then we do not
+               --  let Pack override this given size. We also give a warning
+               --  that Pack is being ignored unless we can tell for sure that
+               --  the Pack would not have had any effect anyway.
+
+               if Has_Component_Size_Clause (Typ) then
+                  if Known_Static_RM_Size (Component_Type (Typ))
+                    and then
+                      RM_Size (Component_Type (Typ)) = Component_Size (Typ)
+                  then
+                     null;
+                  else
+                     Error_Pragma
+                       ("?pragma% ignored, explicit component size given");
+                  end if;
+
+               --  If no prior array component size given, Pack is effective
+
+               else
+                  if not Rep_Item_Too_Late (Typ, N) then
+                     if VM_Target = No_VM then
+                        Set_Is_Packed (Base_Type (Typ));
+                     elsif not GNAT_Mode then
+                        Error_Pragma
+                          ("?pragma% ignored in this configuration");
+                     end if;
+
+                     Set_Has_Pragma_Pack      (Base_Type (Typ));
+                     Set_Has_Non_Standard_Rep (Base_Type (Typ));
+                  end if;
+               end if;
+
+            --  For record types, the pack is always effective
+
+            else pragma Assert (Is_Record_Type (Typ));
+               if not Rep_Item_Too_Late (Typ, N) then
+                  if VM_Target = No_VM then
+                     Set_Is_Packed (Base_Type (Typ));
+                  elsif not GNAT_Mode then
+                     Error_Pragma ("?pragma% ignored in this configuration");
+                  end if;
+
+                  Set_Has_Pragma_Pack      (Base_Type (Typ));
+                  Set_Has_Non_Standard_Rep (Base_Type (Typ));
+               end if;
+            end if;
+         end Pack;
+
+         ----------
+         -- Page --
+         ----------
 
          --  pragma Page;
 
@@ -6805,6 +8591,32 @@ package body Sem_Prag is
                Check_Arg_Is_One_Of (Arg1, Name_Semaphore, Name_No);
             end if;
 
+         ----------------------------------
+         -- Preelaborable_Initialization --
+         ----------------------------------
+
+         --  pragma Preelaborable_Initialization (DIRECT_NAME);
+
+         when Pragma_Preelaborable_Initialization => Preelab_Init : declare
+            Ent : Entity_Id;
+
+         begin
+            Ada_2005_Pragma;
+            Check_Arg_Count (1);
+            Check_No_Identifiers;
+            Check_Arg_Is_Identifier (Arg1);
+            Check_Arg_Is_Local_Name (Arg1);
+            Check_First_Subtype (Arg1);
+            Ent := Entity (Expression (Arg1));
+
+            if not Is_Private_Type (Ent) then
+               Error_Pragma_Arg
+                 ("pragma % can only be applied to private type", Arg1);
+            end if;
+
+            Set_Known_To_Have_Preelab_Init (Ent);
+         end Preelab_Init;
+
          -------------
          -- Polling --
          -------------
@@ -6818,6 +8630,64 @@ package body Sem_Prag is
             Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
             Polling_Required := (Chars (Expression (Arg1)) = Name_On);
 
+         --------------------
+         -- Persistent_BSS --
+         --------------------
+
+         when Pragma_Persistent_BSS => Persistent_BSS :  declare
+            Decl : Node_Id;
+            Ent  : Entity_Id;
+            Prag : Node_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_At_Most_N_Arguments (1);
+
+            --  Case of application to specific object (one argument)
+
+            if Arg_Count = 1 then
+               Check_Arg_Is_Library_Level_Local_Name (Arg1);
+
+               if not Is_Entity_Name (Expression (Arg1))
+                 or else
+                  (Ekind (Entity (Expression (Arg1))) /= E_Variable
+                    and then Ekind (Entity (Expression (Arg1))) /= E_Constant)
+               then
+                  Error_Pragma_Arg ("pragma% only applies to objects", Arg1);
+               end if;
+
+               Ent := Entity (Expression (Arg1));
+               Decl := Parent (Ent);
+
+               if Rep_Item_Too_Late (Ent, N) then
+                  return;
+               end if;
+
+               if Present (Expression (Decl)) then
+                  Error_Pragma_Arg
+                    ("object for pragma% cannot have initialization", Arg1);
+               end if;
+
+               if not Is_Potentially_Persistent_Type (Etype (Ent)) then
+                  Error_Pragma_Arg
+                    ("object type for pragma% is not potentially persistent",
+                     Arg1);
+               end if;
+
+               Prag :=
+                 Make_Linker_Section_Pragma
+                   (Ent, Sloc (N), ".persistent.bss");
+               Insert_After (N, Prag);
+               Analyze (Prag);
+
+            --  Case of use as configuration pragma with no arguments
+
+            else
+               Check_Valid_Configuration_Pragma;
+               Persistent_BSS_Mode := True;
+            end if;
+         end Persistent_BSS;
+
          ------------------
          -- Preelaborate --
          ------------------
@@ -6827,9 +8697,9 @@ package body Sem_Prag is
          --  Set the flag Is_Preelaborated of program unit name entity
 
          when Pragma_Preelaborate => Preelaborate : declare
+            Pa  : constant Node_Id   := Parent (N);
+            Pk  : constant Node_Kind := Nkind (Pa);
             Ent : Entity_Id;
-            Pa  : Node_Id   := Parent (N);
-            Pk  : Node_Kind := Nkind (Pa);
 
          begin
             Check_Ada_83_Warning;
@@ -6846,7 +8716,7 @@ package body Sem_Prag is
 
             if Present (Ent)
               and then not (Pk = N_Package_Specification
-                             and then Present (Generic_Parent (Pa)))
+                              and then Present (Generic_Parent (Pa)))
             then
                if not Debug_Flag_U then
                   Set_Is_Preelaborated (Ent);
@@ -6855,6 +8725,44 @@ package body Sem_Prag is
             end if;
          end Preelaborate;
 
+         ---------------------
+         -- Preelaborate_05 --
+         ---------------------
+
+         --  pragma Preelaborate_05 [(library_unit_NAME)];
+
+         --  This pragma is useable only in GNAT_Mode, where it is used like
+         --  pragma Preelaborate but it is only effective in Ada 2005 mode
+         --  (otherwise it is ignored). This is used to implement AI-362 which
+         --  recategorizes some run-time packages in Ada 2005 mode.
+
+         when Pragma_Preelaborate_05 => Preelaborate_05 : declare
+            Ent : Entity_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_Valid_Library_Unit_Pragma;
+
+            if not GNAT_Mode then
+               Error_Pragma ("pragma% only available in GNAT mode");
+            end if;
+
+            if Nkind (N) = N_Null_Statement then
+               return;
+            end if;
+
+            --  This is one of the few cases where we need to test the value of
+            --  Ada_Version_Explicit rather than Ada_Version (which is always
+            --  set to Ada_05 in a predefined unit), we need to know the
+            --  explicit version set to know if this pragma is active.
+
+            if Ada_Version_Explicit >= Ada_05 then
+               Ent := Find_Lib_Unit_Name;
+               Set_Is_Preelaborated (Ent);
+               Set_Suppress_Elaboration_Warnings (Ent);
+            end if;
+         end Preelaborate_05;
+
          --------------
          -- Priority --
          --------------
@@ -6869,23 +8777,20 @@ package body Sem_Prag is
             Check_No_Identifiers;
             Check_Arg_Count (1);
 
-            Arg := Expression (Arg1);
-            Analyze_And_Resolve (Arg, Standard_Integer);
-
-            if not Is_Static_Expression (Arg) then
-               Check_Restriction (Static_Priorities, Arg);
-            end if;
-
             --  Subprogram case
 
             if Nkind (P) = N_Subprogram_Body then
                Check_In_Main_Program;
 
+               Arg := Expression (Arg1);
+               Analyze_And_Resolve (Arg, Standard_Integer);
+
                --  Must be static
 
                if not Is_Static_Expression (Arg) then
-                  Error_Pragma_Arg
-                    ("main subprogram priority is not static", Arg1);
+                  Flag_Non_Static_Expr
+                    ("main subprogram priority is not static!", Arg);
+                  raise Pragma_Exit;
 
                --  If constraint error, then we already signalled an error
 
@@ -6910,7 +8815,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
 
@@ -6918,9 +8835,16 @@ package body Sem_Prag is
                     or else
                   Nkind (P) = N_Task_Definition
             then
-               if Expander_Active then
-                  Rewrite (Arg,
-                    Convert_To (RTE (RE_Any_Priority), Arg));
+               Arg := Expression (Arg1);
+
+               --  The expression must be analyzed in the special manner
+               --  described in "Handling of Default and Per-Object
+               --  Expressions" in sem.ads.
+
+               Analyze_Per_Use_Expression (Arg, Standard_Integer);
+
+               if not Is_Static_Expression (Arg) then
+                  Check_Restriction (Static_Priorities, Arg);
                end if;
 
             --  Anything else is incorrect
@@ -6942,15 +8866,199 @@ package body Sem_Prag is
                   --  exp_ch9 should use this ???
                end if;
             end if;
-
          end Priority;
 
+         -----------------------------------
+         -- Priority_Specific_Dispatching --
+         -----------------------------------
+
+         --  pragma Priority_Specific_Dispatching (
+         --    policy_IDENTIFIER,
+         --    first_priority_EXPRESSION,
+         --    last_priority_EXPRESSION);
+
+         when Pragma_Priority_Specific_Dispatching =>
+         Priority_Specific_Dispatching : declare
+            Prio_Id : constant Entity_Id := RTE (RE_Any_Priority);
+            --  This is the entity System.Any_Priority;
+
+            DP          : Character;
+            Lower_Bound : Node_Id;
+            Upper_Bound : Node_Id;
+            Lower_Val   : Uint;
+            Upper_Val   : Uint;
+
+         begin
+            Ada_2005_Pragma;
+            Check_Arg_Count (3);
+            Check_No_Identifiers;
+            Check_Arg_Is_Task_Dispatching_Policy (Arg1);
+            Check_Valid_Configuration_Pragma;
+            Get_Name_String (Chars (Expression (Arg1)));
+            DP := Fold_Upper (Name_Buffer (1));
+
+            Lower_Bound := Expression (Arg2);
+            Check_Arg_Is_Static_Expression (Lower_Bound, Standard_Integer);
+            Lower_Val := Expr_Value (Lower_Bound);
+
+            Upper_Bound := Expression (Arg3);
+            Check_Arg_Is_Static_Expression (Upper_Bound, Standard_Integer);
+            Upper_Val := Expr_Value (Upper_Bound);
+
+            --  It is not allowed to use Task_Dispatching_Policy and
+            --  Priority_Specific_Dispatching in the same partition.
+
+            if Task_Dispatching_Policy /= ' ' then
+               Error_Msg_Sloc := Task_Dispatching_Policy_Sloc;
+               Error_Pragma
+                 ("pragma% incompatible with Task_Dispatching_Policy#");
+
+            --  Check lower bound in range
+
+            elsif Lower_Val < Expr_Value (Type_Low_Bound (Prio_Id))
+                    or else
+                  Lower_Val > Expr_Value (Type_High_Bound (Prio_Id))
+            then
+               Error_Pragma_Arg
+                 ("first_priority is out of range", Arg2);
+
+            --  Check upper bound in range
+
+            elsif Upper_Val < Expr_Value (Type_Low_Bound (Prio_Id))
+                    or else
+                  Upper_Val > Expr_Value (Type_High_Bound (Prio_Id))
+            then
+               Error_Pragma_Arg
+                 ("last_priority is out of range", Arg3);
+
+            --  Check that the priority range is valid
+
+            elsif Lower_Val > Upper_Val then
+               Error_Pragma
+                 ("last_priority_expression must be greater than" &
+                  " or equal to first_priority_expression");
+
+            --  Store the new policy, but always preserve System_Location since
+            --  we like the error message with the run-time name.
+
+            else
+               --  Check overlapping in the priority ranges specified in other
+               --  Priority_Specific_Dispatching pragmas within the same
+               --  partition. We can only check those we know about!
+
+               for J in
+                  Specific_Dispatching.First .. Specific_Dispatching.Last
+               loop
+                  if Specific_Dispatching.Table (J).First_Priority in
+                    UI_To_Int (Lower_Val) .. UI_To_Int (Upper_Val)
+                  or else Specific_Dispatching.Table (J).Last_Priority in
+                    UI_To_Int (Lower_Val) .. UI_To_Int (Upper_Val)
+                  then
+                     Error_Msg_Sloc :=
+                       Specific_Dispatching.Table (J).Pragma_Loc;
+                     Error_Pragma ("priority range overlaps with" &
+                                   " Priority_Specific_Dispatching#");
+                  end if;
+               end loop;
+
+               --  The use of Priority_Specific_Dispatching is incompatible
+               --  with Task_Dispatching_Policy.
+
+               if Task_Dispatching_Policy /= ' ' then
+                  Error_Msg_Sloc := Task_Dispatching_Policy_Sloc;
+                  Error_Pragma ("Priority_Specific_Dispatching incompatible" &
+                                " with Task_Dispatching_Policy#");
+               end if;
+
+               --  The use of Priority_Specific_Dispatching forces ceiling
+               --  locking policy.
+
+               if Locking_Policy /= ' ' and then Locking_Policy /= 'C' then
+                  Error_Msg_Sloc := Locking_Policy_Sloc;
+                  Error_Pragma ("Priority_Specific_Dispatching incompatible" &
+                                " with Locking_Policy#");
+
+               --  Set the Ceiling_Locking policy, but preserve System_Location
+               --  since we like the error message with the run time name.
+
+               else
+                  Locking_Policy := 'C';
+
+                  if Locking_Policy_Sloc /= System_Location then
+                     Locking_Policy_Sloc := Loc;
+                  end if;
+               end if;
+
+               --  Add entry in the table
+
+               Specific_Dispatching.Append
+                    ((Dispatching_Policy => DP,
+                      First_Priority     => UI_To_Int (Lower_Val),
+                      Last_Priority      => UI_To_Int (Upper_Val),
+                      Pragma_Loc         => Loc));
+            end if;
+         end Priority_Specific_Dispatching;
+
+         -------------
+         -- Profile --
+         -------------
+
+         --  pragma Profile (profile_IDENTIFIER);
+
+         --  profile_IDENTIFIER => Protected | Ravenscar
+
+         when Pragma_Profile =>
+            Ada_2005_Pragma;
+            Check_Arg_Count (1);
+            Check_Valid_Configuration_Pragma;
+            Check_No_Identifiers;
+
+            declare
+               Argx : constant Node_Id := Get_Pragma_Arg (Arg1);
+            begin
+               if Chars (Argx) = Name_Ravenscar then
+                  Set_Ravenscar_Profile (N);
+               elsif Chars (Argx) = Name_Restricted then
+                  Set_Profile_Restrictions (Restricted, N, Warn => False);
+               else
+                  Error_Pragma_Arg ("& is not a valid profile", Argx);
+               end if;
+            end;
+
+         ----------------------
+         -- Profile_Warnings --
+         ----------------------
+
+         --  pragma Profile_Warnings (profile_IDENTIFIER);
+
+         --  profile_IDENTIFIER => Protected | Ravenscar
+
+         when Pragma_Profile_Warnings =>
+            GNAT_Pragma;
+            Check_Arg_Count (1);
+            Check_Valid_Configuration_Pragma;
+            Check_No_Identifiers;
+
+            declare
+               Argx : constant Node_Id := Get_Pragma_Arg (Arg1);
+            begin
+               if Chars (Argx) = Name_Ravenscar then
+                  Set_Profile_Restrictions (Ravenscar, N, Warn => True);
+               elsif Chars (Argx) = Name_Restricted then
+                  Set_Profile_Restrictions (Restricted, N, Warn => True);
+               else
+                  Error_Pragma_Arg ("& is not a valid profile", Argx);
+               end if;
+            end;
+
          --------------------------
          -- Propagate_Exceptions --
          --------------------------
 
          --  pragma Propagate_Exceptions;
 
+         --  Note: this pragma is obsolete and has no effect
+
          when Pragma_Propagate_Exceptions =>
             GNAT_Pragma;
             Check_Arg_Count (0);
@@ -6971,7 +9079,7 @@ package body Sem_Prag is
          when Pragma_Psect_Object | Pragma_Common_Object =>
          Psect_Object : declare
             Args  : Args_List (1 .. 3);
-            Names : Name_List (1 .. 3) := (
+            Names : constant Name_List (1 .. 3) := (
                       Name_Internal,
                       Name_External,
                       Name_Size);
@@ -6980,21 +9088,19 @@ package body Sem_Prag is
             External : Node_Id renames Args (2);
             Size     : Node_Id renames Args (3);
 
-            R_Internal : Node_Id;
-            R_External : Node_Id;
-
-            MA       : Node_Id;
-            Str      : String_Id;
-
-            Def_Id   : Entity_Id;
+            Def_Id : Entity_Id;
 
             procedure Check_Too_Long (Arg : Node_Id);
             --  Posts message if the argument is an identifier with more
             --  than 31 characters, or a string literal with more than
             --  31 characters, and we are operating under VMS
 
+            --------------------
+            -- Check_Too_Long --
+            --------------------
+
             procedure Check_Too_Long (Arg : Node_Id) is
-               X : Node_Id := Original_Node (Arg);
+               X : constant Node_Id := Original_Node (Arg);
 
             begin
                if Nkind (X) /= N_String_Literal
@@ -7026,9 +9132,7 @@ package body Sem_Prag is
             Gather_Associations (Names, Args);
             Process_Extended_Import_Export_Internal_Arg (Internal);
 
-            R_Internal := Relocate_Node (Internal);
-
-            Def_Id := Entity (R_Internal);
+            Def_Id := Entity (Internal);
 
             if Ekind (Def_Id) /= E_Constant
               and then Ekind (Def_Id) /= E_Variable
@@ -7037,47 +9141,49 @@ package body Sem_Prag is
                  ("pragma% must designate an object", Internal);
             end if;
 
-            Check_Too_Long (R_Internal);
+            Check_Too_Long (Internal);
 
             if Is_Imported (Def_Id) or else Is_Exported (Def_Id) then
                Error_Pragma_Arg
                  ("cannot use pragma% for imported/exported object",
-                  R_Internal);
+                  Internal);
             end if;
 
-            if Is_Concurrent_Type (Etype (R_Internal)) then
+            if Is_Concurrent_Type (Etype (Internal)) then
                Error_Pragma_Arg
                  ("cannot specify pragma % for task/protected object",
-                  R_Internal);
+                  Internal);
             end if;
 
-            if Is_Psected (Def_Id) then
-               Error_Msg_N ("?duplicate Psect_Object pragma", N);
-            else
-               Set_Is_Psected (Def_Id);
+            if Has_Rep_Pragma (Def_Id, Name_Common_Object)
+                 or else
+               Has_Rep_Pragma (Def_Id, Name_Psect_Object)
+            then
+               Error_Msg_N ("?duplicate Common/Psect_Object pragma", N);
             end if;
 
             if Ekind (Def_Id) = E_Constant then
                Error_Pragma_Arg
-                 ("cannot specify pragma % for a constant", R_Internal);
+                 ("cannot specify pragma % for a constant", Internal);
             end if;
 
-            if Is_Record_Type (Etype (R_Internal)) then
+            if Is_Record_Type (Etype (Internal)) then
                declare
                   Ent  : Entity_Id;
                   Decl : Entity_Id;
 
                begin
-                  Ent := First_Entity (Etype (R_Internal));
+                  Ent := First_Entity (Etype (Internal));
                   while Present (Ent) loop
                      Decl := Declaration_Node (Ent);
 
                      if Ekind (Ent) = E_Component
                        and then Nkind (Decl) = N_Component_Declaration
                        and then Present (Expression (Decl))
+                       and then Warn_On_Export_Import
                      then
                         Error_Msg_N
-                          ("?object for pragma % has defaults", R_Internal);
+                          ("?object for pragma % has defaults", Internal);
                         exit;
 
                      else
@@ -7091,119 +9197,14 @@ package body Sem_Prag is
                Check_Too_Long (Size);
             end if;
 
-            --  Make Psect case-insensitive.
-
             if Present (External) then
+               Check_Arg_Is_External_Name (External);
                Check_Too_Long (External);
+            end if;
 
-               if Nkind (External) = N_String_Literal then
-                  String_To_Name_Buffer (Strval (External));
-               else
-                  Get_Name_String (Chars (External));
-               end if;
-
-               Set_All_Upper_Case;
-               Start_String;
-               Store_String_Chars (Name_Buffer (1 .. Name_Len));
-               Str := End_String;
-               R_External := Make_String_Literal
-                 (Sloc => Sloc (External), Strval => Str);
-            else
-               Get_Name_String (Chars (Internal));
-               Set_All_Upper_Case;
-               Start_String;
-               Store_String_Chars (Name_Buffer (1 .. Name_Len));
-               Str := End_String;
-               R_External := Make_String_Literal
-                 (Sloc => Sloc (Internal), Strval => Str);
-            end if;
-
-            --  Transform into pragma Linker_Section, add attributes to
-            --  match what DEC Ada does. Ignore size for now?
-
-            Rewrite (N,
-               Make_Pragma
-                 (Sloc (N),
-                  Name_Linker_Section,
-                  New_List
-                    (Make_Pragma_Argument_Association
-                       (Sloc => Sloc (R_Internal),
-                        Expression => R_Internal),
-                     Make_Pragma_Argument_Association
-                       (Sloc => Sloc (R_External),
-                        Expression => R_External))));
-
-            Analyze (N);
-
-            --  Add Machine_Attribute of "overlaid", so the section overlays
-            --  other sections of the same name.
-
-            Start_String;
-            Store_String_Chars ("overlaid");
-            Str := End_String;
-
-            MA :=
-               Make_Pragma
-                 (Sloc (N),
-                  Name_Machine_Attribute,
-                  New_List
-                    (Make_Pragma_Argument_Association
-                       (Sloc => Sloc (R_Internal),
-                        Expression => R_Internal),
-                     Make_Pragma_Argument_Association
-                       (Sloc => Sloc (R_External),
-                        Expression =>
-                          Make_String_Literal
-                            (Sloc => Sloc (R_External),
-                             Strval => Str))));
-            Analyze (MA);
-
-            --  Add Machine_Attribute of "global", so the section is visible
-            --  everywhere
-
-            Start_String;
-            Store_String_Chars ("global");
-            Str := End_String;
-
-            MA :=
-               Make_Pragma
-                 (Sloc (N),
-                  Name_Machine_Attribute,
-                  New_List
-                    (Make_Pragma_Argument_Association
-                       (Sloc => Sloc (R_Internal),
-                        Expression => R_Internal),
-                     Make_Pragma_Argument_Association
-                       (Sloc => Sloc (R_External),
-                        Expression =>
-                          Make_String_Literal
-                            (Sloc => Sloc (R_External),
-                             Strval => Str))));
-            Analyze (MA);
-
-            --  Add Machine_Attribute of "initialize", so the section is
-            --  demand zeroed.
-
-            Start_String;
-            Store_String_Chars ("initialize");
-            Str := End_String;
-
-            MA :=
-               Make_Pragma
-                 (Sloc (N),
-                  Name_Machine_Attribute,
-                  New_List
-                    (Make_Pragma_Argument_Association
-                       (Sloc => Sloc (R_Internal),
-                        Expression => R_Internal),
-                     Make_Pragma_Argument_Association
-                       (Sloc => Sloc (R_External),
-                        Expression =>
-                          Make_String_Literal
-                            (Sloc => Sloc (R_External),
-                             Strval => Str))));
-            Analyze (MA);
+            --  If all error tests pass, link pragma on to the rep item chain
 
+            Record_Rep_Item (Def_Id, N);
          end Psect_Object;
 
          ----------
@@ -7214,6 +9215,7 @@ package body Sem_Prag is
 
          when Pragma_Pure => Pure : declare
             Ent : Entity_Id;
+
          begin
             Check_Ada_83_Warning;
             Check_Valid_Library_Unit_Pragma;
@@ -7224,9 +9226,50 @@ package body Sem_Prag is
 
             Ent := Find_Lib_Unit_Name;
             Set_Is_Pure (Ent);
+            Set_Has_Pragma_Pure (Ent);
             Set_Suppress_Elaboration_Warnings (Ent);
          end Pure;
 
+         -------------
+         -- Pure_05 --
+         -------------
+
+         --  pragma Pure_05 [(library_unit_NAME)];
+
+         --  This pragma is useable only in GNAT_Mode, where it is used like
+         --  pragma Pure but it is only effective in Ada 2005 mode (otherwise
+         --  it is ignored). It may be used after a pragma Preelaborate, in
+         --  which case it overrides the effect of the pragma Preelaborate.
+         --  This is used to implement AI-362 which recategorizes some run-time
+         --  packages in Ada 2005 mode.
+
+         when Pragma_Pure_05 => Pure_05 : declare
+            Ent : Entity_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_Valid_Library_Unit_Pragma;
+
+            if not GNAT_Mode then
+               Error_Pragma ("pragma% only available in GNAT mode");
+            end if;
+            if Nkind (N) = N_Null_Statement then
+               return;
+            end if;
+
+            --  This is one of the few cases where we need to test the value of
+            --  Ada_Version_Explicit rather than Ada_Version (which is always
+            --  set to Ada_05 in a predefined unit), we need to know the
+            --  explicit version set to know if this pragma is active.
+
+            if Ada_Version_Explicit >= Ada_05 then
+               Ent := Find_Lib_Unit_Name;
+               Set_Is_Preelaborated (Ent, False);
+               Set_Is_Pure (Ent);
+               Set_Suppress_Elaboration_Warnings (Ent);
+            end if;
+         end Pure_05;
+
          -------------------
          -- Pure_Function --
          -------------------
@@ -7234,9 +9277,10 @@ package body Sem_Prag is
          --  pragma Pure_Function ([Entity =>] function_LOCAL_NAME);
 
          when Pragma_Pure_Function => Pure_Function : declare
-            E_Id   : Node_Id;
-            E      : Entity_Id;
-            Def_Id : Entity_Id;
+            E_Id      : Node_Id;
+            E         : Entity_Id;
+            Def_Id    : Entity_Id;
+            Effective : Boolean := False;
 
          begin
             GNAT_Pragma;
@@ -7252,19 +9296,37 @@ package body Sem_Prag is
             --  Loop through homonyms (overloadings) of referenced entity
 
             E := Entity (E_Id);
-            while Present (E) loop
-               Def_Id := Get_Base_Subprogram (E);
 
-               if Ekind (Def_Id) /= E_Function
-                 and then Ekind (Def_Id) /= E_Generic_Function
-                 and then Ekind (Def_Id) /= E_Operator
+            if Present (E) then
+               loop
+                  Def_Id := Get_Base_Subprogram (E);
+
+                  if Ekind (Def_Id) /= E_Function
+                    and then Ekind (Def_Id) /= E_Generic_Function
+                    and then Ekind (Def_Id) /= E_Operator
+                  then
+                     Error_Pragma_Arg
+                       ("pragma% requires a function name", Arg1);
+                  end if;
+
+                  Set_Is_Pure (Def_Id);
+
+                  if not Has_Pragma_Pure_Function (Def_Id) then
+                     Set_Has_Pragma_Pure_Function (Def_Id);
+                     Effective := True;
+                  end if;
+
+                  E := Homonym (E);
+                  exit when No (E) or else Scope (E) /= Current_Scope;
+               end loop;
+
+               if not Effective
+                 and then Warn_On_Redundant_Constructs
                then
-                  Error_Pragma_Arg ("pragma% requires a function name", Arg1);
+                  Error_Msg_NE ("pragma Pure_Function on& is redundant?",
+                    N, Entity (E_Id));
                end if;
-
-               Set_Is_Pure (Def_Id);
-               E := Homonym (E);
-            end loop;
+            end if;
          end Pure_Function;
 
          --------------------
@@ -7290,9 +9352,16 @@ package body Sem_Prag is
             then
                Error_Msg_Sloc := Queuing_Policy_Sloc;
                Error_Pragma ("queuing policy incompatible with policy#");
+
+            --  Set new policy, but always preserve System_Location since
+            --  we like the error message with the run time name.
+
             else
                Queuing_Policy := QP;
-               Queuing_Policy_Sloc := Loc;
+
+               if Queuing_Policy_Sloc /= System_Location then
+                  Queuing_Policy_Sloc := Loc;
+               end if;
             end if;
          end;
 
@@ -7371,21 +9440,39 @@ package body Sem_Prag is
          -- Ravenscar --
          ---------------
 
+         --  pragma Ravenscar;
+
          when Pragma_Ravenscar =>
             GNAT_Pragma;
             Check_Arg_Count (0);
             Check_Valid_Configuration_Pragma;
-            Set_Ravenscar;
+            Set_Ravenscar_Profile (N);
+
+            if Warn_On_Obsolescent_Feature then
+               Error_Msg_N
+                 ("pragma Ravenscar is an obsolescent feature?", N);
+               Error_Msg_N
+                 ("|use pragma Profile (Ravenscar) instead", N);
+            end if;
 
          -------------------------
          -- Restricted_Run_Time --
          -------------------------
 
+         --  pragma Restricted_Run_Time;
+
          when Pragma_Restricted_Run_Time =>
             GNAT_Pragma;
             Check_Arg_Count (0);
             Check_Valid_Configuration_Pragma;
-            Set_Restricted_Profile;
+            Set_Profile_Restrictions (Restricted, N, Warn => False);
+
+            if Warn_On_Obsolescent_Feature then
+               Error_Msg_N
+                 ("pragma Restricted_Run_Time is an obsolescent feature?", N);
+               Error_Msg_N
+                 ("|use pragma Profile (Restricted) instead", N);
+            end if;
 
          ------------------
          -- Restrictions --
@@ -7397,106 +9484,21 @@ package body Sem_Prag is
          --    restriction_IDENTIFIER
          --  | restriction_parameter_IDENTIFIER => EXPRESSION
 
-         when Pragma_Restrictions => Restrictions_Pragma : declare
-            Arg   : Node_Id;
-            R_Id  : Restriction_Id;
-            RP_Id : Restriction_Parameter_Id;
-            Id    : Name_Id;
-            Expr  : Node_Id;
-            Val   : Uint;
+         when Pragma_Restrictions =>
+            Process_Restrictions_Or_Restriction_Warnings (Warn => False);
 
-         begin
-            Check_Ada_83_Warning;
-            Check_At_Least_N_Arguments (1);
-            Check_Valid_Configuration_Pragma;
-
-            Arg := Arg1;
-
-            while Present (Arg) loop
-               Id := Chars (Arg);
-               Expr := Expression (Arg);
-
-               --  Case of no restriction identifier
-
-               if Id = No_Name then
-                  if Nkind (Expr) /= N_Identifier then
-                     Error_Pragma_Arg
-                       ("invalid form for restriction", Arg);
-
-                  else
-                     R_Id := Get_Restriction_Id (Chars (Expr));
-
-                     if R_Id = Not_A_Restriction_Id then
-                        Error_Pragma_Arg
-                          ("invalid restriction identifier", Arg);
-
-                     --  Restriction is active
-
-                     else
-                        Restrictions (R_Id) := True;
-                        Restrictions_Loc (R_Id) := Sloc (N);
-
-                        --  Record the restriction if we are in the main unit,
-                        --  or in the extended main unit. The reason that we
-                        --  test separately for Main_Unit is that gnat.adc is
-                        --  processed with Current_Sem_Unit = Main_Unit, but
-                        --  nodes in gnat.adc do not appear to be the extended
-                        --  main source unit (they probably should do ???)
-
-                        if Current_Sem_Unit = Main_Unit
-                          or else In_Extended_Main_Source_Unit (N)
-                        then
-                           Main_Restrictions (R_Id) := True;
-                        end if;
-
-                        --  A very special case that must be processed here:
-                        --  pragma Restrictions (No_Exceptions) turns off all
-                        --  run-time checking. This is a bit dubious in terms
-                        --  of the formal language definition, but it is what
-                        --  is intended by the wording of RM H.4(12).
-
-                        if R_Id = No_Exceptions then
-                           Scope_Suppress := (others => True);
-                        end if;
-                     end if;
-                  end if;
-
-               --  Case of restriction identifier present
-
-               else
-                  RP_Id := Get_Restriction_Parameter_Id (Id);
-                  Analyze_And_Resolve (Expr, Any_Integer);
-
-                  if RP_Id = Not_A_Restriction_Parameter_Id then
-                     Error_Pragma_Arg
-                       ("invalid restriction parameter identifier", Arg);
-
-                  elsif not Is_OK_Static_Expression (Expr)
-                    or else not Is_Integer_Type (Etype (Expr))
-                    or else Expr_Value (Expr) < 0
-                  then
-                     Error_Pragma_Arg
-                       ("value must be non-negative static integer", Arg);
-
-                  --  Restriction pragma is active
-
-                  else
-                     Val := Expr_Value (Expr);
+         --------------------------
+         -- Restriction_Warnings --
+         --------------------------
 
-                     --  Record pragma if most restrictive so far
+         --  pragma Restriction_Warnings (RESTRICTION {, RESTRICTION});
 
-                     if Restriction_Parameters (RP_Id) = No_Uint
-                       or else Val < Restriction_Parameters (RP_Id)
-                     then
-                        Restriction_Parameters (RP_Id) := Expr_Value (Expr);
-                        Restriction_Parameters_Loc (RP_Id) := Sloc (N);
-                     end if;
-                  end if;
-               end if;
+         --  RESTRICTION ::=
+         --    restriction_IDENTIFIER
+         --  | restriction_parameter_IDENTIFIER => EXPRESSION
 
-               Next (Arg);
-            end loop;
-         end Restrictions_Pragma;
+         when Pragma_Restriction_Warnings =>
+            Process_Restrictions_Or_Restriction_Warnings (Warn => True);
 
          ----------------
          -- Reviewable --
@@ -7507,6 +9509,7 @@ package body Sem_Prag is
          when Pragma_Reviewable =>
             Check_Ada_83_Warning;
             Check_Arg_Count (0);
+            rv;
 
          -------------------
          -- Share_Generic --
@@ -7525,6 +9528,7 @@ package body Sem_Prag is
          --  pragma Shared (LOCAL_NAME);
 
          when Pragma_Shared =>
+            GNAT_Pragma;
             Process_Atomic_Shared_Volatile;
 
          --------------------
@@ -7565,9 +9569,39 @@ package body Sem_Prag is
          -- Source_File_Name --
          ----------------------
 
+         --  There are five forms for this pragma:
+
+         --  pragma Source_File_Name (
+         --    [UNIT_NAME      =>] unit_NAME,
+         --     BODY_FILE_NAME =>  STRING_LITERAL
+         --    [, [INDEX =>] INTEGER_LITERAL]);
+
+         --  pragma Source_File_Name (
+         --    [UNIT_NAME      =>] unit_NAME,
+         --     SPEC_FILE_NAME =>  STRING_LITERAL
+         --    [, [INDEX =>] INTEGER_LITERAL]);
+
+         --  pragma Source_File_Name (
+         --     BODY_FILE_NAME  => STRING_LITERAL
+         --  [, DOT_REPLACEMENT => STRING_LITERAL]
+         --  [, CASING          => CASING_SPEC]);
+
          --  pragma Source_File_Name (
-         --    [UNIT_NAME =>] unit_NAME,
-         --    [BODY_FILE_NAME | SPEC_FILE_NAME] => STRING_LITERAL);
+         --     SPEC_FILE_NAME  => STRING_LITERAL
+         --  [, DOT_REPLACEMENT => STRING_LITERAL]
+         --  [, CASING          => CASING_SPEC]);
+
+         --  pragma Source_File_Name (
+         --     SUBUNIT_FILE_NAME  => STRING_LITERAL
+         --  [, DOT_REPLACEMENT    => STRING_LITERAL]
+         --  [, CASING             => CASING_SPEC]);
+
+         --  CASING_SPEC ::= Uppercase | Lowercase | Mixedcase
+
+         --  Pragma Source_File_Name_Project (SFNP) is equivalent to pragma
+         --  Source_File_Name (SFN), however their usage is exclusive:
+         --  SFN can only be used when no project file is used, while
+         --  SFNP can only be used when a project file is used.
 
          --  No processing here. Processing was completed during parsing,
          --  since we need to have file names set as early as possible.
@@ -7580,6 +9614,39 @@ package body Sem_Prag is
             GNAT_Pragma;
             Check_Valid_Configuration_Pragma;
 
+         ------------------------------
+         -- Source_File_Name_Project --
+         ------------------------------
+
+         --  See Source_File_Name for syntax
+
+         --  No processing here. Processing was completed during parsing,
+         --  since we need to have file names set as early as possible.
+         --  Units are loaded well before semantic processing starts.
+
+         --  The only processing we defer to this point is the check
+         --  for correct placement.
+
+         when Pragma_Source_File_Name_Project =>
+            GNAT_Pragma;
+            Check_Valid_Configuration_Pragma;
+
+            --  Check that a pragma Source_File_Name_Project is used only
+            --  in a configuration pragmas file.
+
+            --  Pragmas Source_File_Name_Project should only be generated
+            --  by the Project Manager in configuration pragmas files.
+
+            --  This is really an ugly test. It seems to depend on some
+            --  accidental and undocumented property. At the very least
+            --  it needs to be documented, but it would be better to have
+            --  a clean way of testing if we are in a configuration file???
+
+            if Present (Parent (N)) then
+               Error_Pragma
+                 ("pragma% can only appear in a configuration pragmas file");
+            end if;
+
          ----------------------
          -- Source_Reference --
          ----------------------
@@ -7592,6 +9659,25 @@ package body Sem_Prag is
          when Pragma_Source_Reference =>
             GNAT_Pragma;
 
+         --------------------------------
+         -- Static_Elaboration_Desired --
+         --------------------------------
+
+         --  Syntax ???
+
+         when Pragma_Static_Elaboration_Desired =>
+
+            --  GNAT_Pragma???
+            --  Check number of arguments ???
+
+            if Is_Compilation_Unit (Current_Scope)
+              and then Ekind (Current_Scope) = E_Package
+            then
+               Set_Static_Elaboration_Desired (Current_Scope, True);
+            else
+               Error_Pragma ("pragma% must apply to a library-level package");
+            end if;
+
          ------------------
          -- Storage_Size --
          ------------------
@@ -7599,20 +9685,23 @@ package body Sem_Prag is
          --  pragma Storage_Size (EXPRESSION);
 
          when Pragma_Storage_Size => Storage_Size : declare
-            P : constant Node_Id := Parent (N);
-            X : Node_Id;
+            P   : constant Node_Id := Parent (N);
+            Arg : Node_Id;
 
          begin
             Check_No_Identifiers;
             Check_Arg_Count (1);
 
-            --  Set In_Default_Expression for per-object case???
+            --  The expression must be analyzed in the special manner
+            --  described in "Handling of Default Expressions" in sem.ads.
 
-            X := Expression (Arg1);
-            Analyze_And_Resolve (X, Any_Integer);
+            --  Set In_Default_Expression for per-object case ???
+
+            Arg := Expression (Arg1);
+            Analyze_Per_Use_Expression (Arg, Any_Integer);
 
-            if not Is_Static_Expression (X) then
-               Check_Restriction (Static_Storage_Size, X);
+            if not Is_Static_Expression (Arg) then
+               Check_Restriction (Static_Storage_Size, Arg);
             end if;
 
             if Nkind (P) /= N_Task_Definition then
@@ -7661,15 +9750,52 @@ package body Sem_Prag is
          --    [Read   =>] function_NAME,
          --    [Write  =>] function NAME);
 
-         when Pragma_Stream_Convert => Stream_Convert : begin
+         when Pragma_Stream_Convert => Stream_Convert : declare
+
+            procedure Check_OK_Stream_Convert_Function (Arg : Node_Id);
+            --  Check that the given argument is the name of a local
+            --  function of one argument that is not overloaded earlier
+            --  in the current local scope. A check is also made that the
+            --  argument is a function with one parameter.
+
+            --------------------------------------
+            -- Check_OK_Stream_Convert_Function --
+            --------------------------------------
+
+            procedure Check_OK_Stream_Convert_Function (Arg : Node_Id) is
+               Ent : Entity_Id;
+
+            begin
+               Check_Arg_Is_Local_Name (Arg);
+               Ent := Entity (Expression (Arg));
+
+               if Has_Homonym (Ent) then
+                  Error_Pragma_Arg
+                    ("argument for pragma% may not be overloaded", Arg);
+               end if;
+
+               if Ekind (Ent) /= E_Function
+                 or else No (First_Formal (Ent))
+                 or else Present (Next_Formal (First_Formal (Ent)))
+               then
+                  Error_Pragma_Arg
+                    ("argument for pragma% must be" &
+                     " function of one argument", Arg);
+               end if;
+            end Check_OK_Stream_Convert_Function;
+
+         --  Start of procecessing for Stream_Convert
+
+         begin
             GNAT_Pragma;
+            Check_Arg_Order ((Name_Entity, Name_Read, Name_Write));
             Check_Arg_Count (3);
             Check_Optional_Identifier (Arg1, Name_Entity);
             Check_Optional_Identifier (Arg2, Name_Read);
             Check_Optional_Identifier (Arg3, Name_Write);
             Check_Arg_Is_Local_Name (Arg1);
-            Check_Non_Overloaded_Function (Arg2);
-            Check_Non_Overloaded_Function (Arg3);
+            Check_OK_Stream_Convert_Function (Arg2);
+            Check_OK_Stream_Convert_Function (Arg3);
 
             declare
                Typ   : constant Entity_Id :=
@@ -7777,7 +9903,7 @@ package body Sem_Prag is
                   S   := Strval (A);
 
                   declare
-                     Slen    : Natural := Natural (String_Length (S));
+                     Slen    : constant Natural := Natural (String_Length (S));
                      Options : String (1 .. Slen);
                      J       : Natural;
 
@@ -7788,17 +9914,20 @@ package body Sem_Prag is
                         exit when not In_Character_Range (C);
                         Options (J) := Get_Character (C);
 
+                        --  If at end of string, set options. As per discussion
+                        --  above, no need to check for errors, since we issued
+                        --  them in the parser.
+
                         if J = Slen then
                            Set_Style_Check_Options (Options);
                            exit;
-                        else
-                           J := J + 1;
                         end if;
+
+                        J := J + 1;
                      end loop;
                   end;
 
                elsif Nkind (A) = N_Identifier then
-
                   if Chars (A) = Name_All_Checks then
                      Set_Default_Style_Check_Options;
 
@@ -7807,7 +9936,6 @@ package body Sem_Prag is
 
                   elsif Chars (A) = Name_Off then
                      Style_Check := False;
-
                   end if;
                end if;
             end if;
@@ -7867,10 +9995,22 @@ package body Sem_Prag is
          when Pragma_Suppress_Debug_Info =>
             GNAT_Pragma;
             Check_Arg_Count (1);
-            Check_Arg_Is_Local_Name (Arg1);
             Check_Optional_Identifier (Arg1, Name_Entity);
+            Check_Arg_Is_Local_Name (Arg1);
             Set_Debug_Info_Off (Entity (Get_Pragma_Arg (Arg1)));
 
+         ----------------------------------
+         -- Suppress_Exception_Locations --
+         ----------------------------------
+
+         --  pragma Suppress_Exception_Locations;
+
+         when Pragma_Suppress_Exception_Locations =>
+            GNAT_Pragma;
+            Check_Arg_Count (0);
+            Check_Valid_Configuration_Pragma;
+            Exception_Locations_Suppressed := True;
+
          -----------------------------
          -- Suppress_Initialization --
          -----------------------------
@@ -7952,9 +10092,16 @@ package body Sem_Prag is
                Error_Msg_Sloc := Task_Dispatching_Policy_Sloc;
                Error_Pragma
                  ("task dispatching policy incompatible with policy#");
+
+            --  Set new policy, but always preserve System_Location since
+            --  we like the error message with the run time name.
+
             else
                Task_Dispatching_Policy := DP;
-               Task_Dispatching_Policy_Sloc := Loc;
+
+               if Task_Dispatching_Policy_Sloc /= System_Location then
+                  Task_Dispatching_Policy_Sloc := Loc;
+               end if;
             end if;
          end;
 
@@ -7988,7 +10135,6 @@ package body Sem_Prag is
             else
                Set_Has_Task_Info_Pragma (P, True);
             end if;
-
          end Task_Info;
 
          ---------------
@@ -8020,7 +10166,6 @@ package body Sem_Prag is
                Set_Has_Task_Name_Pragma (P, True);
                Record_Rep_Item (Defining_Identifier (Parent (P)), N);
             end if;
-
          end Task_Name;
 
          ------------------
@@ -8033,7 +10178,7 @@ package body Sem_Prag is
 
          when Pragma_Task_Storage => Task_Storage : declare
             Args  : Args_List (1 .. 2);
-            Names : Name_List (1 .. 2) := (
+            Names : constant Name_List (1 .. 2) := (
                       Name_Task_Type,
                       Name_Top_Guard);
 
@@ -8045,6 +10190,12 @@ package body Sem_Prag is
          begin
             GNAT_Pragma;
             Gather_Associations (Names, Args);
+
+            if No (Task_Type) then
+               Error_Pragma
+                 ("missing task_type argument for pragma%");
+            end if;
+
             Check_Arg_Is_Local_Name (Task_Type);
 
             Ent := Entity (Task_Type);
@@ -8066,7 +10217,6 @@ package body Sem_Prag is
             if Rep_Item_Too_Late (Ent, N) then
                raise Pragma_Exit;
             end if;
-
          end Task_Storage;
 
          ----------------
@@ -8131,7 +10281,7 @@ package body Sem_Prag is
 
          when Pragma_Title => Title : declare
             Args  : Args_List (1 .. 2);
-            Names : Name_List (1 .. 2) := (
+            Names : constant Name_List (1 .. 2) := (
                       Name_Title,
                       Name_Subtitle);
 
@@ -8153,8 +10303,8 @@ package body Sem_Prag is
          --  pragma Unchecked_Union (first_subtype_LOCAL_NAME)
 
          when Pragma_Unchecked_Union => Unchecked_Union : declare
-            Assoc   : Node_Id := Arg1;
-            Type_Id : Node_Id := Expression (Assoc);
+            Assoc   : constant Node_Id := Arg1;
+            Type_Id : constant Node_Id := Expression (Assoc);
             Typ     : Entity_Id;
             Discr   : Entity_Id;
             Tdef    : Node_Id;
@@ -8201,6 +10351,7 @@ package body Sem_Prag is
             elsif Is_Limited_Type (Typ) then
                Error_Msg_N
                  ("Unchecked_Union must not be limited record type", Typ);
+               Explain_Limited_Type (Typ, Typ);
                return;
 
             else
@@ -8212,94 +10363,47 @@ package body Sem_Prag is
 
                Discr := First_Discriminant (Typ);
 
-               if Present (Next_Discriminant (Discr)) then
-                  Error_Msg_N
-                    ("Unchecked_Union must have exactly one discriminant",
-                     Next_Discriminant (Discr));
-                  return;
-               end if;
-
-               if No (Discriminant_Default_Value (Discr)) then
-                  Error_Msg_N
-                    ("Unchecked_Union discriminant must have default value",
-                     Discr);
-               end if;
-
-               Tdef  := Type_Definition (Declaration_Node (Typ));
-               Clist := Component_List (Tdef);
-
-               if No (Clist) or else No (Variant_Part (Clist)) then
-                  Error_Msg_N
-                    ("Unchecked_Union must have variant part",
-                     Tdef);
-                  return;
-               end if;
-
-               Vpart := Variant_Part (Clist);
-
-               if Is_Non_Empty_List (Component_Items (Clist)) then
-                  Error_Msg_N
-                    ("components before variant not allowed " &
-                     "in Unchecked_Union",
-                     First (Component_Items (Clist)));
-               end if;
-
-               Variant := First (Variants (Vpart));
-               while Present (Variant) loop
-                  Clist := Component_List (Variant);
-
-                  if Present (Variant_Part (Clist)) then
-                     Error_Msg_N
-                       ("Unchecked_Union may not have nested variants",
-                        Variant_Part (Clist));
-                  end if;
-
-                  if not Is_Non_Empty_List (Component_Items (Clist)) then
+               while Present (Discr) loop
+                  if No (Discriminant_Default_Value (Discr)) then
                      Error_Msg_N
-                       ("Unchecked_Union may not have empty component list",
-                        Variant);
-                     return;
+                       ("Unchecked_Union discriminant must have default value",
+                        Discr);
                   end if;
+                  Next_Discriminant (Discr);
+               end loop;
 
-                  Comp := First (Component_Items (Clist));
+               Tdef  := Type_Definition (Declaration_Node (Typ));
+               Clist := Component_List (Tdef);
 
-                  if Nkind (Comp) = N_Component_Declaration then
+               Comp := First (Component_Items (Clist));
+               while Present (Comp) loop
 
-                     if Present (Expression (Comp)) then
-                        Error_Msg_N
-                          ("default initialization not allowed " &
-                           "in Unchecked_Union",
-                           Expression (Comp));
-                     end if;
+                  Check_Component (Comp);
+                  Next (Comp);
 
-                     declare
-                        Sindic : constant Node_Id :=
-                                   Subtype_Indication (Comp);
+               end loop;
 
-                     begin
-                        if Nkind (Sindic) = N_Subtype_Indication then
-                           Check_Static_Constraint (Constraint (Sindic));
-                        end if;
-                     end;
-                  end if;
+               if No (Clist) or else No (Variant_Part (Clist)) then
+                  Error_Msg_N
+                    ("Unchecked_Union must have variant part",
+                     Tdef);
+                  return;
+               end if;
 
-                  if Present (Next (Comp)) then
-                     Error_Msg_N
-                       ("Unchecked_Union variant can have only one component",
-                        Next (Comp));
-                  end if;
+               Vpart := Variant_Part (Clist);
 
+               Variant := First (Variants (Vpart));
+               while Present (Variant) loop
+                  Check_Variant (Variant);
                   Next (Variant);
                end loop;
             end if;
 
-            Set_Is_Unchecked_Union           (Typ, True);
-            Set_Suppress_Discriminant_Checks (Typ, True);
-            Set_Convention                   (Typ, Convention_C);
+            Set_Is_Unchecked_Union  (Typ, True);
+            Set_Convention          (Typ, Convention_C);
 
             Set_Has_Unchecked_Union (Base_Type (Typ), True);
             Set_Is_Unchecked_Union  (Base_Type (Typ), True);
-
          end Unchecked_Union;
 
          ------------------------
@@ -8313,8 +10417,10 @@ package body Sem_Prag is
          --  appears in the body, not in the spec).
 
          when Pragma_Unimplemented_Unit => Unimplemented_Unit : declare
-            Cunitent : Entity_Id := Cunit_Entity (Get_Source_Unit (Loc));
-            Ent_Kind : Entity_Kind := Ekind (Cunitent);
+            Cunitent : constant Entity_Id :=
+                         Cunit_Entity (Get_Source_Unit (Loc));
+            Ent_Kind : constant Entity_Kind :=
+                         Ekind (Cunitent);
 
          begin
             GNAT_Pragma;
@@ -8328,12 +10434,186 @@ 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;
          end Unimplemented_Unit;
 
+         ------------------------
+         -- Universal_Aliasing --
+         ------------------------
+
+         --  pragma Universal_Aliasing [([Entity =>] type_LOCAL_NAME)];
+
+         when Pragma_Universal_Aliasing => Universal_Alias : declare
+            E_Id : Entity_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_Arg_Count (1);
+            Check_Optional_Identifier (Arg2, Name_Entity);
+            Check_Arg_Is_Local_Name (Arg1);
+            E_Id := Entity (Expression (Arg1));
+
+            if E_Id = Any_Type then
+               return;
+            elsif No (E_Id) or else not Is_Type (E_Id) then
+               Error_Pragma_Arg ("pragma% requires type", Arg1);
+            end if;
+
+            Set_Universal_Aliasing (Implementation_Base_Type (E_Id));
+         end Universal_Alias;
+
+         --------------------
+         -- Universal_Data --
+         --------------------
+
+         --  pragma Universal_Data [(library_unit_NAME)];
+
+         when Pragma_Universal_Data =>
+            GNAT_Pragma;
+
+            --  If this is a configuration pragma, then set the universal
+            --  addressing option, otherwise confirm that the pragma
+            --  satisfies the requirements of library unit pragma placement
+            --  and leave it to the GNAAMP back end to detect the pragma
+            --  (avoids transitive setting of the option due to withed units).
+
+            if Is_Configuration_Pragma then
+               Universal_Addressing_On_AAMP := True;
+            else
+               Check_Valid_Library_Unit_Pragma;
+            end if;
+
+            if not AAMP_On_Target then
+               Error_Pragma ("?pragma% ignored (applies only to AAMP)");
+            end if;
+
+         ------------------
+         -- Unreferenced --
+         ------------------
+
+         --  pragma Unreferenced (local_Name {, local_Name});
+
+         --    or when used in a context clause:
+
+         --  pragma Unreferenced (library_unit_NAME {, library_unit_NAME}
+
+         when Pragma_Unreferenced => Unreferenced : declare
+            Arg_Node : Node_Id;
+            Arg_Expr : Node_Id;
+            Arg_Ent  : Entity_Id;
+            Citem    : Node_Id;
+
+         begin
+            GNAT_Pragma;
+            Check_At_Least_N_Arguments (1);
+
+            --  Check case of appearing within context clause
+
+            if Is_In_Context_Clause then
+
+               --  The arguments must all be units mentioned in a with
+               --  clause in the same context clause. Note we already checked
+               --  (in Par.Prag) that the arguments are either identifiers or
+
+               Arg_Node := Arg1;
+               while Present (Arg_Node) loop
+                  Citem := First (List_Containing (N));
+                  while Citem /= N loop
+                     if Nkind (Citem) = N_With_Clause
+                       and then Same_Name (Name (Citem), Expression (Arg_Node))
+                     then
+                        Set_Has_Pragma_Unreferenced
+                          (Cunit_Entity
+                             (Get_Source_Unit
+                                (Library_Unit (Citem))));
+                        Set_Unit_Name (Expression (Arg_Node), Name (Citem));
+                        exit;
+                     end if;
+
+                     Next (Citem);
+                  end loop;
+
+                  if Citem = N then
+                     Error_Pragma_Arg
+                       ("argument of pragma% is not with'ed unit", Arg_Node);
+                  end if;
+
+                  Next (Arg_Node);
+               end loop;
+
+            --  Case of not in list of context items
+
+            else
+               Arg_Node := Arg1;
+               while Present (Arg_Node) loop
+                  Check_No_Identifier (Arg_Node);
+
+                  --  Note: the analyze call done by Check_Arg_Is_Local_Name
+                  --  will in fact generate reference, so that the entity will
+                  --  have a reference, which will inhibit any warnings about
+                  --  it not being referenced, and also properly show up in the
+                  --  ali file as a reference. But this reference is recorded
+                  --  before the Has_Pragma_Unreferenced flag is set, so that
+                  --  no warning is generated for this reference.
+
+                  Check_Arg_Is_Local_Name (Arg_Node);
+                  Arg_Expr := Get_Pragma_Arg (Arg_Node);
+
+                  if Is_Entity_Name (Arg_Expr) then
+                     Arg_Ent := Entity (Arg_Expr);
+
+                     --  If the entity is overloaded, the pragma applies to the
+                     --  most recent overloading, as documented. In this case,
+                     --  name resolution does not generate a reference, so it
+                     --  must be done here explicitly.
+
+                     if Is_Overloaded (Arg_Expr) then
+                        Generate_Reference (Arg_Ent, N);
+                     end if;
+
+                     Set_Has_Pragma_Unreferenced (Arg_Ent);
+                  end if;
+
+                  Next (Arg_Node);
+               end loop;
+            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 --
          ------------------------------
@@ -8384,14 +10664,13 @@ package body Sem_Prag is
          begin
             GNAT_Pragma;
             Check_Arg_Count (1);
-            Check_Valid_Configuration_Pragma;
             Check_No_Identifiers;
 
             if Nkind (A) = N_String_Literal then
                S   := Strval (A);
 
                declare
-                  Slen    : Natural := Natural (String_Length (S));
+                  Slen    : constant Natural := Natural (String_Length (S));
                   Options : String (1 .. Slen);
                   J       : Natural;
 
@@ -8447,61 +10726,198 @@ package body Sem_Prag is
          -- Warnings --
          --------------
 
-         --  pragma Warnings (On | Off, [LOCAL_NAME])
+         --  pragma Warnings (On | Off);
+         --  pragma Warnings (On | Off, LOCAL_NAME);
+         --  pragma Warnings (static_string_EXPRESSION);
+         --  pragma Warnings (On | Off, STRING_LITERAL);
 
-         when Pragma_Warnings =>
+         when Pragma_Warnings => Warnings : begin
             GNAT_Pragma;
             Check_At_Least_N_Arguments (1);
-            Check_At_Most_N_Arguments (2);
             Check_No_Identifiers;
 
-            --  One argument case was processed by parser in Par.Prag
+            declare
+               Argx : constant Node_Id := Get_Pragma_Arg (Arg1);
 
-            if Arg_Count /= 1 then
-               Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
-               Check_Arg_Count (2);
+            begin
+               --  One argument case
 
-               declare
-                  E_Id : Node_Id;
-                  E    : Entity_Id;
+               if Arg_Count = 1 then
 
-               begin
-                  E_Id := Expression (Arg2);
-                  Analyze (E_Id);
+                  --  On/Off one argument case was processed by parser
 
-                  if not Is_Entity_Name (E_Id) then
+                  if Nkind (Argx) = N_Identifier
+                    and then
+                      (Chars (Argx) = Name_On
+                         or else
+                       Chars (Argx) = Name_Off)
+                  then
+                     null;
+
+                  --  One argument case must be ON/OFF or static string expr
+
+                  elsif not Is_Static_String_Expression (Arg1) then
                      Error_Pragma_Arg
-                       ("second argument of pragma% must be entity name",
-                        Arg2);
-                  end if;
+                       ("argument of pragma% must be On/Off or " &
+                        "static string expression", Arg2);
 
-                  E := Entity (E_Id);
+                  --  One argument string expression case
 
-                  if E = Any_Id then
-                     return;
                   else
-                     loop
-                        Set_Warnings_Off (E,
-                          (Chars (Expression (Arg1)) = Name_Off));
+                     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;
 
-                        if Is_Enumeration_Type (E) then
-                           declare
-                              Lit : Entity_Id := First_Literal (E);
+                     begin
+                        J := 1;
+                        while J <= Len loop
+                           C := Get_String_Char (Str, J);
+                           OK := In_Character_Range (C);
 
-                           begin
-                              while Present (Lit) loop
-                                 Set_Warnings_Off (Lit);
-                                 Next_Literal (Lit);
-                              end loop;
-                           end;
-                        end if;
+                           if OK then
+                              Chr := Get_Character (C);
 
-                        exit when No (Homonym (E));
-                        E := Homonym (E);
-                     end loop;
+                              --  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 " & Chr,
+                                 Arg1);
+                           end if;
+
+                           J := J + 1;
+                        end loop;
+                     end;
                   end if;
-               end;
-            end if;
+
+                  --  Two or more arguments (must be two)
+
+               else
+                  Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
+                  Check_At_Most_N_Arguments (2);
+
+                  declare
+                     E_Id : Node_Id;
+                     E    : Entity_Id;
+                     Err  : Boolean;
+
+                  begin
+                     E_Id := Expression (Arg2);
+                     Analyze (E_Id);
+
+                     --  In the expansion of an inlined body, a reference to
+                     --  the formal may be wrapped in a conversion if the
+                     --  actual is a conversion. Retrieve the real entity name.
+
+                     if (In_Instance_Body
+                         or else In_Inlined_Body)
+                       and then Nkind (E_Id) = N_Unchecked_Type_Conversion
+                     then
+                        E_Id := Expression (E_Id);
+                     end if;
+
+                     --  Entity name case
+
+                     if Is_Entity_Name (E_Id) then
+                        E := Entity (E_Id);
+
+                        if E = Any_Id then
+                           return;
+                        else
+                           loop
+                              Set_Warnings_Off
+                                (E, (Chars (Expression (Arg1)) = Name_Off));
+
+                              if Is_Enumeration_Type (E) then
+                                 declare
+                                    Lit : Entity_Id;
+                                 begin
+                                    Lit := First_Literal (E);
+                                    while Present (Lit) loop
+                                       Set_Warnings_Off (Lit);
+                                       Next_Literal (Lit);
+                                    end loop;
+                                 end;
+                              end if;
+
+                              exit when No (Homonym (E));
+                              E := Homonym (E);
+                           end loop;
+                        end if;
+
+                     --  Error if not entity or static string literal case
+
+                     elsif not Is_Static_String_Expression (Arg2) then
+                        Error_Pragma_Arg
+                          ("second argument of pragma% must be entity " &
+                           "name or static string expression", Arg2);
+
+                     --  String literal case
+
+                     else
+                        String_To_Name_Buffer
+                          (Strval (Expr_Value_S (Expression (Arg2))));
+
+                        --  Configuration pragma case
+
+                        if Is_Configuration_Pragma then
+                           if Chars (Argx) = Name_On then
+                              Error_Pragma
+                                ("pragma Warnings (On, string) cannot be " &
+                                 "used as configuration pragma");
+
+                           else
+                              Set_Specific_Warning_Off
+                                (No_Location, Name_Buffer (1 .. Name_Len));
+                           end if;
+
+                        --  Normal (non-configuration pragma) case
+
+                        else
+                           if Chars (Argx) = Name_Off then
+                              Set_Specific_Warning_Off
+                                (Loc, Name_Buffer (1 .. Name_Len));
+
+                           elsif Chars (Argx) = Name_On then
+                              Set_Specific_Warning_On
+                                (Loc, Name_Buffer (1 .. Name_Len), Err);
+
+                              if Err then
+                                 Error_Msg
+                                   ("?pragma Warnings On with no " &
+                                    "matching Warnings Off",
+                                    Loc);
+                              end if;
+                           end if;
+                        end if;
+                     end if;
+                  end;
+               end if;
+            end;
+         end Warnings;
 
          -------------------
          -- Weak_External --
@@ -8537,13 +10953,47 @@ package body Sem_Prag is
             end if;
          end Weak_External;
 
+         -----------------------------
+         -- Wide_Character_Encoding --
+         -----------------------------
+
+         --  pragma Wide_Character_Encoding (IDENTIFIER);
+
+         when Pragma_Wide_Character_Encoding =>
+
+            --  Nothing to do, handled in parser. Note that we do not enforce
+            --  configuration pragma placement, this pragma can appear at any
+            --  place in the source, allowing mixed encodings within a single
+            --  source program.
+
+            null;
+
+         --------------------
+         -- Unknown_Pragma --
+         --------------------
+
+         --  Should be impossible, since the case of an unknown pragma is
+         --  separately processed before the case statement is entered.
+
+         when Unknown_Pragma =>
+            raise Program_Error;
       end case;
 
    exception
       when Pragma_Exit => null;
-
    end Analyze_Pragma;
 
+   ---------------------------------
+   -- Delay_Config_Pragma_Analyze --
+   ---------------------------------
+
+   function Delay_Config_Pragma_Analyze (N : Node_Id) return Boolean is
+   begin
+      return Chars (N) = Name_Interrupt_State
+               or else
+             Chars (N) = Name_Priority_Specific_Dispatching;
+   end Delay_Config_Pragma_Analyze;
+
    -------------------------
    -- Get_Base_Subprogram --
    -------------------------
@@ -8552,15 +11002,14 @@ package body Sem_Prag is
       Result : Entity_Id;
 
    begin
-      Result := Def_Id;
-
       --  Follow subprogram renaming chain
 
+      Result := Def_Id;
       while Is_Subprogram (Result)
         and then
           (Is_Generic_Instance (Result)
             or else Nkind (Parent (Declaration_Node (Result))) =
-              N_Subprogram_Renaming_Declaration)
+                    N_Subprogram_Renaming_Declaration)
         and then Present (Alias (Result))
       loop
          Result := Alias (Result);
@@ -8569,15 +11018,272 @@ package body Sem_Prag is
       return Result;
    end Get_Base_Subprogram;
 
-   ---------------------------
-   -- Is_Generic_Subprogram --
-   ---------------------------
+   -----------------------------
+   -- Is_Config_Static_String --
+   -----------------------------
+
+   function Is_Config_Static_String (Arg : Node_Id) return Boolean is
+
+      function Add_Config_Static_String (Arg : Node_Id) return Boolean;
+      --  This is an internal recursive function that is just like the
+      --  outer function except that it adds the string to the name buffer
+      --  rather than placing the string in the name buffer.
+
+      ------------------------------
+      -- Add_Config_Static_String --
+      ------------------------------
+
+      function Add_Config_Static_String (Arg : Node_Id) return Boolean is
+         N : Node_Id;
+         C : Char_Code;
+
+      begin
+         N := Arg;
+
+         if Nkind (N) = N_Op_Concat then
+            if Add_Config_Static_String (Left_Opnd (N)) then
+               N := Right_Opnd (N);
+            else
+               return False;
+            end if;
+         end if;
+
+         if Nkind (N) /= N_String_Literal then
+            Error_Msg_N ("string literal expected for pragma argument", N);
+            return False;
+
+         else
+            for J in 1 .. String_Length (Strval (N)) loop
+               C := Get_String_Char (Strval (N), J);
+
+               if not In_Character_Range (C) then
+                  Error_Msg
+                    ("string literal contains invalid wide character",
+                     Sloc (N) + 1 + Source_Ptr (J));
+                  return False;
+               end if;
+
+               Add_Char_To_Name_Buffer (Get_Character (C));
+            end loop;
+         end if;
+
+         return True;
+      end Add_Config_Static_String;
+
+   --  Start of prorcessing for Is_Config_Static_String
+
+   begin
+
+      Name_Len := 0;
+      return Add_Config_Static_String (Arg);
+   end Is_Config_Static_String;
+
+   -----------------------------------------
+   -- Is_Non_Significant_Pragma_Reference --
+   -----------------------------------------
+
+   --  This function makes use of the following static table which indicates
+   --  whether a given pragma is significant. A value of -1 in this table
+   --  indicates that the reference is significant. A value of zero indicates
+   --  than appearence as any argument is insignificant, a positive value
+   --  indicates that appearence in that parameter position is significant.
+
+   Sig_Flags : constant array (Pragma_Id) of Int :=
+
+     (Pragma_AST_Entry                     => -1,
+      Pragma_Abort_Defer                   => -1,
+      Pragma_Ada_83                        => -1,
+      Pragma_Ada_95                        => -1,
+      Pragma_Ada_05                        => -1,
+      Pragma_Ada_2005                      => -1,
+      Pragma_All_Calls_Remote              => -1,
+      Pragma_Annotate                      => -1,
+      Pragma_Assert                        => -1,
+      Pragma_Assertion_Policy              =>  0,
+      Pragma_Asynchronous                  => -1,
+      Pragma_Atomic                        =>  0,
+      Pragma_Atomic_Components             =>  0,
+      Pragma_Attach_Handler                => -1,
+      Pragma_CIL_Constructor               => -1,
+      Pragma_CPP_Class                     =>  0,
+      Pragma_CPP_Constructor               =>  0,
+      Pragma_CPP_Virtual                   =>  0,
+      Pragma_CPP_Vtable                    =>  0,
+      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,
+      Pragma_Component_Alignment           => -1,
+      Pragma_Controlled                    =>  0,
+      Pragma_Convention                    =>  0,
+      Pragma_Convention_Identifier         =>  0,
+      Pragma_Debug                         => -1,
+      Pragma_Debug_Policy                  =>  0,
+      Pragma_Detect_Blocking               => -1,
+      Pragma_Discard_Names                 =>  0,
+      Pragma_Elaborate                     => -1,
+      Pragma_Elaborate_All                 => -1,
+      Pragma_Elaborate_Body                => -1,
+      Pragma_Elaboration_Checks            => -1,
+      Pragma_Eliminate                     => -1,
+      Pragma_Export                        => -1,
+      Pragma_Export_Exception              => -1,
+      Pragma_Export_Function               => -1,
+      Pragma_Export_Object                 => -1,
+      Pragma_Export_Procedure              => -1,
+      Pragma_Export_Value                  => -1,
+      Pragma_Export_Valued_Procedure       => -1,
+      Pragma_Extend_System                 => -1,
+      Pragma_Extensions_Allowed            => -1,
+      Pragma_External                      => -1,
+      Pragma_External_Name_Casing          => -1,
+      Pragma_Finalize_Storage_Only         =>  0,
+      Pragma_Float_Representation          =>  0,
+      Pragma_Ident                         => -1,
+      Pragma_Import                        => +2,
+      Pragma_Import_Exception              =>  0,
+      Pragma_Import_Function               =>  0,
+      Pragma_Import_Object                 =>  0,
+      Pragma_Import_Procedure              =>  0,
+      Pragma_Import_Valued_Procedure       =>  0,
+      Pragma_Initialize_Scalars            => -1,
+      Pragma_Inline                        =>  0,
+      Pragma_Inline_Always                 =>  0,
+      Pragma_Inline_Generic                =>  0,
+      Pragma_Inspection_Point              => -1,
+      Pragma_Interface                     => +2,
+      Pragma_Interface_Name                => +2,
+      Pragma_Interrupt_Handler             => -1,
+      Pragma_Interrupt_Priority            => -1,
+      Pragma_Interrupt_State               => -1,
+      Pragma_Java_Constructor              => -1,
+      Pragma_Java_Interface                => -1,
+      Pragma_Keep_Names                    =>  0,
+      Pragma_License                       => -1,
+      Pragma_Link_With                     => -1,
+      Pragma_Linker_Alias                  => -1,
+      Pragma_Linker_Constructor            => -1,
+      Pragma_Linker_Destructor             => -1,
+      Pragma_Linker_Options                => -1,
+      Pragma_Linker_Section                => -1,
+      Pragma_List                          => -1,
+      Pragma_Locking_Policy                => -1,
+      Pragma_Long_Float                    => -1,
+      Pragma_Machine_Attribute             => -1,
+      Pragma_Main                          => -1,
+      Pragma_Main_Storage                  => -1,
+      Pragma_Memory_Size                   => -1,
+      Pragma_No_Return                     =>  0,
+      Pragma_No_Body                       =>  0,
+      Pragma_No_Run_Time                   => -1,
+      Pragma_No_Strict_Aliasing            => -1,
+      Pragma_Normalize_Scalars             => -1,
+      Pragma_Obsolescent                   =>  0,
+      Pragma_Optimize                      => -1,
+      Pragma_Pack                          =>  0,
+      Pragma_Page                          => -1,
+      Pragma_Passive                       => -1,
+      Pragma_Preelaborable_Initialization  => -1,
+      Pragma_Polling                       => -1,
+      Pragma_Persistent_BSS                =>  0,
+      Pragma_Preelaborate                  => -1,
+      Pragma_Preelaborate_05               => -1,
+      Pragma_Priority                      => -1,
+      Pragma_Priority_Specific_Dispatching => -1,
+      Pragma_Profile                       =>  0,
+      Pragma_Profile_Warnings              =>  0,
+      Pragma_Propagate_Exceptions          => -1,
+      Pragma_Psect_Object                  => -1,
+      Pragma_Pure                          => -1,
+      Pragma_Pure_05                       => -1,
+      Pragma_Pure_Function                 => -1,
+      Pragma_Queuing_Policy                => -1,
+      Pragma_Ravenscar                     => -1,
+      Pragma_Remote_Call_Interface         => -1,
+      Pragma_Remote_Types                  => -1,
+      Pragma_Restricted_Run_Time           => -1,
+      Pragma_Restriction_Warnings          => -1,
+      Pragma_Restrictions                  => -1,
+      Pragma_Reviewable                    => -1,
+      Pragma_Share_Generic                 => -1,
+      Pragma_Shared                        => -1,
+      Pragma_Shared_Passive                => -1,
+      Pragma_Source_File_Name              => -1,
+      Pragma_Source_File_Name_Project      => -1,
+      Pragma_Source_Reference              => -1,
+      Pragma_Storage_Size                  => -1,
+      Pragma_Storage_Unit                  => -1,
+      Pragma_Static_Elaboration_Desired    => -1,
+      Pragma_Stream_Convert                => -1,
+      Pragma_Style_Checks                  => -1,
+      Pragma_Subtitle                      => -1,
+      Pragma_Suppress                      =>  0,
+      Pragma_Suppress_Exception_Locations  =>  0,
+      Pragma_Suppress_All                  => -1,
+      Pragma_Suppress_Debug_Info           =>  0,
+      Pragma_Suppress_Initialization       =>  0,
+      Pragma_System_Name                   => -1,
+      Pragma_Task_Dispatching_Policy       => -1,
+      Pragma_Task_Info                     => -1,
+      Pragma_Task_Name                     => -1,
+      Pragma_Task_Storage                  =>  0,
+      Pragma_Time_Slice                    => -1,
+      Pragma_Title                         => -1,
+      Pragma_Unchecked_Union               =>  0,
+      Pragma_Unimplemented_Unit            => -1,
+      Pragma_Universal_Aliasing            => -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,
+      Pragma_Validity_Checks               => -1,
+      Pragma_Volatile                      =>  0,
+      Pragma_Volatile_Components           =>  0,
+      Pragma_Warnings                      => -1,
+      Pragma_Weak_External                 => -1,
+      Pragma_Wide_Character_Encoding       =>  0,
+      Unknown_Pragma                       =>  0);
+
+   function Is_Non_Significant_Pragma_Reference (N : Node_Id) return Boolean is
+      P : Node_Id;
+      C : Int;
+      A : Node_Id;
 
-   function Is_Generic_Subprogram (Id : Entity_Id) return Boolean is
    begin
-      return  Ekind (Id) = E_Generic_Procedure
-        or else Ekind (Id) = E_Generic_Function;
-   end Is_Generic_Subprogram;
+      P := Parent (N);
+
+      if Nkind (P) /= N_Pragma_Argument_Association then
+         return False;
+
+      else
+         C := Sig_Flags (Get_Pragma_Id (Chars (Parent (P))));
+
+         case C is
+            when -1 =>
+               return False;
+
+            when 0 =>
+               return True;
+
+            when others =>
+               A := First (Pragma_Argument_Associations (Parent (P)));
+               for J in 1 .. C - 1 loop
+                  if No (A) then
+                     return False;
+                  end if;
+
+                  Next (A);
+               end loop;
+
+               return A = P;
+         end case;
+      end if;
+   end Is_Non_Significant_Pragma_Reference;
 
    ------------------------------
    -- Is_Pragma_String_Literal --
@@ -8644,7 +11350,6 @@ package body Sem_Prag is
       else
          return False;
       end if;
-
    end Is_Pragma_String_Literal;
 
    --------------------------------------
@@ -8685,6 +11390,15 @@ package body Sem_Prag is
       end;
    end Process_Compilation_Unit_Pragmas;
 
+   --------
+   -- rv --
+   --------
+
+   procedure rv is
+   begin
+      null;
+   end rv;
+
    --------------------------------
    -- Set_Encoded_Interface_Name --
    --------------------------------
@@ -8702,6 +11416,10 @@ package body Sem_Prag is
       --  Stores encoded value of character code CC. The encoding we
       --  use an underscore followed by four lower case hex digits.
 
+      ------------
+      -- Encode --
+      ------------
+
       procedure Encode is
       begin
          Store_String_Char (Get_Char_Code ('_'));
@@ -8721,11 +11439,12 @@ package body Sem_Prag is
       --  If first character is asterisk, this is a link name, and we
       --  leave it completely unmodified. We also ignore null strings
       --  (the latter case happens only in error cases) and no encoding
-      --  should occur for Java interface names.
+      --  should occur for Java or AAMP interface names.
 
       if Len = 0
         or else Get_String_Char (Str, 1) = Get_Char_Code ('*')
-        or else Java_VM
+        or else VM_Target /= No_VM
+        or else AAMP_On_Target
       then
          Set_Interface_Name (E, S);
 
@@ -8804,7 +11523,6 @@ package body Sem_Prag is
 
          Pref := Prefix (N);
          Scop := Scope (Entity (N));
-
          while Nkind (Pref) = N_Selected_Component loop
             Change_Selected_Component_To_Expanded_Name (Pref);
             Set_Entity (Selector_Name (Pref), Scop);
@@ -8816,5 +11534,4 @@ package body Sem_Prag is
          Set_Entity (Pref, Scop);
       end if;
    end Set_Unit_Name;
-
 end Sem_Prag;