aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sem_ch7.adb
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2020-04-28 22:19:17 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2020-06-19 04:17:16 -0400
commit6c89a5815ae10e7506cd25a6e55d5ed4774dc199 (patch)
treea19637e7cb63ce34e34638a8f6def54039cb70de /gcc/ada/sem_ch7.adb
parent4b58985f6cc427a53fd72b3eabb2e9c252c2dc58 (diff)
downloadgcc-6c89a5815ae10e7506cd25a6e55d5ed4774dc199.zip
gcc-6c89a5815ae10e7506cd25a6e55d5ed4774dc199.tar.gz
gcc-6c89a5815ae10e7506cd25a6e55d5ed4774dc199.tar.bz2
[Ada] Attempt to hide public entities in nested instance bodies
2020-06-19 Eric Botcazou <ebotcazou@adacore.com> gcc/ada/ * sem_ch7.adb (Hide_Public_Entities): Split handling of objects and subprograms, and do not reject the latter upfront in nested instance specs if there are no referencer subprograms at all. (Analyze_Package_Body_Helper): Also call Hide_Public_Entities on nested generic instances.
Diffstat (limited to 'gcc/ada/sem_ch7.adb')
-rw-r--r--gcc/ada/sem_ch7.adb51
1 files changed, 35 insertions, 16 deletions
diff --git a/gcc/ada/sem_ch7.adb b/gcc/ada/sem_ch7.adb
index 869d014..51a245c 100644
--- a/gcc/ada/sem_ch7.adb
+++ b/gcc/ada/sem_ch7.adb
@@ -462,17 +462,11 @@ package body Sem_Ch7 is
-- Exceptions, objects and renamings do not need to be public
-- if they are not followed by a construct which can reference
- -- and export them. Likewise for subprograms but we work harder
- -- for them to see whether they are referenced on an individual
- -- basis by looking into the table of referenced subprograms.
- -- But we cannot say anything for entities declared in nested
- -- instances because instantiations are not done yet so the
- -- bodies are not visible and could contain references to them.
+ -- and export them.
+
elsif Nkind_In (Decl, N_Exception_Declaration,
N_Object_Declaration,
- N_Object_Renaming_Declaration,
- N_Subprogram_Declaration,
- N_Subprogram_Renaming_Declaration)
+ N_Object_Renaming_Declaration)
then
Decl_Id := Defining_Entity (Decl);
@@ -480,11 +474,32 @@ package body Sem_Ch7 is
and then not Is_Imported (Decl_Id)
and then not Is_Exported (Decl_Id)
and then No (Interface_Name (Decl_Id))
- and then
- ((Nkind (Decl) /= N_Subprogram_Declaration
- and then not Has_Referencer_Of_Non_Subprograms)
- or else (Nkind (Decl) = N_Subprogram_Declaration
- and then not Subprogram_Table.Get (Decl_Id)))
+ and then not Has_Referencer_Of_Non_Subprograms
+ then
+ Set_Is_Public (Decl_Id, False);
+ end if;
+
+ -- Likewise for subprograms and renamings, but we work harder
+ -- for them to see whether they are referenced on an individual
+ -- basis by looking into the table of referenced subprograms.
+
+ elsif Nkind_In (Decl, N_Subprogram_Declaration,
+ N_Subprogram_Renaming_Declaration)
+ then
+ Decl_Id := Defining_Entity (Decl);
+
+ -- We cannot say anything for subprograms declared in nested
+ -- instances because instantiations are not done yet so the
+ -- bodies are not visible and could contain references to
+ -- them, except if we still have no subprograms at all which
+ -- are referenced by an inlined body.
+
+ if (not In_Nested_Instance
+ or else not Subprogram_Table.Get_First)
+ and then not Is_Imported (Decl_Id)
+ and then not Is_Exported (Decl_Id)
+ and then No (Interface_Name (Decl_Id))
+ and then not Subprogram_Table.Get (Decl_Id)
then
Set_Is_Public (Decl_Id, False);
end if;
@@ -1081,9 +1096,13 @@ package body Sem_Ch7 is
-- unit, especially subprograms.
-- This is done only for top-level library packages or child units as
- -- the algorithm does a top-down traversal of the package body.
+ -- the algorithm does a top-down traversal of the package body. This is
+ -- also done for instances because instantiations are still pending by
+ -- the time the enclosing package body is analyzed.
- if (Scope (Spec_Id) = Standard_Standard or else Is_Child_Unit (Spec_Id))
+ if (Scope (Spec_Id) = Standard_Standard
+ or else Is_Child_Unit (Spec_Id)
+ or else Is_Generic_Instance (Spec_Id))
and then not Is_Generic_Unit (Spec_Id)
then
Hide_Public_Entities (Declarations (N));