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