Internal compiler error / -fno-implicit-templates bug
Carlo Wood
carlo@runaway.xs4all.nl
Fri Aug 7 20:14:00 GMT 1998
The follow code snippet:
struct V { virtual ~V() {} };
template struct A : virtual V { };
template struct B {
virtual void f() { T foo; }
};
int main() { B< A > bar; }
causes an interal compiler error:
~/tmp>g++ -v foo.cc
Reading specs from /usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/specs
gcc version egcs-2.91.52 19980731 (gcc2 ss-980609 experimental)
/usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/cpp -lang-c++ -v -undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus -D__GNUC_MINOR__=91 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -Asystem(unix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di686 -Dpentiumpro -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__ foo.cc /tmp/ccvPiuXS.ii
GNU CPP version egcs-2.91.52 19980731 (gcc2 ss-980609 experimental) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/local/egcs-cvs/include/g++
/usr/local/include
/usr/local/egcs-cvs/i686-pc-linux-gnu/include
/usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/include
/usr/include
End of search list.
/usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/cc1plus /tmp/ccvPiuXS.ii -quiet -dumpbase foo.cc -version -o /tmp/ccCTj0uF.s
GNU C++ version egcs-2.91.52 19980731 (gcc2 ss-980609 experimental) (i686-pc-linux-gnu) compiled by GNU C version egcs-2.91.52 19980731 (gcc2 ss-980609 experimental).
foo.cc:2: Internal compiler error.
foo.cc:2: Please submit a full bug report to `egcs-bugs@cygnus.com'.
----------------------------------------------------------------------------------
(This was also reported before to egcs):
The following code snippet:
class V {
public:
virtual void v(void) { }
};
template <class T1, class T2>
class A : virtual public V {
typedef A<T2, T1> reversed_t;
};
template <class T>
class B {
public:
virtual void f(void)
{
typename T::reversed_t foo;
}
};
class C { };
class D { };
int main(void)
{
B<A<C, D> > bar;
return 0;
}
causes egcs not to generate a virtual table when using -fno-implicit-templates:
>g++ -v -fno-implicit-templates virtual2.C
Reading specs from /usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/specs
gcc version egcs-2.91.52 19980731 (gcc2 ss-980609 experimental)
/usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/cpp -lang-c++ -v -undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus -D__GNUC_MINOR__=91 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -Asystem(unix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di686 -Dpentiumpro -D__i686 -D__i686__ -D__pentiumpro -D__pentiumpro__ virtual2.C /tmp/ccvOqgA8.ii
GNU CPP version egcs-2.91.52 19980731 (gcc2 ss-980609 experimental) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/local/egcs-cvs/include/g++
/usr/local/include
/usr/local/egcs-cvs/i686-pc-linux-gnu/include
/usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/include
/usr/include
End of search list.
/usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/cc1plus /tmp/ccvOqgA8.ii -quiet -dumpbase virtual2.cc -version -fno-implicit-templates -o /tmp/ccKFXcJb.s
GNU C++ version egcs-2.91.52 19980731 (gcc2 ss-980609 experimental) (i686-pc-linux-gnu) compiled by GNU C version egcs-2.91.52 19980731 (gcc2 ss-980609 experimental).
as -V -Qy -o /tmp/ccRgcHii.o /tmp/ccKFXcJb.s
GNU assembler version 2.9.1 (i686-pc-linux-gnu), using BFD version 2.9.1.0.6
/usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o /usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/crtbegin.o -L/usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52 -L/usr/local/egcs-cvs/i686-pc-linux-gnu/lib -L/usr/local/egcs-cvs/lib /tmp/ccRgcHii.o -lstdc++ -lm -lgcc -lc -lgcc /usr/local/egcs-cvs/lib/gcc-lib/i686-pc-linux-gnu/egcs-2.91.52/crtend.o /usr/lib/crtn.o
/tmp/ccRgcHii.o: In function `B<A<C, D> >::B(void)':
/tmp/ccRgcHii.o(.B<A<C, D> >::gnu.linkonce.t.(void)+0x8): undefined reference to `B<A<C, D> > virtual table'
collect2: ld returned 1 exit status
--
Carlo Wood <carlo@runaway.xs4all.nl>
More information about the Gcc-bugs
mailing list