Short: bug in virtual inheritance...
Date: Tue, 11 Apr 2000 06:43:47 -0500
From: Casey Zacek <cz@800hosting.com>
Type: Bug
State: Done - fixed in 3.2.8-dev.186
See also: b-000207-4


Problem was that the compiler used the first inherited function it
could find. With normal inherits this is the topmost one, with virtual
inherits this is not guaranteed.


Description:
/* a.c --------------------------------------------------------- */
inherit "b.c";

func1() {
   write("a::func1 1 ---------------------------------------\n");
   ::func1();
   write("a::func1 2 ---------------------------------------\n");
}
/* ------------------------------------------------------------- */

/* b.c --------------------------------------------------------- */
virtual inherit "c.c";

func1() {
   write("b::func1 1 ---------------------------------------\n");
   ::func1();
   write("b::func1 2 ---------------------------------------\n");
}
/* ------------------------------------------------------------- */

/* c.c --------------------------------------------------------- */
int var;

create() {
   write("c::create 1 ++++++++++++++++++++++++++++++++++++++\n");
   func1();
   write("c::create 2 ++++++++++++++++++++++++++++++++++++++\n");
}

func1() {
   write("c::func1 -----------------------------------------\n");
}
/* ------------------------------------------------------------- */

If the "int var;" line doesn't exist in c.c, and a.c is loaded (after
c.c and b.c to spare you spurious output), it looks like this:

c::create 1 ++++++++++++++++++++++++++++++++++++++
a::func1 1 ---------------------------------------
b::func1 1 ---------------------------------------
c::func1 -----------------------------------------
b::func1 2 ---------------------------------------
a::func1 2 ---------------------------------------
c::create 2 ++++++++++++++++++++++++++++++++++++++

However, if it is there, it looks like this:

c::create 1 ++++++++++++++++++++++++++++++++++++++
a::func1 1 ---------------------------------------
c::func1 -----------------------------------------
a::func1 2 ---------------------------------------
c::create 2 ++++++++++++++++++++++++++++++++++++++

func1() doesn't get called in b.c!

I haven't tried to track it down at the driver level yet, and I don't
know where I'd start with it, but it took us a long time to get down
to this much LPC.  Enjoy! :)

-- 
-- Casey Zacek
   Senior Staff Engineer
   1-800-Hosting.com

