Patchwork [Ada] Aspect Abstract_State and nested packages

login
register
mail settings
Submitter Arnaud Charlet
Date April 12, 2013, 12:55 p.m.
Message ID <20130412125542.GA15257@adacore.com>
Download mbox | patch
Permalink /patch/236081/
State New
Headers show

Comments

Arnaud Charlet - April 12, 2013, 12:55 p.m.
This patch corrects the insertion of the corresponding pragma for aspect
Abstract_State when the related construct is a nested package. The pragma
appears in the visible declarations of the package.

------------
-- Source --
------------

--  pack.ads

package Pack with Abstract_State => Pack_State is
   Pack_Var : Integer;

   package Nested with Abstract_State => Nested_State is
      Nested_Var : Integer;
   end Nested;
end Pack;

----------------------------
-- Compilation and output --
----------------------------

$ gcc -c -gnat12 -gnatd.V -gnatdg pack.ads
Source recreated from tree for Pack (spec)
------------------------------------------

pack_E : short_integer := 0;

package pack with abstract_state => pack_state is
   pragma abstract_state (pack_state);
   pack__pack_var : integer;

   package pack__nested with abstract_state => nested_state is
      pragma abstract_state (nested_state);
      pack__nested__nested_var : integer;
   end pack__nested;
end pack;

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

2013-04-12  Hristian Kirtchev  <kirtchev@adacore.com>

	* sem_ch13.adb (Analyze_Aspect_Specifications):
	Insert the corresponding pragma for aspect Abstract_State at
	the top of the visible declarations of the related package.
	Previously this was only done when the package is a compilation
	unit.

Patch

Index: sem_ch13.adb
===================================================================
--- sem_ch13.adb	(revision 197900)
+++ sem_ch13.adb	(working copy)
@@ -1968,12 +1968,27 @@ 
                end if;
             end if;
 
+            --  Aspect Abstract_State introduces implicit declarations for all
+            --  state abstraction entities it defines. To emulate this behavior
+            --  insert the pragma at the start of the visible declarations of
+            --  the related package.
+
+            if Nam = Name_Abstract_State
+              and then Nkind (N) = N_Package_Declaration
+            then
+               if No (Visible_Declarations (Specification (N))) then
+                  Set_Visible_Declarations (Specification (N), New_List);
+               end if;
+
+               Prepend (Aitem, Visible_Declarations (Specification (N)));
+               goto Continue;
+
             --  In the context of a compilation unit, we directly put the
             --  pragma in the Pragmas_After list of the
             --  N_Compilation_Unit_Aux node (no delay is required here)
             --  except for aspects on a subprogram body (see below).
 
-            if Nkind (Parent (N)) = N_Compilation_Unit
+            elsif Nkind (Parent (N)) = N_Compilation_Unit
               and then (Present (Aitem) or else Is_Boolean_Aspect (Aspect))
             then
                declare
@@ -2014,20 +2029,6 @@ 
 
                      Prepend (Aitem, Declarations (N));
 
-                  --  Aspect Abstract_State produces implicit declarations for
-                  --  all state abstraction entities it defines. To emulate
-                  --  this behavior, insert the pragma at the start of the
-                  --  visible declarations of the related package.
-
-                  elsif Nam = Name_Abstract_State
-                    and then Nkind (N) = N_Package_Declaration
-                  then
-                     if No (Visible_Declarations (Specification (N))) then
-                        Set_Visible_Declarations (Specification (N), New_List);
-                     end if;
-
-                     Prepend (Aitem, Visible_Declarations (Specification (N)));
-
                   else
                      if No (Pragmas_After (Aux)) then
                         Set_Pragmas_After (Aux, New_List);