N : Node_Id;
begin
+ pragma Assert (Is_Package_Or_Generic_Package (E));
+
N := Parent (E);
if Nkind (N) = N_Defining_Program_Unit_Name then
N := Parent (N);
end if;
+ pragma Assert (Nkind (N) = N_Package_Specification);
+
return N;
end Package_Specification;
-- subunit of a generic contains an instance of a child unit of
-- its generic parent unit.
- elsif S = Current_Scope and then Is_Generic_Instance (S) then
+ elsif S = Current_Scope and then Is_Generic_Instance (S)
+ and then (In_Package_Body (S) or else In_Private_Part (S))
+ then
declare
Par : constant Entity_Id :=
Generic_Parent (Package_Specification (S));
begin
if Present (Par)
and then P = Scope (Par)
- and then (In_Package_Body (S) or else In_Private_Part (S))
then
Set_In_Private_Part (P);
Install_Private_Declarations (P);
-- Private or Taft amendment type case
- declare
- Pkg_Decl : Node_Id;
-
- begin
- if Present (S) and then Is_Package_Or_Generic_Package (S) then
- Pkg_Decl := S;
-
- while Nkind (Pkg_Decl) /= N_Package_Specification loop
- Pkg_Decl := Parent (Pkg_Decl);
- end loop;
+ if Present (S) and then Is_Package_Or_Generic_Package (S) then
+ declare
+ Pkg_Decl : constant Node_Id := Package_Specification (S);
+ begin
-- It is knows that Typ has a private view, look for it in the
-- visible declarations of the enclosing scope. A special case
-- of this is when the two views have been exchanged - the full
elsif In_Package_Body (S) then
return Inspect_Decls (Private_Declarations (Pkg_Decl), True);
end if;
- end if;
- end;
+ end;
+ end if;
-- The type has no incomplete or private view