http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45894
--- Comment #5 from Dodji Seketeli <dodji at gcc dot gnu.org> 2010-11-08 14:27:46 UTC --- I think the example is invalid in c++ 2003 as [temp.param/9] says that a function template shall not have any default template argument. It's valid in c++0x though as that rule has been relaxed. FWIW, Trying the code with without -Wall and with c++0x is accepted by current trunk. -Wall with -std=c++0x crashes it too. Without -Wall and without -std=c++0x the code is rejected by trunk. The crash happens while looking at the expression FOO::BAR<> because we want to emit warnings about variables access in undefined sequencing conditions. For that finish_expr_stmt passes the expression FOO::Bar<> (represented as the BASELINK Jakub referred to), to verify_sequence_points which at some point tries to see if the TEMPLATE_ID_EXPR representing FOO::BAR<> is an lvalue. Then lvalue_kind crashes because it doesn't expect a tree without a TYPE [TEMPLATE_ID_EXPR doesn't have a type] as Jakub noted. I think the fix looks correct (assuming it passes regtests), as it 1/robustifies lvalue_kind 2/makes it return clk_none and IMHO rightfully so as we can't say at this point if the TEMPLATE_ID_EXPR (which is just a syntactic representation) is an lvalue or not. To be able to decide on the lvalueness we'd need something more typed at this point, I suppose.