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