[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