with Ada.Text_IO; procedure A is
package Stuff is type Base_1 is interface; procedure P_1 (X : in Base_1) is abstract; type Base_2 is interface; procedure P_2 (X : in Base_2) is abstract; type Middle is interface and Base_1 and Base_2; type Concrete is new Middle with null record; procedure P_1 (X : in Concrete); procedure P_2 (X : in Concrete); function Make_Concrete return Concrete; end Stuff; package body Stuff is procedure P_1 (X : in Concrete) is begin Ada.Text_IO.Put_Line ("Concrete.P_1"); end P_1; procedure P_2 (X : in Concrete) is begin Ada.Text_IO.Put_Line ("Concrete.P_2"); end P_2; function Make_Concrete return Concrete is C : Concrete; begin return C; end Make_Concrete; end Stuff; use Stuff; B_1 : Base_1'Class := Make_Concrete; B_2 : Base_2'Class := Make_Concrete; begin B_1.P_1; B_2.P_2; end; $ gnatmake a $ ./a Concrete.P_1 Concrete.P_1 $ In other words, both calls dispatched to the same procedure. Some experiments led me to the interesting observation: Changing this: type Middle is interface and Base_1 and Base_2; to this: type Middle is interface and Base_2 and Base_1; results in: $ ./a Concrete.P_2 Concrete.P_2 Again, both calls dispatched to the same procedure, but now I know that in both cases the dispatch goes to the *first* progenitor of the Middle interface. The expected result is: Concrete.P_1 Concrete.P_2 irrespectively of the interface composition order. $ gnatmake --version GNATMAKE 4.4.0 20080314 (experimental) [trunk revision 133226] -- Summary: V-table messed up with interface composition Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: major Priority: P3 Component: ada AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: prog at msobczak dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35791