From 55160f6c7c838a2e35895cb741fff5ea237b1260 Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Thu, 10 Oct 2019 15:25:03 +0000 Subject: [PATCH] [Ada] Spurious visibility error on formal package with Abstract_State 2019-10-10 Ed Schonberg 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 | 9 +++++---- gcc/ada/sem_ch12.adb | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 449c0ab8d96..c5e3f820d96 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,6 @@ -2019-10-10 Eric Botcazou +2019-10-10 Ed Schonberg - * 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 diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index 4e74f9a6e9f..d9fa255cc0a 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -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 <> 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; -- 2.30.2