with Layered_Abstraction_P; generic with package P1 is new Layered_Abstraction_P(<>); with package P2 is new Layered_Abstraction_P(T => P1.T, Obj => <>); package Layered_Abstraction is pragma Elaborate_Body; X : P1.T := P2.Obj; -- Both P1.T and P2.Obj are visible because -- they were not specified in the formal package. -- Note that P2.T is not visible since it -- is required to match P1.T use P1; -- to make equality immediately visible Yes : Boolean := P1.Obj2 = P2.Obj2; end Layered_Abstraction;