jjc@UUNET.UU.NET (James Clark) (03/21/89)
G++ generates incorrect output from the following program. It
generates correct output if the order of declarations in `struct node'
is reversed.
Script started on Tue Mar 21 12:55:23 1989
jclark% cat bug.c
#include <stdio.h>
struct node {
void foo();
virtual void foo(int);
};
struct dnode : public node {
void foo(int);
};
main()
{
node *n = new dnode;
n->foo();
}
void node::foo()
{
foo(1);
}
void node::foo(int n)
{
puts("node::foo(int)");
}
void dnode::foo(int n)
{
puts("dnode::foo(int)");
}
jclark% g++ -v bug.c
g++ version 1.34.1
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ bug.c /tmp/cca04659.cpp
GNU CPP version 1.34
/usr/local/lib/gcc-c++ /tmp/cca04659.cpp -quiet -dumpbase bug.c -version -o /tmp/cca04659.s
GNU C++ version 1.34.1 (sparc) compiled by GNU C version 1.34.
as /tmp/cca04659.s -o bug.o
/usr/local/lib/gcc-ld++ -C -e start -dc -dp /usr/local/lib/crt0+.o bug.o -lg++ /usr/local/lib/gcc-gnulib -lc
jclark% a.out
node::foo(int)
jclark% cat bug.c
#include <stdio.h>
struct node {
virtual void foo(int);
void foo();
};
struct dnode : public node {
void foo(int);
};
main()
{
node *n = new dnode;
n->foo();
}
void node::foo()
{
foo(1);
}
void node::foo(int n)
{
puts("node::foo(int)");
}
void dnode::foo(int n)
{
puts("dnode::foo(int)");
}
jclark% g++ -v bug.c
g++ version 1.34.1
/usr/local/lib/gcc-cpp -+ -v -undef -D__GNU__ -D__GNUG__ -Dsparc -Dsun -Dunix -D__sparc__ -D__sun__ -D__unix__ bug.c /tmp/cca04666.cpp
GNU CPP version 1.34
/usr/local/lib/gcc-c++ /tmp/cca04666.cpp -quiet -dumpbase bug.c -version -o /tmp/cca04666.s
GNU C++ version 1.34.1 (sparc) compiled by GNU C version 1.34.
as /tmp/cca04666.s -o bug.o
/usr/local/lib/gcc-ld++ -C -e start -dc -dp /usr/local/lib/crt0+.o bug.o -lg++ /usr/local/lib/gcc-gnulib -lc
jclark% a.out
dnode::foo(int)
jclark% exit
jclark%
script done on Tue Mar 21 12:56:12 1989