------- Comment #4 from jakub at gcc dot gnu dot org 2007-11-23 21:11 ------- In particular, this is caused by the pt.c (tsubst) change: @@ -8555,16 +8545,15 @@ gcc_assert (type != unknown_type_node);
/* Reuse typedefs. We need to do this to handle dependent attributes, - specifically attribute aligned. */ + such as attribute aligned. */ if (TYPE_P (t) && TYPE_NAME (t) - && !MAYBE_TAGGED_TYPE_P (t) - && TREE_CODE (t) != TEMPLATE_TEMPLATE_PARM - && TREE_CODE (t) != UNBOUND_CLASS_TEMPLATE) + && TYPE_NAME (t) != TYPE_MAIN_DECL (t)) { tree decl = TYPE_NAME (t); - if (DECL_CLASS_SCOPE_P (decl)) + if (DECL_CLASS_SCOPE_P (decl) + && CLASSTYPE_TEMPLATE_INFO (DECL_CONTEXT (decl))) { tree tmpl = most_general_template (DECL_TI_TEMPLATE (decl)); tree gen_args = tsubst (DECL_TI_ARGS (decl), args, complain, in_decl); r = retrieve_specialization (tmpl, gen_args, false); } else if (DECL_FUNCTION_SCOPE_P (decl)) r = retrieve_local_specialization (decl); else r = NULL_TREE; In this case t is RECORD_TYPE in function scope, so MAYBE_TAGGED_TYPE_P was true on it, but this (fn_type_unification) wasn't called from instantiate_decl and so local_specializations is NULL. I wonder if just - else if (DECL_FUNCTION_SCOPE_P (decl)) + else if (DECL_FUNCTION_SCOPE_P (decl) && local_specializations) wouldn't be best fix for this, there are already other places which guard retrieve_local_specialization calls by this condition. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34206