This ICE is caused by a class nested inside a local class of a templated member function. The code snippet below is illustrative of the ICE in my application. I found that small changes in the snippet cause the ICE to disappear, or to pop up in another place. For example, just replacing void funct(); with void funct(){} causes the ICE to disappear! //========= Compiler output ================ $ gcc -v -save-temps GccBug2.cpp Reading specs from /usr/local/lib/gcc-lib/i686-pc-cygwin/3.1/specs Configured with: ../gcc-3.1/configure --enable-threads=win32 Thread model: win32 gcc version 3.1 // ... junk elided here ... GNU CPP version 3.1 (cpplib) (80386, BSD syntax) GNU C++ version 3.1 (i686-pc-cygwin) compiled by GNU C version 3.1. GccBug2.cpp: In instantiation of `Struct::templatedMemberFunction(const T&) [with T = int]::LocalClass::NestedClass': GccBug2.cpp:6: instantiated from `Struct::templatedMemberFunction(const T&) [with T = int]::LocalClass' GccBug2.cpp:16: instantiated from `void Struct::templatedMemberFunction (const T&) [with T = int]' GccBug2.cpp:23: instantiated from here GccBug2.cpp:7: Internal compiler error in tsubst_decl, at cp/pt.c:5733 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions. //========= Source File GccBug2.cpp Begins Here =========== struct Struct { template<class T> void templatedMemberFunction(const T&) { class LocalClass { struct NestedClass { void funct(); }; NestedClass nestedClassInstance_; public: void memberFunction() {nestedClassInstance_.funct();} }; LocalClass localClass; localClass.memberFunction(); }; }; void globalFunction() { Struct classInstance; classInstance.templatedMemberFunction(42); } //========= Source File GccBug2.cpp Ends Here ============= Release: 3.3/3.4 Environment: Cygwin on Windows XP Professional How-To-Repeat: Invoke the compiler on GccBug2.cpp.
State-Changed-From-To: open->analyzed State-Changed-Why: Confirmed.
From: "Christian Ehrhardt" <ehrhardt@mathematik.uni-ulm.de> To: gcc-prs@gcc.gnu.org, rubin@contractor.net, gcc-bugs@gcc.gnu.org, gcc-gnats@gcc.gnu.org, nobody@gcc.gnu.org Cc: Subject: Re: c++/6949: [2003-01-22] ICE in tsubst_decl, at cp/pt.c:5733 Date: Mon, 12 May 2003 18:58:18 +0200 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6949 A further cleaned up testcase is below. The problem is that tsubst_decl expects non NULL DECL_TEMPLATE_INFO on the prototype declaration of the member function g in this assertion around line 6000 in cp/pt.c: | /* Nobody should be tsubst'ing into non-template functions. */ | my_friendly_assert (DECL_TEMPLATE_INFO (t) != NULL_TREE, 0); template<class T> void f(const T&) { struct B { void g (T); }; B b; }; void g() { f(42); } regards Christian
This is a regression from 2.91.66, old but still a regression though.
Subject: Bug 6949 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_3-branch Changes by: mmitchel@gcc.gnu.org 2003-07-02 04:09:40 Modified files: gcc/cp : ChangeLog decl2.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/template: local3.C Log message: PR c++/6949 * decl2.c (grokfield): Create TEMPLATE_DECLs for methods in local classes. PR c++/6949 * g++.dg/template/local3.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.3076.2.173&r2=1.3076.2.174 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl2.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.575.2.32&r2=1.575.2.33 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.2261.2.213&r2=1.2261.2.214 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/local3.C.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=NONE&r2=1.1.2.1
Subject: Bug 6949 CVSROOT: /cvs/gcc Module name: gcc Changes by: mmitchel@gcc.gnu.org 2003-07-02 04:11:30 Modified files: gcc/cp : ChangeLog decl2.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/template: local3.C Log message: PR c++/6949 * decl2.c (grokfield): Create TEMPLATE_DECLs for methods in local classes. PR c++/6949 * g++.dg/template/local3.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.3480&r2=1.3481 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl2.c.diff?cvsroot=gcc&r1=1.634&r2=1.635 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.2825&r2=1.2826 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/local3.C.diff?cvsroot=gcc&r1=1.1&r2=1.2
Fixed in GCC 3.3.1, and GCC 3.4.