2017-06-29 Jason Merrill <jason@redhat.com>
+ PR c++/81180 - ICE with C++17 deduction of member class template.
+ * pt.c (build_deduction_guide): Correct member template handling.
+
PR c++/81188 - matching decltype of member function call.
* tree.c (cp_tree_equal): Remove COMPONENT_REF special case.
}
else
{
+ ++processing_template_decl;
+
+ tree fn_tmpl
+ = (TREE_CODE (ctor) == TEMPLATE_DECL ? ctor
+ : DECL_TI_TEMPLATE (ctor));
if (outer_args)
- ctor = tsubst (ctor, outer_args, complain, ctor);
+ fn_tmpl = tsubst (fn_tmpl, outer_args, complain, ctor);
+ ctor = DECL_TEMPLATE_RESULT (fn_tmpl);
+
type = DECL_CONTEXT (ctor);
- tree fn_tmpl;
- if (TREE_CODE (ctor) == TEMPLATE_DECL)
- {
- fn_tmpl = ctor;
- ctor = DECL_TEMPLATE_RESULT (fn_tmpl);
- }
- else
- fn_tmpl = DECL_TI_TEMPLATE (ctor);
tparms = DECL_TEMPLATE_PARMS (fn_tmpl);
/* If type is a member class template, DECL_TI_ARGS (ctor) will have
/* For a member template constructor, we need to flatten the two
template parameter lists into one, and then adjust the function
signature accordingly. This gets...complicated. */
- ++processing_template_decl;
tree save_parms = current_template_parms;
/* For a member template we should have two levels of parms/args, one
ci = tsubst_constraint_info (ci, tsubst_args, complain, ctor);
current_template_parms = save_parms;
- --processing_template_decl;
}
+ --processing_template_decl;
}
if (!memtmpl)