[Ada] Private type unexpectedly visible
authorJavier Miranda <miranda@adacore.com>
Sun, 5 Jul 2020 10:43:30 +0000 (06:43 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Mon, 19 Oct 2020 09:53:35 +0000 (05:53 -0400)
gcc/ada/

* sem_ch7.adb (Uninstall_Declarations): Uninstall the
declaration of a subtype declaration defined in the private part
of a package.

gcc/ada/sem_ch7.adb

index b389464ceefd11bfba2910bcbb1ce8e10d7000e9..04ff071decb96fa26f0de3cb8c78221ac77d1d9e 100644 (file)
@@ -3185,6 +3185,25 @@ package body Sem_Ch7 is
                end loop;
             end;
 
+         --  For subtypes of private types the frontend generates two entities:
+         --  one associated with the partial view and the other associated with
+         --  the full view. When the subtype declaration is public the frontend
+         --  places the former entity in the list of public entities of the
+         --  package and the latter entity in the private part of the package.
+         --  When the subtype declaration is private it generates these two
+         --  entities but both are placed in the private part of the package
+         --  (and the full view has the same source location as the partial
+         --  view and no parent; see Prepare_Private_Subtype_Completion).
+
+         elsif Ekind (Id) in E_Private_Subtype
+                           | E_Limited_Private_Subtype
+           and then Present (Full_View (Id))
+           and then Sloc (Id) = Sloc (Full_View (Id))
+           and then No (Parent (Full_View (Id)))
+         then
+            Set_Is_Hidden (Id);
+            Set_Is_Potentially_Use_Visible (Id, False);
+
          elsif not Is_Child_Unit (Id)
            and then (not Is_Private_Type (Id) or else No (Full_View (Id)))
          then