[Bug c++/12229] New: dynamic_cast in templates causes core dump in gcc 3.3.1 but not in gcc 2.95.3
shelly at InterraSystems dot com
gcc-bugzilla@gcc.gnu.org
Wed Sep 10 00:04:00 GMT 2003
PLEASE REPLY TO gcc-bugzilla@gcc.gnu.org ONLY, *NOT* gcc-bugs@gcc.gnu.org.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12229
Summary: dynamic_cast in templates causes core dump in gcc 3.3.1
but not in gcc 2.95.3
Product: gcc
Version: 3.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: shelly at InterraSystems dot com
CC: gcc-bugs at gcc dot gnu dot org
The source code ...
#include <stdio.h>
template <int III> class ABC;
template <int III> class DEF;
template <int III> class GHI;
template <int III> class Array;
template <int III> class ABC {
public:
int A;
public:
ABC(int AA) { A = AA; }
virtual ~ABC() {};
virtual void P() = 0;
friend class DEF<III>;
friend class GHI<III>;
};
template <int III> class DEF : protected ABC<III> {
int B;
public:
DEF(int BB) : ABC<III>(BB) { B = BB; }
~DEF() {};
void P() {printf("DEF P %d\n", B);}
void Q() {printf("DEF Q %d\n", B);}
friend class Array<III>;
};
template <int III> class GHI : protected ABC<III> {
int C;
public:
GHI(int CC) : ABC<III>(CC) { C = CC; }
~GHI() {};
void P() {printf("GHI P %d\n", C);}
void R() {printf("GHI R %d\n", C);}
friend class Array<III>;
};
template <int III> class Array {
ABC<III>** pArray;
public:
Array() {
pArray = new (ABC<III>*)[III];
for (int i = 0; i < III; ++i) {
if (i < (III / 2)) {
pArray[i] = new DEF<III>(i);
} else {
pArray[i] = new GHI<III>(i);
}
}
}
~Array() {
for (int i = 0; i < III; ++i) {
delete pArray[i];
}
delete [] pArray;
}
void P() {
DEF<III>* pD;
GHI<III>* pG;
for (int i = 0; i < III; ++i) {
pArray[i]->P();
if (i < (III / 2)) {
pD = dynamic_cast<DEF<III>*>(pArray[i]);
pD->Q();
} else {
pG = dynamic_cast<GHI<III>*>(pArray[i]);
pG->R();
}
}
}
};
int main() {
Array<10> sArray;
sArray.P();
return 0;
}
... compiles fine on both SunOS and Linux with gcc 2.95.3 and executes fine too
producing
DEF P 0
DEF Q 0
DEF P 1
DEF Q 1
DEF P 2
DEF Q 2
DEF P 3
DEF Q 3
DEF P 4
DEF Q 4
GHI P 5
GHI R 5
GHI P 6
GHI R 6
GHI P 7
GHI R 7
GHI P 8
GHI R 8
GHI P 9
GHI R 9
But on both SunOS and Linux gcc 3.3.1 (and redhat linux gcc 2.96) I get ...
DEF P 0
Segmentation fault (core dumped)
---------------------------------------------------------------------------------
shelly@redhat[146] /usr/local/bin/g++ -v a.cxx
Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/specs
gcc version 2.95.3 20010315 (release)
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/cpp0 -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__ -Di686 -Dpentiumpro -D__i686 -D__i686__ -D__pentiumpro
-D__pentiumpro__ a.cxx /tmp/cc9eYrFn.ii
GNU CPP version 2.95.3 20010315 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../include/g++-3
/usr/local/include
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/../../../../i686-pc-linux-gnu/include
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
End of omitted list.
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/cc1plus /tmp/cc9eYrFn.ii -quiet
-dumpbase a.cc -version -o /tmp/ccKPAA2C.s
GNU C++ version 2.95.3 20010315 (release) (i686-pc-linux-gnu) compiled by GNU C
version 2.95.3 20010315 (release).
/usr/local/i686-pc-linux-gnu/bin/as -V -Qy -o /tmp/cc9HB1ZV.o /tmp/ccKPAA2C.s
GNU assembler version 2.14 (i686-pc-linux-gnu) using BFD version 2.14 20030612
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/collect2 -m elf_i386
-dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o
/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/crtbegin.o
-L/usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3
-L/usr/local/i686-pc-linux-gnu/lib -L/usr/local/lib /tmp/cc9HB1ZV.o -lstdc++ -lm
-lgcc -lc -lgcc /usr/local/lib/gcc-lib/i686-pc-linux-gnu/2.95.3/crtend.o
/usr/lib/crtn.o
-----------------------------------------------------------------------------------
shelly@redhat[149] /usr/local/gcc3.3.1/bin/g++ -v a.cxx
Reading specs from /usr/local/gcc3.3.1/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/specs
Configured with: ../gcc-3.3.1/configure --prefix=/usr/local/gcc3.3.1
Thread model: posix
gcc version 3.3.1
/usr/local/gcc3.3.1/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/cc1plus -quiet -v
-D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=1 -D_GNU_SOURCE a.cxx
-D__GNUG__=3 -quiet -dumpbase a.cxx -auxbase a -version -o /tmp/ccTOAW5i.s
GNU C++ version 3.3.1 (i686-pc-linux-gnu)
compiled by GNU C version 3.3.1.
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128549
ignoring nonexistent directory "/usr/local/gcc3.3.1/i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/gcc3.3.1/include/c++/3.3.1
/usr/local/gcc3.3.1/include/c++/3.3.1/i686-pc-linux-gnu
/usr/local/gcc3.3.1/include/c++/3.3.1/backward
/usr/local/include
/usr/local/gcc3.3.1/include
/usr/local/gcc3.3.1/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/include
/usr/include
End of search list.
as --traditional-format -V -Qy -o /tmp/ccfSJwex.o /tmp/ccTOAW5i.s
GNU assembler version 2.10.91 (i386-redhat-linux) using BFD version 2.10.91.0.2
/usr/local/gcc3.3.1/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/collect2 -m elf_i386
-dynamic-linker /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o
/usr/local/gcc3.3.1/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/crtbegin.o
-L/usr/local/gcc3.3.1/lib/gcc-lib/i686-pc-linux-gnu/3.3.1
-L/usr/local/gcc3.3.1/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/../../..
/tmp/ccfSJwex.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/local/gcc3.3.1/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/crtend.o /usr/lib/crtn.o
------------------------------------------------------------------------------------
shelly@redhat[151] g++ -v a.cxx
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.96/specs
gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-81)
/usr/lib/gcc-lib/i386-redhat-linux/2.96/cpp0 -lang-c++ -D__GNUG__=2
-D__EXCEPTIONS -v -D__GNUC__=2 -D__GNUC_MINOR__=96 -D__GNUC_PATCHLEVEL__=0
-D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux
-Asystem(posix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__
-D__tune_i386__ a.cxx /tmp/ccVOYG9R.ii
GNU CPP version 2.96 20000731 (Red Hat Linux 7.1 2.96-81) (cpplib) (i386 Linux/ELF)
ignoring nonexistent directory "/usr/i386-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/include/g++-3
/usr/local/include
/usr/lib/gcc-lib/i386-redhat-linux/2.96/include
/usr/include
End of search list.
/usr/lib/gcc-lib/i386-redhat-linux/2.96/cc1plus /tmp/ccVOYG9R.ii -quiet
-dumpbase a.cxx -version -o /tmp/ccWN34DD.s
GNU C++ version 2.96 20000731 (Red Hat Linux 7.1 2.96-81) (i386-redhat-linux)
compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.1 2.96-81).
as -V -Qy -o /tmp/ccxNnjvy.o /tmp/ccWN34DD.s
GNU assembler version 2.10.91 (i386-redhat-linux) using BFD version 2.10.91.0.2
/usr/lib/gcc-lib/i386-redhat-linux/2.96/collect2 -m elf_i386 -dynamic-linker
/lib/ld-linux.so.2 /usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crt1.o
/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crti.o
/usr/lib/gcc-lib/i386-redhat-linux/2.96/crtbegin.o
-L/usr/lib/gcc-lib/i386-redhat-linux/2.96
-L/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../.. /tmp/ccxNnjvy.o -lstdc++ -lm
-lgcc -lc -lgcc /usr/lib/gcc-lib/i386-redhat-linux/2.96/crtend.o
/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crtn.o
-------------------------------------------------------------------------------------
Thanks a lot for the great compiler :-)
Shelly
More information about the Gcc-bugs
mailing list