Commit 47304c6a by Jason Merrill Committed by Jason Merrill

PR c++/81180 - ICE with C++17 deduction of member class template.

	* pt.c (build_deduction_guide): Correct member template handling.

From-SVN: r249816
parent f990f3a3
2017-06-29 Jason Merrill <jason@redhat.com> 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. PR c++/81188 - matching decltype of member function call.
* tree.c (cp_tree_equal): Remove COMPONENT_REF special case. * tree.c (cp_tree_equal): Remove COMPONENT_REF special case.
......
...@@ -25216,17 +25216,16 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain) ...@@ -25216,17 +25216,16 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
} }
else else
{ {
++processing_template_decl;
tree fn_tmpl
= (TREE_CODE (ctor) == TEMPLATE_DECL ? ctor
: DECL_TI_TEMPLATE (ctor));
if (outer_args) if (outer_args)
ctor = tsubst (ctor, outer_args, complain, ctor); fn_tmpl = tsubst (fn_tmpl, outer_args, complain, ctor);
type = DECL_CONTEXT (ctor);
tree fn_tmpl;
if (TREE_CODE (ctor) == TEMPLATE_DECL)
{
fn_tmpl = ctor;
ctor = DECL_TEMPLATE_RESULT (fn_tmpl); ctor = DECL_TEMPLATE_RESULT (fn_tmpl);
}
else type = DECL_CONTEXT (ctor);
fn_tmpl = DECL_TI_TEMPLATE (ctor);
tparms = DECL_TEMPLATE_PARMS (fn_tmpl); tparms = DECL_TEMPLATE_PARMS (fn_tmpl);
/* If type is a member class template, DECL_TI_ARGS (ctor) will have /* If type is a member class template, DECL_TI_ARGS (ctor) will have
...@@ -25248,7 +25247,6 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain) ...@@ -25248,7 +25247,6 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
/* For a member template constructor, we need to flatten the two /* For a member template constructor, we need to flatten the two
template parameter lists into one, and then adjust the function template parameter lists into one, and then adjust the function
signature accordingly. This gets...complicated. */ signature accordingly. This gets...complicated. */
++processing_template_decl;
tree save_parms = current_template_parms; tree save_parms = current_template_parms;
/* For a member template we should have two levels of parms/args, one /* For a member template we should have two levels of parms/args, one
...@@ -25309,8 +25307,8 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain) ...@@ -25309,8 +25307,8 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
ci = tsubst_constraint_info (ci, tsubst_args, complain, ctor); ci = tsubst_constraint_info (ci, tsubst_args, complain, ctor);
current_template_parms = save_parms; current_template_parms = save_parms;
--processing_template_decl;
} }
--processing_template_decl;
} }
if (!memtmpl) if (!memtmpl)
......
// PR c++/81180
// { dg-options -std=c++1z }
template < int I > struct int_{};
template < typename T >
struct A{
template < typename U, int I >
struct B{
B(U u, int_< I >){}
};
};
int main(){
A< int >::B v(0, int_< 0 >());
(void)v;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment