[Ada] Spurious visibility error on aspect in generic unit
authorEd Schonberg <schonberg@adacore.com>
Tue, 22 May 2018 13:22:58 +0000 (13:22 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 22 May 2018 13:22:58 +0000 (13:22 +0000)
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;

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.

From-SVN: r260516

gcc/ada/ChangeLog
gcc/ada/freeze.adb

index ad654795435ff80731d2ce5333cad433536b25e2..378ccad0a6c6933c0b29c55d0af91d01f4635e62 100644 (file)
@@ -1,3 +1,12 @@
+2018-05-22  Ed Schonberg  <schonberg@adacore.com>
+
+       * 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.
+
 2018-05-22  Bob Duff  <duff@adacore.com>
 
        * doc/gnat_ugn/gnat_utility_programs.rst: Add documentation for
index da77818694cced45b46dd332cd9cf211008873fa..66f9dcca62cecaa066bef46980a14ee02dde279a 100644 (file)
@@ -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;