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:
parent
c98abc8fee
commit
7c9092dba9
|
@ -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.
|
||||
|
||||
|
|
20
gcc/cp/pt.c
20
gcc/cp/pt.c
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue