Patchwork [Ada] Decoration of limited-with clauses

login
register
mail settings
Submitter Arnaud Charlet
Date Dec. 5, 2012, 10:13 a.m.
Message ID <20121205101318.GA28359@adacore.com>
Download mbox | patch
Permalink /patch/203817/
State New
Headers show

Comments

Arnaud Charlet - Dec. 5, 2012, 10:13 a.m.
Building the limited view of a package does not perform a semantic analysis of
the package.  Nevertheless the limited-with clause must carry the entity of the
unit, so that warnings on unused with_clauses can be properly supported.

No short reproducer available.

Tested on x86_64-pc-linux-gnu, committed on trunk

2012-12-05  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch10.adb (Build_Limited_Views): Even though the unit is
	not analyzed, place its entity on the name in the with clause,
	so that warnings on unused with-clause are properly supported
	for limited withs.

Patch

Index: sem_ch10.adb
===================================================================
--- sem_ch10.adb	(revision 194188)
+++ sem_ch10.adb	(working copy)
@@ -5716,6 +5716,17 @@ 
             raise Program_Error;
       end case;
 
+      --  The limited unit is not analyzed but the with clause must be
+      --  minimally decorated so that checks on unused with clause also work
+      --  with limited with clauses.
+
+      if Is_Entity_Name (Name (N)) then
+         Set_Entity (Name (N), P);
+
+      elsif Nkind (Name (N)) = N_Selected_Component then
+         Set_Entity (Selector_Name (Name (N)), P);
+      end if;
+
       --  Check if the chain is already built
 
       Spec := Specification (Unit (Library_Unit (N)));
Index: sem_ch3.adb
===================================================================
--- sem_ch3.adb	(revision 194190)
+++ sem_ch3.adb	(working copy)
@@ -6512,23 +6512,27 @@ 
       then
          Append_Elmt (Derived_Type, Private_Dependents (Parent_Type));
 
+         --  Check for unusual case where a type completed by a private
+         --  derivation occurs within a package nested in a child unit, and
+         --  the parent is declared in an ancestor.
+
          if Is_Child_Unit (Scope (Current_Scope))
            and then Is_Completion
            and then In_Private_Part (Current_Scope)
            and then Scope (Parent_Type) /= Current_Scope
+
+           --  Note that if the parent has a completion in the private part,
+           --  (which is itself a derivation from some other private type)
+           --  it is that completion that is visible, there is no full view
+           --  available, and no special processing is needed.
+
            and then Present (Full_View (Parent_Type))
          then
-            --  This is the unusual case where a type completed by a private
-            --  derivation occurs within a package nested in a child unit, and
-            --  the parent is declared in an ancestor. In this case, the full
-            --  view of the parent type will become visible in the body of
-            --  the enclosing child, and only then will the current type be
-            --  possibly non-private. We build a underlying full view that
-            --  will be installed when the enclosing child body is compiled.
-            --  Note that if the parent has a completion in the private part,
-            --  (which is itself a derivation from some other private type)
-            --  it is that completion that is visible, there is no full view
-            --  view available, and no special processing is needed.
+            --  In this case, the full view of the parent type will become
+            --  visible in the body of the enclosing child, and only then will
+            --  the current type be possibly non-private. We build an
+            --  underlying full view that will be installed when the enclosing
+            --  child body is compiled.
 
             Full_Der :=
               Make_Defining_Identifier