]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorArnaud Charlet <charlet@gcc.gnu.org>
Tue, 10 Sep 2013 15:05:40 +0000 (17:05 +0200)
committerArnaud Charlet <charlet@gcc.gnu.org>
Tue, 10 Sep 2013 15:05:40 +0000 (17:05 +0200)
2013-09-10  Hristian Kirtchev  <kirtchev@adacore.com>

* aspects.adb: Add entries in the Has_Aspect_Specifications_Flag
table for package body and body stubs.
(Move_Or_Merge_Aspects): New routine.
(Remove_Aspects): New routine.
* aspects.ads (Move_Aspects): Update comment on usage.
(Move_Or_Merge_Aspects): New routine.
(Remove_Aspects): New routine.
* par-ch3.adb: Update the grammar of private_type_declaration,
private_extension_declaration, object_renaming_declaration,
and exception_renaming_declaration.
(P_Subprogram): Parse the
aspect specifications that apply to a body stub.
* par-ch6.adb: Update the grammar of subprogram_body_stub and
generic_instantiation.
* par-ch7.adb: Update the grammar of package_declaration,
package_specification, package_body, package_renaming_declaration,
package_body_stub.
(P_Package): Parse the aspect specifications
that apply to a body, a body stub and package renaming.
* par-ch9.adb: Update the grammar of entry_declaration,
protected_body, protected_body_stub, task_body,
and task_body_stub.
(P_Protected): Add local variable
Aspect_Sloc. Add local constant Dummy_Node.  Parse the aspect
specifications that apply to a protected body and a protected
body stub.
(P_Task): Add local variable Aspect_Sloc. Add local
constant Dummy_Node. Parse the aspect specifications that apply
to a task body and a task body stub.
* par-ch12.adb: Update the grammar of
generic_renaming_declaration.
(P_Generic): Parse the aspect
specifications that apply to a generic renaming.
* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Do not emit
an error when analyzing aspects that apply to a body stub. Such
aspects are relocated to the proper body.
* sem_ch7.adb (Analyze_Package_Body_Helper): Analyze the aspect
specifications that apply to a body.
* sem_ch9.adb (Analyze_Protected_Body): Warn about user-defined
aspects not being supported on protected bodies. Remove the
aspect specifications. (Analyze_Single_Protected_Declaration):
Analyze the aspects that apply to a single protected declaration.
(Analyze_Task_Body): Warn about user-defined aspects not being
supported on task bodies. Remove the aspect specifications.
* sem_ch10.adb: Add with and use clause for Aspects.
(Analyze_Package_Body_Stub): Propagate the aspect specifications
from the stub to the proper body.
* sem_ch13.adb (Analyze_Aspect_Specifications): Insert the
corresponding pragma of an aspect that applies to a body in the
declarations of the body.
* sinfo.ads: Update the gramma of expression_function,
private_type_declaration, private_extension_declaration,
object_renaming_declaration, exception_renaming_declaration,
package_renaming_declaration, subprogram_renaming_declaration,
generic_renaming_declaration, entry_declaration,
subprogram_body_stub, package_body_stub, task_body_stub,
generic_subprogram_declaration.

2013-09-10  Hristian Kirtchev  <kirtchev@adacore.com>

* sem_prag.adb (Analyze_Pragma): Add processing
for aspect/pragma SPARK_Mode when it applies to a [library-level]
subprogram or package [body].

2013-09-10  Robert Dewar  <dewar@adacore.com>

* gnat_ugn.texi: Document that -gnatc and -gnatR cannot be
given together.
* switch-c.adb (Scan_Front_End_Switches): Give error if both
-gnatR and -gnatc given.

2013-09-10  Robert Dewar  <dewar@adacore.com>

* g-table.ads, g-table.adb (For_Each): New generic procedure
(Sort_Table): New generic procedure.

From-SVN: r202460

19 files changed:
gcc/ada/ChangeLog
gcc/ada/aspects.adb
gcc/ada/aspects.ads
gcc/ada/g-table.adb
gcc/ada/g-table.ads
gcc/ada/gnat_ugn.texi
gcc/ada/par-ch12.adb
gcc/ada/par-ch3.adb
gcc/ada/par-ch6.adb
gcc/ada/par-ch7.adb
gcc/ada/par-ch9.adb
gcc/ada/sem_ch10.adb
gcc/ada/sem_ch13.adb
gcc/ada/sem_ch6.adb
gcc/ada/sem_ch7.adb
gcc/ada/sem_ch9.adb
gcc/ada/sem_prag.adb
gcc/ada/sinfo.ads
gcc/ada/switch-c.adb

index cbf0079482819d9b9d77a5374f179a31701cf604..159bdd19e02b67f2be542e53b5aebd06cc1a1d87 100644 (file)
@@ -1,3 +1,81 @@
+2013-09-10  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * aspects.adb: Add entries in the Has_Aspect_Specifications_Flag
+       table for package body and body stubs.
+       (Move_Or_Merge_Aspects): New routine.
+       (Remove_Aspects): New routine.
+       * aspects.ads (Move_Aspects): Update comment on usage.
+       (Move_Or_Merge_Aspects): New routine.
+       (Remove_Aspects): New routine.
+       * par-ch3.adb: Update the grammar of private_type_declaration,
+       private_extension_declaration, object_renaming_declaration,
+       and exception_renaming_declaration.
+       (P_Subprogram): Parse the
+       aspect specifications that apply to a body stub.
+       * par-ch6.adb: Update the grammar of subprogram_body_stub and
+       generic_instantiation.
+       * par-ch7.adb: Update the grammar of package_declaration,
+       package_specification, package_body, package_renaming_declaration,
+       package_body_stub.
+       (P_Package): Parse the aspect specifications
+       that apply to a body, a body stub and package renaming.
+       * par-ch9.adb: Update the grammar of entry_declaration,
+       protected_body, protected_body_stub, task_body,
+       and task_body_stub.
+       (P_Protected): Add local variable
+       Aspect_Sloc. Add local constant Dummy_Node.  Parse the aspect
+       specifications that apply to a protected body and a protected
+       body stub.
+       (P_Task): Add local variable Aspect_Sloc. Add local
+       constant Dummy_Node. Parse the aspect specifications that apply
+       to a task body and a task body stub.
+       * par-ch12.adb: Update the grammar of
+       generic_renaming_declaration.
+       (P_Generic): Parse the aspect
+       specifications that apply to a generic renaming.
+       * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Do not emit
+       an error when analyzing aspects that apply to a body stub. Such
+       aspects are relocated to the proper body.
+       * sem_ch7.adb (Analyze_Package_Body_Helper): Analyze the aspect
+       specifications that apply to a body.
+       * sem_ch9.adb (Analyze_Protected_Body): Warn about user-defined
+       aspects not being supported on protected bodies. Remove the
+       aspect specifications.  (Analyze_Single_Protected_Declaration):
+       Analyze the aspects that apply to a single protected declaration.
+       (Analyze_Task_Body): Warn about user-defined aspects not being
+       supported on task bodies. Remove the aspect specifications.
+       * sem_ch10.adb: Add with and use clause for Aspects.
+       (Analyze_Package_Body_Stub): Propagate the aspect specifications
+       from the stub to the proper body.
+       * sem_ch13.adb (Analyze_Aspect_Specifications): Insert the
+       corresponding pragma of an aspect that applies to a body in the
+       declarations of the body.
+       * sinfo.ads: Update the gramma of expression_function,
+       private_type_declaration, private_extension_declaration,
+       object_renaming_declaration, exception_renaming_declaration,
+       package_renaming_declaration, subprogram_renaming_declaration,
+       generic_renaming_declaration, entry_declaration,
+       subprogram_body_stub, package_body_stub, task_body_stub,
+       generic_subprogram_declaration.
+
+2013-09-10  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * sem_prag.adb (Analyze_Pragma): Add processing
+       for aspect/pragma SPARK_Mode when it applies to a [library-level]
+       subprogram or package [body].
+
+2013-09-10  Robert Dewar  <dewar@adacore.com>
+
+       * gnat_ugn.texi: Document that -gnatc and -gnatR cannot be
+       given together.
+       * switch-c.adb (Scan_Front_End_Switches): Give error if both
+       -gnatR and -gnatc given.
+
+2013-09-10  Robert Dewar  <dewar@adacore.com>
+
+       * g-table.ads, g-table.adb (For_Each): New generic procedure
+       (Sort_Table): New generic procedure.
+
 2013-09-10  Thomas Quinot  <quinot@adacore.com>
 
        * adaint.c (__gnat_is_executable_file_attr): Should be true
index d02edb25702ec2c8c1fc3c821c63a1bf97d4b8c2..111b407867b1b96c5e7a55261aa589f847f771c2 100644 (file)
@@ -271,6 +271,31 @@ package body Aspects is
       end if;
    end Move_Aspects;
 
+   ---------------------------
+   -- Move_Or_Merge_Aspects --
+   ---------------------------
+
+   procedure Move_Or_Merge_Aspects (From : Node_Id; To : Node_Id) is
+   begin
+      if Has_Aspects (From) then
+
+         --  Merge the aspects of From into To. Make sure that From has no
+         --  aspects after the merge takes place.
+
+         if Has_Aspects (To) then
+            Append_List
+              (List => Aspect_Specifications (From),
+               To   => Aspect_Specifications (To));
+            Remove_Aspects (From);
+
+         --  Otherwise simply move the aspects
+
+         else
+            Move_Aspects (From => From, To => To);
+         end if;
+      end if;
+   end Move_Or_Merge_Aspects;
+
    -----------------------------------
    -- Permits_Aspect_Specifications --
    -----------------------------------
@@ -294,6 +319,8 @@ package body Aspects is
       N_Generic_Subprogram_Declaration         => True,
       N_Object_Declaration                     => True,
       N_Object_Renaming_Declaration            => True,
+      N_Package_Body                           => True,
+      N_Package_Body_Stub                      => True,
       N_Package_Declaration                    => True,
       N_Package_Instantiation                  => True,
       N_Package_Specification                  => True,
@@ -302,6 +329,7 @@ package body Aspects is
       N_Private_Type_Declaration               => True,
       N_Procedure_Instantiation                => True,
       N_Protected_Body                         => True,
+      N_Protected_Body_Stub                    => True,
       N_Protected_Type_Declaration             => True,
       N_Single_Protected_Declaration           => True,
       N_Single_Task_Declaration                => True,
@@ -311,6 +339,7 @@ package body Aspects is
       N_Subprogram_Body_Stub                   => True,
       N_Subtype_Declaration                    => True,
       N_Task_Body                              => True,
+      N_Task_Body_Stub                         => True,
       N_Task_Type_Declaration                  => True,
       others                                   => False);
 
@@ -319,6 +348,18 @@ package body Aspects is
       return Has_Aspect_Specifications_Flag (Nkind (N));
    end Permits_Aspect_Specifications;
 
+   --------------------
+   -- Remove_Aspects --
+   --------------------
+
+   procedure Remove_Aspects (N : Node_Id) is
+   begin
+      if Has_Aspects (N) then
+         Aspect_Specifications_Hash_Table.Remove (N);
+         Set_Has_Aspects (N, False);
+      end if;
+   end Remove_Aspects;
+
    -----------------
    -- Same_Aspect --
    -----------------
index acaa4cc8cabbfc83c991c793d464fe0a79b4a562..25c178f77726d8b601c2d4cf45ed1eb50e2febca 100644 (file)
@@ -698,16 +698,24 @@ package Aspects is
    --  Determine whether entity Id has aspect A
 
    procedure Move_Aspects (From : Node_Id; To : Node_Id);
-   --  Moves aspects from 'From' node to 'To' node. Has_Aspects (To) must be
-   --  False on entry. If Has_Aspects (From) is False, the call has no effect.
-   --  Otherwise the aspects are moved and on return Has_Aspects (To) is True,
-   --  and Has_Aspects (From) is False.
+   --  Relocate the aspect specifications of node From to node To. On entry it
+   --  is assumed that To does not have aspect specifications. If From has no
+   --  aspects, the routine has no effect.
+
+   procedure Move_Or_Merge_Aspects (From : Node_Id; To : Node_Id);
+   --  Relocate the aspect specifications of node From to node To. If To has
+   --  aspects, the aspects of From are added to the aspects of To. If From has
+   --  no aspects, the routine has no effect.
 
    function Permits_Aspect_Specifications (N : Node_Id) return Boolean;
    --  Returns True if the node N is a declaration node that permits aspect
    --  specifications in the grammar. It is possible for other nodes to have
    --  aspect specifications as a result of Rewrite or Replace calls.
 
+   procedure Remove_Aspects (N : Node_Id);
+   --  Delete the aspect specifications associated with node N. If the node has
+   --  no aspects, the routine has no effect.
+
    function Same_Aspect (A1 : Aspect_Id; A2 : Aspect_Id) return Boolean;
    --  Returns True if A1 and A2 are (essentially) the same aspect. This is not
    --  a simple equality test because e.g. Post and Postcondition are the same.
index eeaa59bb6f785306e01dc7acec38bffd2bb0b556..9b3692bbe06547390fb7648f7bc4e96cff6cea64 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                     Copyright (C) 1998-2010, AdaCore                     --
+--                     Copyright (C) 1998-2013, AdaCore                     --
 --                                                                          --
 -- 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- --
@@ -29,6 +29,8 @@
 --                                                                          --
 ------------------------------------------------------------------------------
 
+with GNAT.Heap_Sort_G;
+
 with System;        use System;
 with System.Memory; use System.Memory;
 
@@ -114,6 +116,19 @@ package body GNAT.Table is
       Last_Val := Last_Val - 1;
    end Decrement_Last;
 
+   --------------
+   -- For_Each --
+   --------------
+
+   procedure For_Each is
+      Quit : Boolean := False;
+   begin
+      for Index in Table_Low_Bound .. Table_Index_Type (Last_Val) loop
+         Action (Index, Table (Index), Quit);
+         exit when Quit;
+      end loop;
+   end For_Each;
+
    ----------
    -- Free --
    ----------
@@ -259,17 +274,17 @@ package body GNAT.Table is
       pragma Import (Ada, Allocated_Table);
       pragma Suppress (Range_Check, On => Allocated_Table);
       for Allocated_Table'Address use Allocated_Table_Address;
-      --  Allocated_Table represents the currently allocated array, plus
-      --  one element (the supplementary element is used to have a
-      --  convenient way of computing the address just past the end of the
-      --  current allocation). Range checks are suppressed because this unit
-      --  uses direct calls to System.Memory for allocation, and this can
-      --  yield misaligned storage (and we cannot rely on the bootstrap
-      --  compiler supporting specifically disabling alignment checks, so we
-      --  need to suppress all range checks). It is safe to suppress this check
-      --  here because we know that a (possibly misaligned) object of that type
-      --  does actually exist at that address.
-      --  ??? We should really improve the allocation circuitry here to
+      --  Allocated_Table represents the currently allocated array, plus one
+      --  element (the supplementary element is used to have a convenient
+      --  way of computing the address just past the end of the current
+      --  allocation). Range checks are suppressed because this unit uses
+      --  direct calls to System.Memory for allocation, and this can yield
+      --  misaligned storage (and we cannot rely on the bootstrap compiler
+      --  supporting specifically disabling alignment checks, so we need to
+      --  suppress all range checks). It is safe to suppress this check here
+      --  because we know that a (possibly misaligned) object of that type
+      --  does actually exist at that address. ??? We should really improve
+      --  the allocation circuitry here to
       --  guarantee proper alignment.
 
       Need_Realloc : constant Boolean := Integer (Index) > Max;
@@ -324,6 +339,74 @@ package body GNAT.Table is
       end if;
    end Set_Last;
 
+   ----------------
+   -- Sort_Table --
+   ----------------
+
+   procedure Sort_Table is
+
+      Temp : Table_Component_Type;
+      --  A temporary position to simulate index 0
+
+      --  Local subprograms
+
+      function Index_Of (Idx : Natural) return Table_Index_Type;
+      --  Return index of Idx'th element of table
+
+      function Lower_Than (Op1, Op2 : Natural) return Boolean;
+      --  Compare two components
+
+      procedure Move (From : Natural; To : Natural);
+      --  Move one component
+
+      package Heap_Sort is new GNAT.Heap_Sort_G (Move, Lower_Than);
+
+      --------------
+      -- Index_Of --
+      --------------
+
+      function Index_Of (Idx : Natural) return Table_Index_Type is
+         J : constant Integer'Base := Table_Index_Type'Pos (First) + Idx - 1;
+      begin
+         return Table_Index_Type'Val (J);
+      end Index_Of;
+
+      ----------
+      -- Move --
+      ----------
+
+      procedure Move (From : Natural; To : Natural) is
+      begin
+         if From = 0 then
+            Table (Index_Of (To)) := Temp;
+         elsif To = 0 then
+            Temp := Table (Index_Of (From));
+         else
+            Table (Index_Of (To)) := Table (Index_Of (From));
+         end if;
+      end Move;
+
+      ----------------
+      -- Lower_Than --
+      ----------------
+
+      function Lower_Than (Op1, Op2 : Natural) return Boolean is
+      begin
+         if Op1 = 0 then
+            return Lt (Temp, Table (Index_Of (Op2)));
+         elsif Op2 = 0 then
+            return Lt (Table (Index_Of (Op1)), Temp);
+         else
+            return Lt (Table (Index_Of (Op1)), Table (Index_Of (Op2)));
+         end if;
+      end Lower_Than;
+
+   --  Start of processing for Sort_Table
+
+   begin
+      Heap_Sort.Sort (Natural (Last - First) + 1);
+   end Sort_Table;
+
 begin
    Init;
 end GNAT.Table;
index 5a879752e45352800b1914e03a5ed435b92a7f90..c9b75f61648efd707a551b2ae9e21f995040b52c 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---                     Copyright (C) 1998-2010, AdaCore                     --
+--                     Copyright (C) 1998-2013, AdaCore                     --
 --                                                                          --
 -- 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- --
@@ -201,4 +201,25 @@ package GNAT.Table is
    --  This means that a reference X.Table (X.Allocate) is incorrect, since
    --  the call to X.Allocate may modify the results of calling X.Table.
 
+   generic
+     with procedure Action
+       (Index : Table_Index_Type;
+        Item  : Table_Component_Type;
+        Quit  : in out Boolean) is <>;
+   procedure For_Each;
+   --  Calls procedure Action for each component of the table, or until
+   --  one of these calls set Quit to True.
+
+   generic
+     with function Lt (Comp1, Comp2 : Table_Component_Type) return Boolean;
+   procedure Sort_Table;
+   --  This procedure sorts the components of the table into ascending
+   --  order making calls to Lt to do required comparisons, and using
+   --  assignments to move components around. The Lt function returns True
+   --  if Comp1 is less than Comp2 (in the sense of the desired sort), and
+   --  False if Comp1 is greater than Comp2. For equal objects it does not
+   --  matter if True or False is returned (it is slightly more efficient
+   --  to return False). The sort is not stable (the order of equal items
+   --  in the table is not preserved).
+
 end GNAT.Table;
index 0a5f07db04aa995d1734a24165a7601d7b73adce..4bf45940ae463c10566ca53f4c206e8cc6d2f7ad 100644 (file)
@@ -3697,7 +3697,9 @@ object file after compilation. If @command{gnatmake} is called with
 @option{-gnatc} as a builder switch (before @option{-cargs} or in package
 Builder of the project file) then @command{gnatmake} will not fail because
 it will not look for the object files after compilation, and it will not try
-to build and link.
+to build and link. This switch may not be given if a previous @code{-gnatR}
+switch has been given, since @code{-gnatR} requires that the code generator
+be called to complete determination of representation information.
 
 @item -gnatC
 @cindex @option{-gnatC} (@command{gcc})
@@ -4006,8 +4008,10 @@ Treat pragma Restrictions as Restriction_Warnings.
 @item ^-gnatR@r{[}0@r{/}1@r{/}2@r{/}3@r{[}s@r{]]}^/REPRESENTATION_INFO^
 @cindex @option{-gnatR} (@command{gcc})
 Output representation information for declared types and objects.
-Note that this switch is not allowed if a previous
--gnatD switch has been given, since these two switches are not compatible.
+Note that this switch is not allowed if a previous @code{-gnatD} switch has
+been given, since these two switches are not compatible. It is also not allowed
+if a previous @code{-gnatc} switch has been given, since we must be generating
+code to be able to determine representation information.
 
 @item -gnats
 @cindex @option{-gnats} (@command{gcc})
index 3c192f2877b80a1ef4743bc5fb83a0ae83c6dd1a..ed6e314dca00cd4873fe5e1abe9b3615c1445099 100644 (file)
@@ -74,10 +74,13 @@ package body Ch12 is
    --  GENERIC_RENAMING_DECLARATION ::=
    --    generic package DEFINING_PROGRAM_UNIT_NAME
    --      renames generic_package_NAME
+   --        [ASPECT_SPECIFICATIONS];
    --  | generic procedure DEFINING_PROGRAM_UNIT_NAME
    --      renames generic_procedure_NAME
+   --        [ASPECT_SPECIFICATIONS];
    --  | generic function DEFINING_PROGRAM_UNIT_NAME
    --      renames generic_function_NAME
+   --        [ASPECT_SPECIFICATIONS];
 
    --  GENERIC_FORMAL_PARAMETER_DECLARATION ::=
    --    FORMAL_OBJECT_DECLARATION
@@ -140,6 +143,8 @@ package body Ch12 is
                Scan; -- past RENAMES
                Set_Defining_Unit_Name (Decl_Node, Def_Unit);
                Set_Name (Decl_Node, P_Name);
+
+               P_Aspect_Specifications (Decl_Node, Semicolon => False);
                TF_Semicolon;
                return Decl_Node;
             end if;
@@ -211,7 +216,6 @@ package body Ch12 is
 
       else
          Gen_Decl := New_Node (N_Generic_Subprogram_Declaration, Gen_Sloc);
-
          Set_Specification (Gen_Decl, P_Subprogram_Specification);
 
          if Nkind (Defining_Unit_Name (Specification (Gen_Decl))) =
index eae388ba7aedcb7fed6ce8c95e7ac53a21a83f48..29126152d43cde3d7ab0c2e0b0343b186944a34e 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2012, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2013, 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- --
@@ -275,13 +275,14 @@ package body Ch3 is
 
    --  PRIVATE_TYPE_DECLARATION ::=
    --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART]
-   --      is [abstract] [tagged] [limited] private;
+   --      is [abstract] [tagged] [limited] private
+   --        [ASPECT_SPECIFICATIONS];
 
    --  PRIVATE_EXTENSION_DECLARATION ::=
    --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART] is
    --      [abstract] [limited | synchronized]
    --        new ancestor_SUBTYPE_INDICATION [and INTERFACE_LIST]
-   --          with private;
+   --          with private [ASPECT_SPECIFICATIONS];
 
    --  TYPE_DEFINITION ::=
    --    ENUMERATION_TYPE_DEFINITION  | INTEGER_TYPE_DEFINITION
@@ -1277,12 +1278,15 @@ package body Ch3 is
 
    --  OBJECT_RENAMING_DECLARATION ::=
    --    DEFINING_IDENTIFIER :
-   --      [NULL_EXCLUSION] SUBTYPE_MARK renames object_NAME;
+   --      [NULL_EXCLUSION] SUBTYPE_MARK renames object_NAME
+   --        [ASPECT_SPECIFICATIONS];
    --  | DEFINING_IDENTIFIER :
-   --      ACCESS_DEFINITION renames object_NAME;
+   --      ACCESS_DEFINITION renames object_NAME
+   --        [ASPECT_SPECIFICATIONS];
 
    --  EXCEPTION_RENAMING_DECLARATION ::=
-   --    DEFINING_IDENTIFIER : exception renames exception_NAME;
+   --    DEFINING_IDENTIFIER : exception renames exception_NAME
+   --      [ASPECT_SPECIFICATIONS];
 
    --  EXCEPTION_DECLARATION ::=
    --    DEFINING_IDENTIFIER_LIST : exception
@@ -1669,15 +1673,19 @@ package body Ch3 is
 
             --  OBJECT_DECLARATION ::=
             --    DEFINING_IDENTIFIER_LIST : [aliased] [constant]
-            --      [NULL_EXCLUSION] SUBTYPE_INDICATION [:= EXPRESSION];
+            --      [NULL_EXCLUSION] SUBTYPE_INDICATION [:= EXPRESSION]
+            --        [ASPECT_SPECIFICATIONS];
             --  | DEFINING_IDENTIFIER_LIST : [aliased] [constant]
-            --      ACCESS_DEFINITION [:= EXPRESSION];
+            --      ACCESS_DEFINITION [:= EXPRESSION]
+            --        [ASPECT_SPECIFICATIONS];
 
             --  OBJECT_RENAMING_DECLARATION ::=
             --    DEFINING_IDENTIFIER :
-            --      [NULL_EXCLUSION] SUBTYPE_MARK renames object_NAME;
+            --      [NULL_EXCLUSION] SUBTYPE_MARK renames object_NAME
+            --        [ASPECT_SPECIFICATIONS];
             --  | DEFINING_IDENTIFIER :
-            --      ACCESS_DEFINITION renames object_NAME;
+            --      ACCESS_DEFINITION renames object_NAME
+            --        [ASPECT_SPECIFICATIONS];
 
             Not_Null_Present := P_Null_Exclusion;  --  Ada 2005 (AI-231/423)
 
@@ -1893,7 +1901,7 @@ package body Ch3 is
    --     type DEFINING_IDENTIFIER [DISCRIMINANT_PART] is
    --       [abstract] [limited | synchronized]
    --          new ancestor_SUBTYPE_INDICATION [and INTERFACE_LIST]
-   --            with private;
+   --            with private [ASPECT_SPECIFICATIONS];
 
    --  RECORD_EXTENSION_PART ::= with RECORD_DEFINITION
 
index 7531f405fe108da51cef99b036024ee974712d10..f6aacd1405759d28174fa8a34d70ac3790c306d9 100644 (file)
@@ -161,13 +161,16 @@ package body Ch6 is
    --      [ASPECT_SPECIFICATIONS];
 
    --  SUBPROGRAM_BODY_STUB ::=
-   --    SUBPROGRAM_SPECIFICATION is separate;
+   --    SUBPROGRAM_SPECIFICATION is separate
+   --      [ASPECT_SPECIFICATIONS];
 
    --  GENERIC_INSTANTIATION ::=
    --    procedure DEFINING_PROGRAM_UNIT_NAME is
-   --      new generic_procedure_NAME [GENERIC_ACTUAL_PART];
+   --      new generic_procedure_NAME [GENERIC_ACTUAL_PART]
+   --        [ASPECT_SPECIFICATIONS];
    --  | function DEFINING_DESIGNATOR is
-   --      new generic_function_NAME [GENERIC_ACTUAL_PART];
+   --      new generic_function_NAME [GENERIC_ACTUAL_PART]
+   --        [ASPECT_SPECIFICATIONS];
 
    --  NULL_PROCEDURE_DECLARATION ::=
    --    SUBPROGRAM_SPECIFICATION is null;
@@ -394,8 +397,8 @@ package body Ch6 is
       if Token = Tok_Identifier
         and then not Token_Is_At_Start_Of_Line
       then
-            T_Left_Paren; -- to generate message
-            Fpart_List := P_Formal_Part;
+         T_Left_Paren; -- to generate message
+         Fpart_List := P_Formal_Part;
 
       --  Otherwise scan out an optional formal part in the usual manner
 
@@ -681,21 +684,21 @@ package body Ch6 is
                   Sloc (Name_Node));
             end if;
 
+            Scan; -- past SEPARATE
+
             Stub_Node :=
               New_Node (N_Subprogram_Body_Stub, Sloc (Specification_Node));
             Set_Specification (Stub_Node, Specification_Node);
 
-            --  The specification has been parsed as part of a subprogram
-            --  declaration, and aspects have already been collected.
-
             if Is_Non_Empty_List (Aspects) then
-               Set_Parent (Aspects, Stub_Node);
-               Set_Aspect_Specifications (Stub_Node, Aspects);
+               Error_Msg
+                 ("aspect specifications must come after SEPARATE",
+                  Sloc (First (Aspects)));
             end if;
 
-            Scan; -- past SEPARATE
-            Pop_Scope_Stack;
+            P_Aspect_Specifications (Stub_Node, Semicolon => False);
             TF_Semicolon;
+            Pop_Scope_Stack;
             return Stub_Node;
 
          --  Subprogram body or expression function case
index d52a13d6c5b2fd10cd2136076ff1899ad3c203a6..0a658c963e177cfdeb9067b5ffc1dff0e3d87411 100644 (file)
@@ -38,28 +38,33 @@ package body Ch7 is
    --  renaming declaration or generic instantiation starting with PACKAGE
 
    --  PACKAGE_DECLARATION ::=
-   --    PACKAGE_SPECIFICATION
-   --      [ASPECT_SPECIFICATIONS];
+   --    PACKAGE_SPECIFICATION;
 
    --  PACKAGE_SPECIFICATION ::=
-   --    package DEFINING_PROGRAM_UNIT_NAME is
+   --    package DEFINING_PROGRAM_UNIT_NAME
+   --      [ASPECT_SPECIFICATIONS]
+   --    is
    --      {BASIC_DECLARATIVE_ITEM}
    --    [private
    --      {BASIC_DECLARATIVE_ITEM}]
    --    end [[PARENT_UNIT_NAME .] IDENTIFIER]
 
    --  PACKAGE_BODY ::=
-   --    package body DEFINING_PROGRAM_UNIT_NAME is
+   --    package body DEFINING_PROGRAM_UNIT_NAME
+   --      [ASPECT_SPECIFICATIONS]
+   --    is
    --      DECLARATIVE_PART
    --    [begin
    --      HANDLED_SEQUENCE_OF_STATEMENTS]
    --    end [[PARENT_UNIT_NAME .] IDENTIFIER]
 
    --  PACKAGE_RENAMING_DECLARATION ::=
-   --    package DEFINING_IDENTIFIER renames package_NAME;
+   --    package DEFINING_IDENTIFIER renames package_NAME
+   --      [ASPECT_SPECIFICATIONS];
 
    --  PACKAGE_BODY_STUB ::=
-   --    package body DEFINING_IDENTIFIER is separate;
+   --    package body DEFINING_IDENTIFIER is separate
+   --      [ASPECT_SPECIFICATIONS];
 
    --  PACKAGE_INSTANTIATION ::=
    --    package DEFINING_PROGRAM_UNIT_NAME is
@@ -141,6 +146,12 @@ package body Ch7 is
          Scope.Table (Scope.Last).Sloc := Token_Ptr;
          Name_Node := P_Defining_Program_Unit_Name;
          Scope.Table (Scope.Last).Labl := Name_Node;
+
+         if Aspect_Specifications_Present then
+            Aspect_Sloc := Token_Ptr;
+            P_Aspect_Specifications (Dummy_Node, Semicolon => False);
+         end if;
+
          TF_Is;
 
          if Separate_Present then
@@ -149,16 +160,30 @@ package body Ch7 is
             end if;
 
             Scan; -- past SEPARATE
-            TF_Semicolon;
-            Pop_Scope_Stack;
 
             Package_Node := New_Node (N_Package_Body_Stub, Package_Sloc);
             Set_Defining_Identifier (Package_Node, Name_Node);
 
+            if Has_Aspects (Dummy_Node) then
+               Error_Msg
+                 ("aspect specifications must come after SEPARATE",
+                  Aspect_Sloc);
+            end if;
+
+            P_Aspect_Specifications (Package_Node, Semicolon => False);
+            TF_Semicolon;
+            Pop_Scope_Stack;
+
          else
             Package_Node := New_Node (N_Package_Body, Package_Sloc);
             Set_Defining_Unit_Name (Package_Node, Name_Node);
 
+            --  Move the aspect specifications to the body node
+
+            if Has_Aspects (Dummy_Node) then
+               Move_Aspects (From => Dummy_Node, To => Package_Node);
+            end if;
+
             --  In SPARK, a HIDE directive can be placed at the beginning of a
             --  package implementation, thus hiding the package body from SPARK
             --  tool-set. No violation of the SPARK restriction should be
@@ -204,6 +229,7 @@ package body Ch7 is
             Set_Name (Package_Node, P_Qualified_Simple_Name);
 
             No_Constraint;
+            P_Aspect_Specifications (Package_Node, Semicolon => False);
             TF_Semicolon;
             Pop_Scope_Stack;
 
index 2de05880b59e1d3f9fd9caed8e05228725e2206a..e1692c4a11b7caab43dfb09d3cf9b30731188923 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2011, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2013, 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- --
@@ -61,14 +61,15 @@ package body Ch9 is
    --      [is [new INTERFACE_LIST with] TASK_DEFINITION];
 
    --  TASK_BODY ::=
-   --    task body DEFINING_IDENTIFIER is
+   --    task body DEFINING_IDENTIFIER [ASPECT_SPECIFICATIONS] is
    --      DECLARATIVE_PART
    --    begin
    --      HANDLED_SEQUENCE_OF_STATEMENTS
    --    end [task_IDENTIFIER]
 
    --  TASK_BODY_STUB ::=
-   --    task body DEFINING_IDENTIFIER is separate;
+   --    task body DEFINING_IDENTIFIER is separate
+   --      [ASPECT_SPECIFICATIONS];
 
    --  This routine scans out a task declaration, task body, or task stub
 
@@ -78,9 +79,15 @@ package body Ch9 is
    --  Error recovery: cannot raise Error_Resync
 
    function P_Task return Node_Id is
-      Name_Node  : Node_Id;
-      Task_Node  : Node_Id;
-      Task_Sloc  : Source_Ptr;
+      Aspect_Sloc : Source_Ptr;
+      Name_Node   : Node_Id;
+      Task_Node   : Node_Id;
+      Task_Sloc   : Source_Ptr;
+
+      Dummy_Node : constant Node_Id := New_Node (N_Task_Body, Token_Ptr);
+      --  Placeholder node used to hold legal or prematurely declared aspect
+      --  specifications. Depending on the context, the aspect specifications
+      --  may be moved to a new node.
 
    begin
       Push_Scope_Stack;
@@ -100,6 +107,11 @@ package body Ch9 is
             Discard_Junk_List (P_Known_Discriminant_Part_Opt);
          end if;
 
+         if Aspect_Specifications_Present then
+            Aspect_Sloc := Token_Ptr;
+            P_Aspect_Specifications (Dummy_Node, Semicolon => False);
+         end if;
+
          TF_Is;
 
          --  Task stub
@@ -108,6 +120,14 @@ package body Ch9 is
             Scan; -- past SEPARATE
             Task_Node := New_Node (N_Task_Body_Stub, Task_Sloc);
             Set_Defining_Identifier (Task_Node, Name_Node);
+
+            if Has_Aspects (Dummy_Node) then
+               Error_Msg
+                 ("aspect specifications must come after SEPARATE",
+                  Aspect_Sloc);
+            end if;
+
+            P_Aspect_Specifications (Task_Node, Semicolon => False);
             TF_Semicolon;
             Pop_Scope_Stack; -- remove unused entry
 
@@ -116,6 +136,13 @@ package body Ch9 is
          else
             Task_Node := New_Node (N_Task_Body, Task_Sloc);
             Set_Defining_Identifier (Task_Node, Name_Node);
+
+            --  Move the aspect specifications to the body node
+
+            if Has_Aspects (Dummy_Node) then
+               Move_Aspects (From => Dummy_Node, To => Task_Node);
+            end if;
+
             Parse_Decls_Begin_End (Task_Node);
          end if;
 
@@ -367,12 +394,15 @@ package body Ch9 is
    --    is [new INTERFACE_LIST with] PROTECTED_DEFINITION;
 
    --  PROTECTED_BODY ::=
-   --    protected body DEFINING_IDENTIFIER is
+   --    protected body DEFINING_IDENTIFIER
+   --      [ASPECT_SPECIFICATIONS]
+   --    is
    --      {PROTECTED_OPERATION_ITEM}
    --    end [protected_IDENTIFIER];
 
    --  PROTECTED_BODY_STUB ::=
-   --    protected body DEFINING_IDENTIFIER is separate;
+   --    protected body DEFINING_IDENTIFIER is separate
+   --      [ASPECT_SPECIFICATIONS];
 
    --  This routine scans out a protected declaration, protected body
    --  or a protected stub.
@@ -383,11 +413,17 @@ package body Ch9 is
    --  Error recovery: cannot raise Error_Resync
 
    function P_Protected return Node_Id is
+      Aspect_Sloc    : Source_Ptr;
       Name_Node      : Node_Id;
       Protected_Node : Node_Id;
       Protected_Sloc : Source_Ptr;
       Scan_State     : Saved_Scan_State;
 
+      Dummy_Node : constant Node_Id := New_Node (N_Protected_Body, Token_Ptr);
+      --  Placeholder node used to hold legal or prematurely declared aspect
+      --  specifications. Depending on the context, the aspect specifications
+      --  may be moved to a new node.
+
    begin
       Push_Scope_Stack;
       Scope.Table (Scope.Last).Etyp := E_Name;
@@ -405,14 +441,28 @@ package body Ch9 is
             Discard_Junk_List (P_Known_Discriminant_Part_Opt);
          end if;
 
+         if Aspect_Specifications_Present then
+            Aspect_Sloc := Token_Ptr;
+            P_Aspect_Specifications (Dummy_Node, Semicolon => False);
+         end if;
+
          TF_Is;
 
          --  Protected stub
 
          if Token = Tok_Separate then
             Scan; -- past SEPARATE
+
             Protected_Node := New_Node (N_Protected_Body_Stub, Protected_Sloc);
             Set_Defining_Identifier (Protected_Node, Name_Node);
+
+            if Has_Aspects (Dummy_Node) then
+               Error_Msg
+                 ("aspect specifications must come after SEPARATE",
+                  Aspect_Sloc);
+            end if;
+
+            P_Aspect_Specifications (Protected_Node, Semicolon => False);
             TF_Semicolon;
             Pop_Scope_Stack; -- remove unused entry
 
@@ -421,6 +471,8 @@ package body Ch9 is
          else
             Protected_Node := New_Node (N_Protected_Body, Protected_Sloc);
             Set_Defining_Identifier (Protected_Node, Name_Node);
+
+            Move_Aspects (From => Dummy_Node, To => Protected_Node);
             Set_Declarations (Protected_Node, P_Protected_Operation_Items);
             End_Statements (Protected_Node);
          end if;
@@ -800,8 +852,8 @@ package body Ch9 is
 
    --  ENTRY_DECLARATION ::=
    --    [OVERRIDING_INDICATOR]
-   --    entry DEFINING_IDENTIFIER [(DISCRETE_SUBTYPE_DEFINITION)]
-   --      PARAMETER_PROFILE;
+   --    entry DEFINING_IDENTIFIER
+   --      [(DISCRETE_SUBTYPE_DEFINITION)] PARAMETER_PROFILE
    --        [ASPECT_SPECIFICATIONS];
 
    --  The caller has checked that the initial token is ENTRY, NOT or
index 87d2ab3c2595a8b513d189b2be4d52eacc3ab21e..6c36bf2cdb75096fa151654532192f0f15d61039 100644 (file)
@@ -23,6 +23,7 @@
 --                                                                          --
 ------------------------------------------------------------------------------
 
+with Aspects;  use Aspects;
 with Atree;    use Atree;
 with Debug;    use Debug;
 with Einfo;    use Einfo;
@@ -1555,8 +1556,8 @@ package body Sem_Ch10 is
    -------------------------------
 
    procedure Analyze_Package_Body_Stub (N : Node_Id) is
-      Id   : constant Entity_Id := Defining_Identifier (N);
-      Nam  : Entity_Id;
+      Id  : constant Entity_Id := Defining_Identifier (N);
+      Nam : Entity_Id;
 
    begin
       --  The package declaration must be in the current declarative part
@@ -1844,6 +1845,12 @@ package body Sem_Ch10 is
                         SCO_Record (Unum);
                      end if;
 
+                     --  Propagate any aspect specifications associated with
+                     --  with the stub to the proper body.
+
+                     Move_Or_Merge_Aspects
+                       (From => N, To => Proper_Body (Unit (Comp_Unit)));
+
                      --  Analyze the unit if semantics active
 
                      if not Fatal_Error (Unum) or else Try_Semantics then
@@ -2327,8 +2334,8 @@ package body Sem_Ch10 is
    ----------------------------
 
    procedure Analyze_Task_Body_Stub (N : Node_Id) is
-      Nam : Entity_Id := Current_Entity_In_Scope (Defining_Identifier (N));
       Loc : constant Source_Ptr := Sloc (N);
+      Nam : Entity_Id := Current_Entity_In_Scope (Defining_Identifier (N));
 
    begin
       Check_Stub_Level (N);
index 40cc72957d5f2beaf547ca4469c5b594a2dd4e76..ac9e736a8c06237450251c63ac18c5d57a0f24fb 100644 (file)
@@ -1781,7 +1781,6 @@ package body Sem_Ch13 is
                --  Warnings
 
                when Aspect_Warnings =>
-
                   Make_Aitem_Pragma
                     (Pragma_Argument_Associations => New_List (
                        Make_Pragma_Argument_Association (Sloc (Expr),
@@ -2434,6 +2433,18 @@ package body Sem_Ch13 is
                Set_Has_Delayed_Aspects (E);
                Record_Rep_Item (E, Aspect);
 
+            --  When delay is not required and the context is a package body,
+            --  insert the pragma in the declarations of the body.
+
+            elsif Nkind (N) = N_Package_Body then
+               if No (Declarations (N)) then
+                  Set_Declarations (N, New_List);
+               end if;
+
+               --  The pragma is added before source declarations
+
+               Prepend_To (Declarations (N), Aitem);
+
             --  When delay is not required and the context is not a compilation
             --  unit, we simply insert the pragma/attribute definition clause
             --  in sequence.
index 57712d83d9cbd35af875d6fa22970d34a8f97ead..44ce304363be946a2d2e1ff65aa553afa93ac9a2 100644 (file)
@@ -2680,7 +2680,14 @@ package body Sem_Ch6 is
       --  a corresponding spec, but for which there may also be a spec_id.
 
       if Has_Aspects (N) then
-         if Present (Spec_Id) then
+
+         --  Aspects that apply to a body stub are relocated to the proper
+         --  body. Do not emit an error in this case.
+
+         if Present (Spec_Id)
+           and then Nkind (N) not in N_Body_Stub
+           and then Nkind (Parent (N)) /= N_Subunit
+         then
             Error_Msg_N
               ("aspect specifications must appear in subprogram declaration",
                 N);
index 505fe9d9916d7cb84f834c82715a7bf63d87e8e0..e06b6b997cf0453eddc2803eacad095e4c627b31 100644 (file)
@@ -219,11 +219,15 @@ package body Sem_Ch7 is
       --  the later is never used for name resolution. In this fashion there
       --  is only one visible entity that denotes the package.
 
-      --  Set Body_Id. Note that this Will be reset to point to the generic
+      --  Set Body_Id. Note that this will be reset to point to the generic
       --  copy later on in the generic case.
 
       Body_Id := Defining_Entity (N);
 
+      if Has_Aspects (N) then
+         Analyze_Aspect_Specifications (N, Body_Id);
+      end if;
+
       if Present (Corresponding_Spec (N)) then
 
          --  Body is body of package instantiation. Corresponding spec has
@@ -766,7 +770,7 @@ package body Sem_Ch7 is
       --  True when this package declaration is not a nested declaration
 
    begin
-      --  Analye aspect specifications immediately, since we need to recognize
+      --  Analyze aspect specifications immediately, since we need to recognize
       --  things like Pure early enough to diagnose violations during analysis.
 
       if Has_Aspects (N) then
index 41b4d9ccb2ab9455d8c3d8d169b7c0bf21fb8339..52dcb90d18447b811a3c26ec86dd7643461527b8 100644 (file)
@@ -1734,6 +1734,22 @@ package body Sem_Ch9 is
       Set_Ekind (Body_Id, E_Protected_Body);
       Spec_Id := Find_Concurrent_Spec (Body_Id);
 
+      --  Protected bodies are currently removed by the expander. Since there
+      --  are no language-defined aspects that apply to a protected body, it is
+      --  not worth changing the whole expansion to accomodate user-defined
+      --  aspects. Plus we cannot possibly known the semantics of user-defined
+      --  aspects in order to plan ahead.
+
+      if Has_Aspects (N) then
+         Error_Msg_N
+           ("?user-defined aspects on protected bodies are not supported", N);
+
+         --  The aspects are removed for now to prevent cascading errors down
+         --  stream.
+
+         Remove_Aspects (N);
+      end if;
+
       if Present (Spec_Id)
         and then Ekind (Spec_Id) = E_Protected_Type
       then
@@ -2606,6 +2622,10 @@ package body Sem_Ch9 is
       --  disastrous result.
 
       Analyze_Protected_Type_Declaration (N);
+
+      if Has_Aspects (N) then
+         Analyze_Aspect_Specifications (N, Id);
+      end if;
    end Analyze_Single_Protected_Declaration;
 
    -------------------------------------
@@ -2703,6 +2723,22 @@ package body Sem_Ch9 is
       Set_Scope (Body_Id, Current_Scope);
       Spec_Id := Find_Concurrent_Spec (Body_Id);
 
+      --  Task bodies are transformed into a subprogram spec and body pair by
+      --  the expander. Since there are no language-defined aspects that apply
+      --  to a task body, it is not worth changing the whole expansion to
+      --  accomodate user-defined aspects. Plus we cannot possibly known the
+      --  semantics of user-defined aspects in order to plan ahead.
+
+      if Has_Aspects (N) then
+         Error_Msg_N
+           ("?user-defined aspects on task bodies are not supported", N);
+
+         --  The aspects are removed for now to prevent cascading errors down
+         --  stream.
+
+         Remove_Aspects (N);
+      end if;
+
       --  The spec is either a task type declaration, or a single task
       --  declaration for which we have created an anonymous type.
 
index f9dfab7568bdc2eaa28b87328dbd961371d5c002..901ce4f8292b526be87dca0223cc6aa292bf7290 100644 (file)
@@ -16633,11 +16633,52 @@ package body Sem_Prag is
                   Stmt := Prev (Stmt);
                end loop;
 
-               --  If we get here, then we ran out of preceding statements. The
-               --  pragma is immediately within a body.
+               --  Handle all cases where the pragma is actually an aspect and
+               --  applies to a library-level package spec, body or subprogram.
 
-               if Nkind_In (Context, N_Package_Body,
-                                     N_Subprogram_Body)
+               --    function F ... with SPARK_Mode => ...;
+               --    package P with SPARK_Mode => ...;
+               --    package body P with SPARK_Mode => ... is
+
+               --  The following circuitry simply prepares the proper context
+               --  for the general pragma processing mechanism below.
+
+               if Nkind (Context) = N_Compilation_Unit_Aux then
+                  Context := Unit (Parent (Context));
+
+                  if Nkind_In (Context, N_Package_Declaration,
+                                        N_Subprogram_Declaration)
+                  then
+                     Context := Specification (Context);
+                  end if;
+               end if;
+
+               --  The pragma is at the top level of a package spec or appears
+               --  as an aspect on a subprogram.
+
+               --    function F ... with SPARK_Mode => ...;
+
+               --    package P is
+               --       pragma SPARK_Mode;
+
+               if Nkind_In (Context, N_Function_Specification,
+                                     N_Package_Specification,
+                                     N_Procedure_Specification)
+               then
+                  Spec_Id := Defining_Unit_Name (Context);
+                  Chain_Pragma (Spec_Id, N);
+
+               --  The pragma is immediately within a package or subprogram
+               --  body.
+
+               --    function F ... is
+               --       pragma SPARK_Mode;
+
+               --    package body P is
+               --       pragma SPARK_Mode;
+
+               elsif Nkind_In (Context, N_Package_Body,
+                                        N_Subprogram_Body)
                then
                   Spec_Id := Corresponding_Spec (Context);
 
@@ -16650,14 +16691,12 @@ package body Sem_Prag is
                   Chain_Pragma (Body_Id, N);
                   Check_Conformance (Spec_Id, Body_Id);
 
-               --  The pragma is at the top level of a package spec
-
-               elsif Nkind (Context) = N_Package_Specification then
-                  Spec_Id := Defining_Unit_Name (Context);
-                  Chain_Pragma (Spec_Id, N);
-
                --  The pragma applies to the statements of a package body
 
+               --    package body P is
+               --    begin
+               --       pragma SPARK_Mode;
+
                elsif Nkind (Context) = N_Handled_Sequence_Of_Statements
                  and then Nkind (Parent (Context)) = N_Package_Body
                then
index 78ab2c19434f60d6673cb0cb3702331614a3521f..5af10be736e7d129e1204e0d796c027b70cdf2a4 100644 (file)
@@ -4775,7 +4775,8 @@ package Sinfo is
       --  and put in its proper section when we know exactly where that is!
 
       --  EXPRESSION_FUNCTION ::=
-      --    FUNCTION SPECIFICATION IS (EXPRESSION);
+      --    FUNCTION SPECIFICATION IS (EXPRESSION)
+      --      [ASPECT_SPECIFICATIONS];
 
       --  N_Expression_Function
       --  Sloc points to FUNCTION
@@ -5010,7 +5011,8 @@ package Sinfo is
 
       --  PRIVATE_TYPE_DECLARATION ::=
       --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART]
-      --      is [[abstract] tagged] [limited] private;
+      --      is [[abstract] tagged] [limited] private
+      --        [ASPECT_SPECIFICATIONS];
 
       --  Note: TAGGED is not permitted in Ada 83 mode
 
@@ -5032,7 +5034,7 @@ package Sinfo is
       --    type DEFINING_IDENTIFIER [DISCRIMINANT_PART] is
       --      [abstract] [limited | synchronized]
       --        new ancestor_SUBTYPE_INDICATION [and INTERFACE_LIST]
-      --           with private;
+      --           with private [ASPECT_SPECIFICATIONS];
 
       --  Note: LIMITED, and private extension declarations are not allowed
       --        in Ada 83 mode.
@@ -5102,9 +5104,11 @@ package Sinfo is
 
       --  OBJECT_RENAMING_DECLARATION ::=
       --    DEFINING_IDENTIFIER :
-      --      [NULL_EXCLUSION] SUBTYPE_MARK renames object_NAME;
+      --      [NULL_EXCLUSION] SUBTYPE_MARK renames object_NAME
+      --        [ASPECT_SPECIFICATIONS];
       --  | DEFINING_IDENTIFIER :
-      --      ACCESS_DEFINITION renames object_NAME;
+      --      ACCESS_DEFINITION renames object_NAME
+      --        [ASPECT_SPECIFICATIONS];
 
       --  Note: Access_Definition is an optional field that gives support to
       --  Ada 2005 (AI-230). The parser generates nodes that have either the
@@ -5124,7 +5128,8 @@ package Sinfo is
       -----------------------------------------
 
       --  EXCEPTION_RENAMING_DECLARATION ::=
-      --    DEFINING_IDENTIFIER : exception renames exception_NAME;
+      --    DEFINING_IDENTIFIER : exception renames exception_NAME
+      --      [ASPECT_SPECIFICATIONS];
 
       --  N_Exception_Renaming_Declaration
       --  Sloc points to first identifier
@@ -5136,7 +5141,8 @@ package Sinfo is
       ---------------------------------------
 
       --  PACKAGE_RENAMING_DECLARATION ::=
-      --    package DEFINING_PROGRAM_UNIT_NAME renames package_NAME;
+      --    package DEFINING_PROGRAM_UNIT_NAME renames package_NAME
+      --      [ASPECT_SPECIFICATIONS];
 
       --  N_Package_Renaming_Declaration
       --  Sloc points to PACKAGE
@@ -5149,7 +5155,8 @@ package Sinfo is
       ------------------------------------------
 
       --  SUBPROGRAM_RENAMING_DECLARATION ::=
-      --    SUBPROGRAM_SPECIFICATION renames callable_entity_NAME;
+      --    SUBPROGRAM_SPECIFICATION renames callable_entity_NAME
+      --      [ASPECT_SPECIFICATIONS];
 
       --  N_Subprogram_Renaming_Declaration
       --  Sloc points to RENAMES
@@ -5167,10 +5174,13 @@ package Sinfo is
       --  GENERIC_RENAMING_DECLARATION ::=
       --    generic package DEFINING_PROGRAM_UNIT_NAME
       --      renames generic_package_NAME
+      --        [ASPECT_SPECIFICATIONS];
       --  | generic procedure DEFINING_PROGRAM_UNIT_NAME
       --      renames generic_procedure_NAME
+      --        [ASPECT_SPECIFICATIONS];
       --  | generic function DEFINING_PROGRAM_UNIT_NAME
       --      renames generic_function_NAME
+      --        [ASPECT_SPECIFICATIONS];
 
       --  N_Generic_Package_Renaming_Declaration
       --  Sloc points to GENERIC
@@ -5384,7 +5394,8 @@ package Sinfo is
       --  ENTRY_DECLARATION ::=
       --    [[not] overriding]
       --    entry DEFINING_IDENTIFIER
-      --      [(DISCRETE_SUBTYPE_DEFINITION)] PARAMETER_PROFILE;
+      --      [(DISCRETE_SUBTYPE_DEFINITION)] PARAMETER_PROFILE
+      --        [ASPECT_SPECIFICATIONS];
 
       --  N_Entry_Declaration
       --  Sloc points to ENTRY
@@ -5985,7 +5996,8 @@ package Sinfo is
       ----------------------------------
 
       --  SUBPROGRAM_BODY_STUB ::=
-      --    SUBPROGRAM_SPECIFICATION is separate;
+      --    SUBPROGRAM_SPECIFICATION is separate
+      --      [ASPECT_SPECIFICATION];
 
       --  N_Subprogram_Body_Stub
       --  Sloc points to FUNCTION or PROCEDURE
@@ -5998,7 +6010,8 @@ package Sinfo is
       -------------------------------
 
       --  PACKAGE_BODY_STUB ::=
-      --    package body DEFINING_IDENTIFIER is separate;
+      --    package body DEFINING_IDENTIFIER is separate
+      --      [ASPECT_SPECIFICATION];
 
       --  N_Package_Body_Stub
       --  Sloc points to PACKAGE
@@ -6011,7 +6024,8 @@ package Sinfo is
       ----------------------------
 
       --  TASK_BODY_STUB ::=
-      --    task body DEFINING_IDENTIFIER is separate;
+      --    task body DEFINING_IDENTIFIER is separate
+      --      [ASPECT_SPECIFICATION];
 
       --  N_Task_Body_Stub
       --  Sloc points to TASK
@@ -6024,7 +6038,8 @@ package Sinfo is
       ---------------------------------
 
       --  PROTECTED_BODY_STUB ::=
-      --    protected body DEFINING_IDENTIFIER is separate;
+      --    protected body DEFINING_IDENTIFIER is separate
+      --      [ASPECT_SPECIFICATION];
 
       --  Note: protected body stubs are not allowed in Ada 83 mode
 
@@ -6225,7 +6240,8 @@ package Sinfo is
       ------------------------------------------
 
       --  GENERIC_SUBPROGRAM_DECLARATION ::=
-      --    GENERIC_FORMAL_PART SUBPROGRAM_SPECIFICATION;
+      --    GENERIC_FORMAL_PART SUBPROGRAM_SPECIFICATION
+      --      [ASPECT_SPECIFICATIONS];
 
       --  Note: Generic_Formal_Declarations can include pragmas
 
index 0fc6bdb2188c0280b113af32b7757fcc80b44497..cd647da818cb33bc230707dc25b59dcc43d5751d 100644 (file)
@@ -310,6 +310,13 @@ package body Switch.C is
                     ("-gnatc must be first if combined with other switches");
                end if;
 
+               --  Not allowed if previous -gnatR given
+
+               if List_Representation_Info /= 0 then
+                  Osint.Fail
+                    ("-gnatc not allowed since -gnatR given previously");
+               end if;
+
                Ptr := Ptr + 1;
                Operating_Mode := Check_Semantics;
 
@@ -1013,6 +1020,14 @@ package body Switch.C is
                     ("-gnatR not permitted since -gnatD given previously");
                end if;
 
+               --  Not allowed if previous -gnatc was given, since we must
+               --  call the code generator to determine rep information.
+
+               if Operating_Mode = Check_Semantics then
+                  Osint.Fail
+                    ("-gnatR not permitted since -gnatc given previously");
+               end if;
+
                --  Set to annotate rep info, and set default -gnatR mode
 
                Back_Annotate_Rep_Info := True;