-- { dg-do run } procedure Check_Displace_Generation is package Stuff is type Base_1 is interface; function F_1 (X : Base_1) return Integer is abstract; type Base_2 is interface; function F_2 (X : Base_2) return Integer is abstract; type Concrete is new Base_1 and Base_2 with null record; function F_1 (X : Concrete) return Integer; function F_2 (X : Concrete) return Integer; end Stuff; package body Stuff is function F_1 (X : Concrete) return Integer is begin return 1; end F_1; function F_2 (X : Concrete) return Integer is begin return 2; end F_2; end Stuff; use Stuff; function Make_Concrete return Concrete is C : Concrete; begin return C; end Make_Concrete; B_1 : Base_1'Class := Make_Concrete; B_2 : Base_2'Class := Make_Concrete; begin if B_1.F_1 /= 1 then raise Program_Error with "bad B_1.F_1 call"; end if; if B_2.F_2 /= 2 then raise Program_Error with "bad B_2.F_2 call"; end if; end Check_Displace_Generation;