Compiling some code with some partially specialized templates causes and ICE. The code itself may be incorrect in some way, but it shouldn't cause an ICE. Here is the appropriate info. I will attach the preprocessed source in just a moment (there doesn't seem to be a way to do it from this bugzilla screen). $ g++ -o test Convert.ii -v Reading specs from /usr//bin/../lib/gcc-lib/i586-mandrake-linux-gnu/3.3.1/specs Configured with: ../configure --prefix=/usr --libdir=/usr/lib --with-slibdir=/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --enable-long-long --enable-__cxa_atexit --enable-languages=c,c++,ada,f77,objc,java,pascal --host=i586-mandrake-linux-gnu --with-system-zlib Thread model: posix gcc version 3.3.1 (Mandrake Linux 9.2 3.3.1-1mdk) /usr//bin/../lib/gcc-lib/i586-mandrake-linux-gnu/3.3.1/cc1plus -fpreprocessed Convert.ii -quiet -dumpbase Convert.ii -auxbase Convert -version -o /tmp/ccBkAw2p.s GNU C++ version 3.3.1 (Mandrake Linux 9.2 3.3.1-1mdk) (i586-mandrake-linux-gnu) compiled by GNU C version 3.3.1 (Mandrake Linux 9.2 3.3.1-1mdk). GGC heuristics: --param ggc-min-expand=55 --param ggc-min-heapsize=48162 Convert.cpp:14: internal compiler error: in lookup_template_function, at cp/pt.c:4005 Please submit a full bug report, with preprocessed source if appropriate. See <URL:https://qa.mandrakesoft.com/> for instructions.
Created attachment 4689 [details] This is the preprocessed source that makes it ICE. Here is the preprocessed source that causes the problem.
Subject: Re: ICE in lookup_template_function at cp/pt.c:4005 On Wed, 2 Sep 2003, wjl at icecavern dot net wrote: > Created an attachment (id=4689) > --> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=4689&action=view) > This is the preprocessed source that makes it ICE. Here is a simplified testcase: // { dg-do compile } // PR c++/12146: Incorrect template specialization of non-template function. struct A { }; struct B { }; A f(const B & b) { return A(); } template<> B f(const A & a) { // { dg-error "not match" } return B(); }
This is a regression from 3.2.3 available on 3.3-branch. As tested with: GNU C++ version 3.3.2 20030903 (prerelease) (i686-pc-linux-gnu) [gb@hp6 gcc]$ ./cc1plus ~/vrac/t.cpp A f(const B&) A f(const B&) /home/gb/vrac/t.cpp: At global scope: /home/gb/vrac/t.cpp:13: internal compiler error: in lookup_template_function, at cp/pt.c:4005 Please submit a full bug report, with preprocessed source if appropriate. See <URL:http://gcc.gnu.org/bugs.html> for instructions.
From Phil's regression hunter: Search converges between 2002-07-28-trunk (#83) and 2002-08-04-trunk (#84). Most likely caused by (just by looking into gcc-patches for changes that might have caused this): 2002-07-31 Mark Mitchell <mark@codesourcery.com> * call.c (build_field_call): Do not look up the field by name. (build_method_call): Simplify. (struct z_candidate): Add access_path and conversion_path. Remove basetype_path. (convert_class_to_reference): Adjust use of add_function_candidate. (add_candidate): Add conversion_path argument. (add_function_candidate): Use it. (add_conv_dndidate): Likewise. [....]
BTW, the code is actually bad; there is a stray "template <>" in this snippet (from Convert.ii -- line no ~17495) template <> Value convert_std__string(const std::string &) { return Value(rb_str_new(s.data(), s.length())); } This doesn't forgive the ICE, but hopefully will make it easier to track down. =)
Subject: Bug 12146 CVSROOT: /cvs/gcc Module name: gcc Changes by: mmitchel@gcc.gnu.org 2003-09-05 18:04:22 Modified files: gcc/cp : ChangeLog call.c pt.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/g++.dg/expr: static_cast4.C gcc/testsuite/g++.dg/template: crash9.C Log message: PR c++/12163 * call.c (perform_direct_initialization): Correct logic for direct-initialization of a class type. PR c++/12146 * pt.c (lookup_template_function): Robustify. PR c++/12163 * g++.dg/expr/static_cast4.C: New test. PR c++/12146 * g++.dg/template/crash9.C: New test. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.3648&r2=1.3649 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/call.c.diff?cvsroot=gcc&r1=1.430&r2=1.431 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&r1=1.774&r2=1.775 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.3026&r2=1.3027 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/expr/static_cast4.C.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/g++.dg/template/crash9.C.diff?cvsroot=gcc&r1=NONE&r2=1.1
Subject: Bug 12146 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_3-branch Changes by: mmitchel@gcc.gnu.org 2003-09-05 18:31:19 Modified files: gcc/cp : ChangeLog call.c pt.c gcc/testsuite : ChangeLog Log message: PR c++/12163 * call.c (perform_direct_initialization): Correct logic for direct-initialization of a class type. PR c++/12146 * pt.c (lookup_template_function): Robustify. PR c++/12163 * g++.dg/expr/static_cast4.C: New test. PR c++/12146 * g++.dg/template/crash9.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.198&r2=1.3076.2.199 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/call.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.341.2.30&r2=1.341.2.31 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/pt.c.diff?cvsroot=gcc&only_with_tag=gcc-3_3-branch&r1=1.635.2.35&r2=1.635.2.36 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.266&r2=1.2261.2.267
Fixed in GCC 3.3.2, GCC 3.4.