http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51884
Jason Merrill <jason at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |ice-on-valid-code Summary|lambda with templates |[C++11] ICE with local | |class/lambda template | |argument --- Comment #7 from Jason Merrill <jason at gcc dot gnu.org> 2013-03-06 14:09:01 UTC --- And reduced again, as much as possible. The ICE is caused by trying to generate the partially-instantiated type of foo<int>::bar, and thereby looking up test<int>::value, which uses the (non-reentrant) dfs functions, in order to mangle the name of B<C>'s vtable, which is also done using the dfs functions. template<typename> struct test { static const int value = 0; }; template<int> struct enable_if { typedef void type; }; struct A { virtual void f() {} }; template<typename> struct B : A { }; template<typename, typename = void> struct foo; template<typename T> struct foo<T,typename enable_if<test<T>::value>::type> { template <bool> void bar() const { struct C { } c; B<C> b; } }; int main() { foo<int> f; f.bar<true>(); }