Patchwork [Ada] Private with-clauses in the context of generic package declarations

login
register
mail settings
Submitter Arnaud Charlet
Date May 15, 2012, 11:07 a.m.
Message ID <20120515110743.GA2125@adacore.com>
Download mbox | patch
Permalink /patch/159291/
State New
Headers show

Comments

Arnaud Charlet - May 15, 2012, 11:07 a.m.
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  <schonberg@adacore.com>

	* 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.

Patch

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;