[gnu.g++.bug] Subclassing bug in G++ 1.33

rfrench@ATHENA.MIT.EDU ("Robert S. French") (02/25/89)

There is an odd bug in G++ 1.33 which occurs when a pointer to a
subclass member is passed to a function of the superclass by
reference.  In other words:

class foo {
    int x;
public:
    broken(foo*&);
};

class bar : foo {
    int y;
};

working(foo*&)
{
}

baz()
{
    foo *inst = new foo;
    foo a1;
    bar b1;

    working(&a1);
    working(&b1);
    inst->broken(&a1);
    inst->broken(&b1); // This line will fail
}

The first three calls in baz() will succeed.  The second fails.
Here are the diagnostics:

g++ version 1.33.0
 /mit/gnu/vaxlib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dvax -Dunix -D__vax__ -D__unix__ foo.c /tmp/cc008347.cpp
GNU CPP version 1.33
 /mit/gnu/vaxlib/gcc-c++ /tmp/cc008347.cpp -quiet -dumpbase foo.c -version -o /tmp/cc008347.s
GNU C++ version 1.33.0 (vax) compiled by GNU C version 1.33.
In function baz ():
foo.c:24: bad argument 0 for function `foo::broken (struct foo *&)' (type was struct foo *)

The program works fine if broken is defined as broken(foo*) or
broken(foo&) and baz() is changed accordingly.  The bug only shows
itself when pointers are passed by reference.

(Some code in InterViews 2.4 tickled this bug)

		Rob French