comp.lang.ada
 help / color / mirror / Atom feed
From: "Alex R. Mosteo" <devnull@mailinator.com>
Subject: Re: Compiler bug
Date: Wed, 02 Apr 2008 13:39:23 +0200
Date: 2008-04-02T13:39:23+02:00	[thread overview]
Message-ID: <65h9jcF2f60qgU1@mid.individual.net> (raw)
In-Reply-To: 95883266-bd95-499f-a2dc-59580f2c5089@2g2000hsn.googlegroups.com

Maciej Sobczak wrote:

> Consider a trivial example with composition of interfaces:

My experience with interfaces (even without composition) in gpl-2007 has been
that they're not ready for use. I don't know if gcc-4.4 has advanced in that
front.

For sure if you continue to stress test them you'll find interesting bugs. And
it's great that you're doing so with small test cases. I usually hit these
bugs in large setups and when simplifying things for report they tend to go
away on me.

> 
> 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. Obviously against 3.9.4-1/b.
> 
> Things get particularly funny when the signatures of P_1 and P_2 are
> different (say, they have different sets of parameters).
> 
> It all looks like the v-table got messed up.
> 
> $ gnatmake --version
> GNATMAKE 4.4.0 20080314 (experimental) [trunk revision 133226]
> 
> It is the newest version I could find for my system.
> 
> --
> Maciej Sobczak * www.msobczak.com * www.inspirel.com




  parent reply	other threads:[~2008-04-02 11:39 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-01 11:52 Compiler bug Maciej Sobczak
2008-04-01 13:00 ` Ludovic Brenta
2008-04-01 20:43   ` Maciej Sobczak
2008-04-02 11:39 ` Alex R. Mosteo [this message]
2008-04-02 17:44 ` Per Sandberg
  -- strict thread matches above, loose matches on Subject: below --
2007-12-04 21:58 Compiler Bug REH
2007-12-04 22:25 ` Lucretia
2007-12-04 22:32   ` REH
2007-12-04 22:45     ` Randy Brukardt
2007-12-04 22:49       ` REH
2007-12-04 22:54       ` Adam Beneschan
2007-12-05  9:46         ` Samuel Tardieu
2007-12-05 16:07           ` Adam Beneschan
2007-12-06  3:30             ` Randy Brukardt
2007-12-06  3:30             ` Randy Brukardt
2007-12-04 22:45     ` Randy Brukardt
2007-12-06  6:51     ` Keith Thompson
2007-12-06 16:48       ` REH
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox