P := Parent (Id);
end if;
+ while Nkind (P) in N_Selected_Component | N_Expanded_Name
+ or else (Nkind (P) = N_Defining_Program_Unit_Name
+ and then Is_Child_Unit (Id))
loop
- if Nkind (P) in N_Selected_Component | N_Expanded_Name
- or else (Nkind (P) = N_Defining_Program_Unit_Name
- and then Is_Child_Unit (Id))
- then
- P := Parent (P);
- else
- return P;
- end if;
+ P := Parent (P);
end loop;
+
+ if Is_Itype (Id)
+ and then Nkind (P) not in
+ N_Full_Type_Declaration | N_Subtype_Declaration
+ then
+ P := Empty;
+ end if;
+
+ return P;
end Declaration_Node;
---------------------
-- a private type, then we obtain the declaration node denoted by the
-- full type, i.e. the full type declaration node. Also note that for
-- subprograms, this returns the {function,procedure}_specification, not
--- the subprogram_declaration.
+-- the subprogram_declaration. If the parent of an Itype is a type or
+-- subtype declaration, we return the declaration node as for any other
+-- type. For other Itypes, we return Empty.
-- Default_Aspect_Component_Value [base type only]
-- Defined in array types. Holds the static value specified in a
Type_Table (T).Last := T;
Add_Concrete_Descendant_To_Ancestors
(Type_Table (T).Parent, T);
+ -- Parent cannot be No_Type here, because T is a concrete
+ -- type, and therefore not a root type.
when Abstract_Type =>
declare