Example source code: template<class Value_t> class fparser { template<bool Option> void eval2(Value_t r[2]); public: void evaltest(); };
/*template<class Value_t> template<bool Option> void fparser<Value_t>::eval2(Value_t r[2]) { }*/ template<> template<bool Option> void fparser<int>::eval2(int r[2]) { struct ObjType { int tmp; }; ObjType Object = { 5 }; } template<class Value_t> void fparser<Value_t>::evaltest () { eval2<false>(0); } template class fparser<int>; Compilation result: Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.2-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.4.2 (Debian 4.4.2-8) COLLECT_GCC_OPTIONS='-Wall' '-W' '-O3' '-c' '-v' '-shared-libgcc' '-mtune=generic' /usr/lib/gcc/x86_64-linux-gnu/4.4.2/cc1plus -quiet -v -D_GNU_SOURCE tmp2.cc -quiet -dumpbase tmp2.cc -mtune=generic -auxbase tmp2 -O3 -Wall -W -version -o /tmp/ccPuGyBP.s ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.4.2/../../../../x86_64-linux-gnu/include" ignoring nonexistent directory "/usr/include/x86_64-linux-gnu" #include "..." search starts here: #include <...> search starts here: /usr/include/c++/4.4 /usr/include/c++/4.4/x86_64-linux-gnu /usr/include/c++/4.4/backward /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.4.2/include /usr/lib/gcc/x86_64-linux-gnu/4.4.2/include-fixed /usr/include End of search list. GNU C++ (Debian 4.4.2-8) version 4.4.2 (x86_64-linux-gnu) compiled by GNU C version 4.4.2, GMP version 4.3.1, MPFR version 2.4.2-p1. GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: 545dc413edcab7204151d021d996af39 tmp2.cc: In member function 'void fparser<Value_t>::eval2(Value_t*) [with bool Option = false, Value_t = int]': tmp2.cc:33: instantiated from 'void fparser<Value_t>::evaltest() [with Value_t = int]' tmp2.cc:37: instantiated from here tmp2.cc:19: internal compiler error: in tsubst, at cp/pt.c:9339 Please submit a full bug report, with preprocessed source if appropriate. See <file:///usr/share/doc/gcc-4.4/README.Bugs> for instructions. Occurs on g++-4.1: internal compiler error: in tsubst, at cp/pt.c:7267 Occurs on g++-4.2: internal compiler error: in tsubst, at cp/pt.c:7465 Occurs on g++-4.3: internal compiler error: in tsubst, at cp/pt.c:9031 Occurs on g++-4.4: internal compiler error: in tsubst, at cp/pt.c:9339 Does not occur on g++-4.0, because 4.0 gives error "template-id 'eval2<>' for 'void fparser<int>::eval2(int*)' does not match any template declaration" instead. Occurs at all optimization levels. -- Summary: ice-on-legal-code: template class template function local objects Product: gcc Version: 4.4.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: bisqwit at iki dot fi GCC build triplet: x86_64-pc-linux-gnu GCC host triplet: x86_64-pc-linux-gnu GCC target triplet: x86_64-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42697