The following code --- template <typename _T> struct A { template <int _N, int _M> struct B; template <int _N> struct B<_N, _T::m> { static void f(); }; }; struct C { static const int m = 4; }; void m() { A<C>::B<1, 4>::f(); } -- causes the following ICE as of 4.2 [g++ 4.4] test.cc: In function ‘void m()’: test.cc:22: internal compiler error: in unify, at cp/pt.c:14081 g++ 4.1 yields this error, instead [g++ 4.1] test.cc: In function ‘void m()’: test.cc:22: error: incomplete type ‘A<C>::B<1, 4>’ used in nested name specifier This code seems fine to me (and so seems to intel, xlc++ and comeau online) so I assume it is some issue in g++.
For what it's worth, replacing static const int m = 4; with enum { m = 4 }; works fine.
Confirmed.
A patch was proposed at http://gcc.gnu.org/ml/gcc-patches/2010-03/msg00662.html
Subject: Bug 43327 Author: dodji Date: Fri Mar 26 09:20:58 2010 New Revision: 157745 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=157745 Log: Fix for PR c++/43327 gcc/cp/ChangeLog: PR c++/43327 * pt.c (add_to_template_args): Support NULL ARGS; (most_specialized_class): call coerce_template_parms on template arguments passed to get_class_bindings. Use add_to_template_args. (unify): Handle VAR_DECLs. gcc/testsuite/ChangeLog: PR c++/43327 * g++.dg/other/crash-10.C: New test. * g++.dg/other/crash-11.C: New test. Added: trunk/gcc/testsuite/g++.dg/other/crash-10.C trunk/gcc/testsuite/g++.dg/other/crash-11.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/pt.c trunk/gcc/testsuite/ChangeLog
Fixed in 4.5.