diff mbox series

[Ada] Spurious visibility error on aspect in generic unit

Message ID 20180522133844.GA120633@adacore.com
State New
Headers show
Series [Ada] Spurious visibility error on aspect in generic unit | expand

Commit Message

Pierre-Marie de Rodat May 22, 2018, 1:38 p.m. UTC
This patch fixes a spurious visiblity error on an instantiation of a generic
package that contains a type declaration with an aspect specification for
an aspect that must be delayed (i.e. an aspect whose value may be specified
at a later point).

The package g.ads must compile quietly:

----
with S;
generic
package G
is
   type Buffer_Type is record
      Data       : Integer;
   end record;

   package Buffer is new S (Buffer_Type => Buffer_Type);
end G;
----
generic
   type Buffer_Type is private;
package S
is
   Page_Size : constant := 4096;

   type Reader_Type is limited record
      Data   : Buffer_Type;
   end record
     with
        Alignment => Page_Size; -- Using a constant does not work
--      Alignment => 4096;      -- Using a number works

-- for Reader_Type'Alignment use Page_Size; -- so does an attribute.
   pragma Compile_Time_Error (Reader_Type'Size /= 12345, "Ooops");
   -- Note: We set 'Alignment and check for 'Size.
end S;

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

2018-05-22  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* freeze.adb (Freeze_Entity): When analyzing delayed aspects of an
	entity E within a generic unit, indicate that there are no remaining
	delayed aspects after invoking Analyze_Aspects_At_Freeze_Point. The
	entity E is not frozen yet but the aspects should not be reanalyzed at
	the freeze point, which may be outside of the generic and may not have
	the proper visibility.
diff mbox series

Patch

--- gcc/ada/freeze.adb
+++ gcc/ada/freeze.adb
@@ -5167,11 +5167,14 @@  package body Freeze is
       --  be frozen in the proper scope after the current generic is analyzed.
       --  However, aspects must be analyzed because they may be queried later
       --  within the generic itself, and the corresponding pragma or attribute
-      --  definition has not been analyzed yet.
+      --  definition has not been analyzed yet. After this, indicate that the
+      --  entity has no further delayed aspects, to prevent a later aspect
+      --  analysis out of the scope of the generic.
 
       elsif Inside_A_Generic and then External_Ref_In_Generic (Test_E) then
          if Has_Delayed_Aspects (E) then
             Analyze_Aspects_At_Freeze_Point (E);
+            Set_Has_Delayed_Aspects (E, False);
          end if;
 
          Result := No_List;