The following invalid code snippet causes an ICE since GCC 3.3: ============================================== template<int> struct A { void foo(); }; template<int N, char> void A<N>::foo() {} A<0> a; ============================================== bug.cc:6: error: got 2 template parameters for `void A<<anonymous> >::foo()' bug.cc:6: error: but 1 required bug.cc: In instantiation of `A<0>': bug.cc:8: instantiated from here bug.cc:6: internal compiler error: tree check: accessed elt 2 of tree_vec with 1 elts in tsubst, at cp/pt.c:6707 Please submit a full bug report, [etc.]
Confirmed.
Subject: Bug 22233 CVSROOT: /cvs/gcc Module name: gcc Changes by: reichelt@gcc.gnu.org 2005-08-22 09:48:26 Modified files: gcc/cp : ChangeLog pt.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/template: param1.C Log message: PR c++/22233 * pt.c (push_template_decl_real): Return error_mark_node if the number of template parameters does not match previous definition. * g++.dg/template/param1.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.4853&r2=1.4854 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&r1=1.1023&r2=1.1024 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.5946&r2=1.5947 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/param1.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
Subject: Bug 22233 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-4_0-branch Changes by: reichelt@gcc.gnu.org 2005-08-22 09:54:43 Modified files: gcc/cp : ChangeLog pt.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/template: param1.C Log message: PR c++/22233 * pt.c (push_template_decl_real): Return error_mark_node if the number of template parameters does not match previous definition. * g++.dg/template/param1.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.4648.2.78&r2=1.4648.2.79 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.978.2.16&r2=1.978.2.17 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.5084.2.343&r2=1.5084.2.344 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/param1.C.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=NONE&r2=1.1.2.1
Fixed on mainline and 4.0 branch.
Modified patch for the 3.4 branch posted.
Subject: Bug 22233 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_4-branch Changes by: reichelt@gcc.gnu.org 2005-09-02 11:20:22 Modified files: gcc/cp : ChangeLog decl.c pt.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/template: param1.C Log message: PR c++/22233 * pt.c (push_template_decl_real): Return error_mark_node if the number of template parameters does not match previous definition. * decl.c (start_function): Handle error_mark_node returned by push_template_decl. * g++.dg/template/param1.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3892.2.237&r2=1.3892.2.238 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/decl.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.1174.2.38&r2=1.1174.2.39 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.816.2.58&r2=1.816.2.59 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3389.2.429&r2=1.3389.2.430 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/param1.C.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.8.1
Fixed also on the 3.4 branch.
Btw, this was approved for the 3.4 branch by Gaby in private mail.