Patchwork [Ada] Analysis of delayed aspects for components in record types

login
register
mail settings
Submitter Arnaud Charlet
Date July 9, 2012, 10:46 a.m.
Message ID <20120709104631.GA31529@adacore.com>
Download mbox | patch
Permalink /patch/169772/
State New
Headers show

Comments

Arnaud Charlet - July 9, 2012, 10:46 a.m.
The following test illustrates the exemple of an aspect Atomic that applies to
a component of a record type.

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

procedure Cutdown is
   type Rec is record
      Comp  : aliased Integer;
      Acomp : aliased Integer with Atomic => Atom;
   end record;

   Atomic_Int : aliased Integer with Atomic => True;
   Atom       : constant Boolean := True;
   Rec_Var    : Rec;

   type Ref is access all Integer;

   Comp_Ptr  : Ref := Rec_Var.Comp'Access;  -- legal
   Acomp_Ptr : Ref := Rec_Var.Acomp'Access; -- illegal
   Obj_Ptr   : Ref := Atomic_Int'Access;    -- illegal

begin
   null;
end Cutdown;

-----------------
-- Compilation --
-----------------

gnatmake -q -gnat12 cutdown.adb

------------
-- Output --
------------

cutdown.adb:14:23: access to atomic object cannot yield access-to-non-atomic type
cutdown.adb:15:23: access to atomic object cannot yield access-to-non-atomic type
gnatmake: "cutdown.adb" compilation error  

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

2012-07-09  Vincent Pucci  <pucci@adacore.com>

	* freeze.adb (Freeze_Record_Type): Analyze the delayed aspects of the
	components in a record type.

Patch

Index: freeze.adb
===================================================================
--- freeze.adb	(revision 189367)
+++ freeze.adb	(working copy)
@@ -1906,9 +1906,35 @@ 
          Comp := First_Entity (Rec);
          Prev := Empty;
          while Present (Comp) loop
+            --  Deal with delayed aspect specifications for components. The
+            --  analysis of the aspect is required to be delayed to the freeze
+            --  point, thus we analyze the pragma or attribute definition
+            --  clause in the tree at this point. We also analyze the aspect
+            --  specification node at the freeze point when the aspect doesn't
+            --  correspond to pragma/attribute definition clause.
 
-            --  First handle the component case
+            if Ekind (Comp) = E_Component
+               and then Has_Delayed_Aspects (Comp)
+            then
+               Push_Scope (Rec);
 
+               --  The visibility to the discriminants must be restored in
+               --  order to properly analyze the aspects.
+
+               if Has_Discriminants (Rec) then
+                  Install_Discriminants (Rec);
+                  Analyze_Aspects_At_Freeze_Point (Comp);
+                  Uninstall_Discriminants (Rec);
+
+               else
+                  Analyze_Aspects_At_Freeze_Point (Comp);
+               end if;
+
+               Pop_Scope;
+            end if;
+
+            --  Handle the component and discriminant case
+
             if Ekind (Comp) = E_Component
               or else Ekind (Comp) = E_Discriminant
             then