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

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

From-SVN: r249817
This commit is contained in:
Jason Merrill 2017-06-29 17:32:20 -04:00 committed by Jason Merrill
parent c98abc8fee
commit 7c9092dba9
3 changed files with 31 additions and 11 deletions

View File

@ -1,5 +1,8 @@
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.

View File

@ -25176,17 +25176,16 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
}
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
@ -25208,7 +25207,6 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
/* 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
@ -25269,8 +25267,8 @@ build_deduction_guide (tree ctor, tree outer_args, tsubst_flags_t complain)
ci = tsubst_constraint_info (ci, tsubst_args, complain, ctor);
current_template_parms = save_parms;
--processing_template_decl;
}
--processing_template_decl;
}
if (!memtmpl)

View File

@ -0,0 +1,19 @@
// 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;
}