gcc C++ optimizer problem

David Garfield x1688 garfield@verdi.iisd.sra.com
Fri Jun 23 10:45:00 GMT 2000


I appear to have found a bug in the optimizer.  The body of function B1::fn 
disappears when optimized.


+ cat a.cpp
class A {
    class B {
      public:
	virtual int fn(void) = 0;
    };
  public:
    A(int);
    B *b;
    int use(void);
};
A::A(int) 
{
    class B1 : public B {
	int fn(void) { return 3; }
    };
    b = new B1;
}
int A::use(void)
{
    return b->fn();
}

int main(int, char**){}



+ gcc -v
Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/specs
gcc version 2.95.2 19991024 (release)
+ gcc -v -o a -O1 a.cpp
Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/specs
gcc version 2.95.2 19991024 (release)
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/cpp -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -D__OPTIMIZE__ -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di586 -Dpentium -D__i586 -D__i586__ -D__pentium -D__pentium__ a.cpp /tmp/ccJEI69n.ii
GNU CPP version 2.95.2 19991024 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/../../../../include/g++-3
 /usr/local/include
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/../../../../i586-mandrake-linux/include
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/include
 /usr/include
End of search list.
The following default directories have been omitted from the search path:
End of omitted list.
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/cc1plus /tmp/ccJEI69n.ii -quiet -dumpbase a.cc -O1 -version -o /tmp/cccaPBhD.s
GNU C++ version 2.95.2 19991024 (release) (i586-mandrake-linux) compiled by GNU C version 2.95.2 19991024 (release).
 as -V -Qy -o /tmp/ccx1GOKS.o /tmp/cccaPBhD.s
GNU assembler version 2.9.5 (i686-pc-linux-gnu) using BFD version 2.9.5.0.16
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/crtbegin.o -L/users/garfield/lib -L/usr/local/lib -L/usr/X11R6/lib -L/usr/lib/X11 -L/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2 -L/usr/i586-mandrake-linux/lib /tmp/ccx1GOKS.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/crtend.o /usr/lib/crtn.o
/tmp/ccx1GOKS.o(.gnu.linkonce.d.__vt_Q31A7__1Ai.0_2B1+0x8): undefined reference to `fn__Q31A7__1Ai.0_2B1.3'
collect2: ld returned 1 exit status
+ gcc -v -o a -O0 a.cpp
Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/specs
gcc version 2.95.2 19991024 (release)
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/cpp -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di586 -Dpentium -D__i586 -D__i586__ -D__pentium -D__pentium__ a.cpp /tmp/cclAGgXy.ii
GNU CPP version 2.95.2 19991024 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/../../../../include/g++-3
 /usr/local/include
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/../../../../i586-mandrake-linux/include
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/include
 /usr/include
End of search list.
The following default directories have been omitted from the search path:
End of omitted list.
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/cc1plus /tmp/cclAGgXy.ii -quiet -dumpbase a.cc -O0 -version -o /tmp/cc2AHfTY.s
GNU C++ version 2.95.2 19991024 (release) (i586-mandrake-linux) compiled by GNU C version 2.95.2 19991024 (release).
 as -V -Qy -o /tmp/ccPuJNBr.o /tmp/cc2AHfTY.s
GNU assembler version 2.9.5 (i686-pc-linux-gnu) using BFD version 2.9.5.0.16
 /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/crtbegin.o -L/users/garfield/lib -L/usr/local/lib -L/usr/X11R6/lib -L/usr/lib/X11 -L/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2 -L/usr/i586-mandrake-linux/lib /tmp/ccPuJNBr.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/crtend.o /usr/lib/crtn.o


My compiler is the one include in the Mandrake 7.0 x86 distribution.

I have omitted the .ii file because I didn't use any preprocessor features.

This bug also appeared in some older versions on different platforms:
$ gcc -v
Reading specs from /vol/tools/pkg/egcs-1.1.2/lib/gcc-lib/sparc-sun-solaris2.6/egcs-2.91.66/specs
gcc version egcs-2.91.66 19990314 (egcs-1.1.2 release)
$ gcc -O0 a.cpp
$ gcc -O1 a.cpp
Undefined                       first referenced
 symbol                             in file
fn__Q31A7__1Ai.0_2B1.2              /var/tmp/ccSaQ2Jo.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
$ 




More information about the Gcc-bugs mailing list