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