]> gcc.gnu.org Git - gcc.git/commitdiff
[Ada] Attempt to hide public entities in nested instance bodies
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 28 Apr 2020 20:19:17 +0000 (22:19 +0200)
committerPierre-Marie de Rodat <derodat@adacore.com>
Fri, 19 Jun 2020 08:17:16 +0000 (04:17 -0400)
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.

gcc/ada/sem_ch7.adb

index 869d014250992be4474b5a0cbb19faa82acd774c..51a245cc2bd9f24b61f387248491777aafb8d38a 100644 (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));
This page took 0.062723 seconds and 5 git commands to generate.