[Ada] Spurious visibility error on formal package with Abstract_State
authorEd Schonberg <schonberg@adacore.com>
Thu, 10 Oct 2019 15:25:03 +0000 (15:25 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 10 Oct 2019 15:25:03 +0000 (15:25 +0000)
2019-10-10  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* sem_ch12.adb (Analyze_Formal_Package_Declaration): Propagate
an aspect specification for Abstract_State from generic package
to formal package, so that it is available when analyzing the
constructed formal.

From-SVN: r276829

gcc/ada/ChangeLog
gcc/ada/sem_ch12.adb

index 449c0ab..c5e3f82 100644 (file)
@@ -1,5 +1,6 @@
-2019-10-10  Eric Botcazou  <ebotcazou@adacore.com>
+2019-10-10  Ed Schonberg  <schonberg@adacore.com>
 
-       * sem_ch6.adb (Set_Actual_Subtypes): Put the freeze node of the
-       actual subtype after its declaration when the type of the formal
-       has a predicate.
\ No newline at end of file
+       * sem_ch12.adb (Analyze_Formal_Package_Declaration): Propagate
+       an aspect specification for Abstract_State from generic package
+       to formal package, so that it is available when analyzing the
+       constructed formal.
\ No newline at end of file
index 4e74f9a..d9fa255 100644 (file)
@@ -2925,6 +2925,41 @@ package body Sem_Ch12 is
       Set_Ekind  (Formal, E_Package);
       Set_Etype  (Formal, Standard_Void_Type);
       Set_Inner_Instances (Formal, New_Elmt_List);
+
+      --  It is unclear that any aspects can apply to a formal package
+      --  declaration, given that they look like a hidden comformance
+      --  requirement on the corresponding actual. However, Abstract_State
+      --  must be treated specially because it generates declarations that
+      --  must appear before other declarations in the specification and
+      --  must be analyzed at once.
+
+      if Present (Aspect_Specifications (Gen_Decl)) then
+         if No (Aspect_Specifications (N)) then
+            Set_Aspect_Specifications (N, New_List);
+            Set_Has_Aspects (N);
+         end if;
+
+         declare
+            ASN   : Node_Id := First (Aspect_Specifications (Gen_Decl));
+            New_A : Node_Id;
+
+         begin
+            while Present (ASN) loop
+               if Get_Aspect_Id (ASN) = Aspect_Abstract_State then
+                  New_A :=
+                    Copy_Generic_Node (ASN, Empty, Instantiating => True);
+                  Set_Entity (New_A, Formal);
+                  Set_Analyzed (New_A, False);
+                  Append (New_A, Aspect_Specifications (N));
+                  Analyze_Aspect_Specifications (N, Formal);
+                  exit;
+               end if;
+
+               Next (ASN);
+            end loop;
+         end;
+      end if;
+
       Push_Scope  (Formal);
 
       --  Manually set the SPARK_Mode from the context because the package
@@ -3023,6 +3058,9 @@ package body Sem_Ch12 is
 
    <<Leave>>
       if Has_Aspects (N) then
+         --  Unclear that any other aspects may appear here, snalyze them
+         --  for completion, given that the grammar allows their appearance.
+
          Analyze_Aspect_Specifications (N, Pack_Id);
       end if;