In ihe context of a generic package declaration, a private with-clause on a
child unit implies that the implicit with clauses on its parents are private
as well. Previous to this patch, GNAT applied this rule applied only to non-
eneric units.
Compiling the following must be rejected with:
gp1.ads:4:23: "Ada" is not visible
gp1.ads:4:23: non-visible declaration at ada.ads:16
---
private with Ada.Containers.Vectors; -- NB: private with
generic
type T1 is tagged private;
Default_Capacity : Ada.Containers.Count_Type := 2;
-- What allows 'Ada.Containers.Count_Type' to be visible?
package GP1 is
type T2 is tagged limited private;
private
package T1_Vectors is
new Ada.Containers.Vectors (Natural, T1);
type T2 is tagged limited record
Capacity : Ada.Containers.Count_Type := Default_Capacity;
V : T1_Vectors.Vector;
end record;
end GP1;
Tested on x86_64-pc-linux-gnu, committed on trunk
2012-05-15 Ed Schonberg <[email protected]>
* sem_ch10.adb (Expand_With_Clause): In the context of a generic
package declaration, a private with-clause on a child unit implies
that the implicit with clauses on its parents are private as well.
Index: sem_ch10.adb
===================================================================
--- sem_ch10.adb (revision 187522)
+++ sem_ch10.adb (working copy)
@@ -2987,10 +2987,13 @@
Set_First_Name (Withn, True);
Set_Implicit_With (Withn, True);
- -- If the unit is a package declaration, a private_with_clause on a
- -- child unit implies the implicit with on the parent is also private.
+ -- If the unit is a package or generic package declaration, a private_
+ -- with_clause on a child unit implies that the implicit with on the
+ -- parent is also private.
- if Nkind (Unit (N)) = N_Package_Declaration then
+ if Nkind_In
+ (Unit (N), N_Package_Declaration, N_Generic_Package_Declaration)
+ then
Set_Private_Present (Withn, Private_Present (Item));
end if;