[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.
This commit is contained in:
Eric Botcazou 2020-04-28 22:19:17 +02:00 committed by Pierre-Marie de Rodat
parent 4b58985f6c
commit 6c89a5815a

View File

@ -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));