From: Jason Merrill Date: Tue, 20 Mar 2018 12:44:49 +0000 (-0400) Subject: PR c++/84937 - ICE with class deduction and auto. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d9bf40a181b32e4d5e581ec10d48803ea4a43f9d;p=gcc.git PR c++/84937 - ICE with class deduction and auto. * pt.c (rewrite_template_parm): Fix auto handling. From-SVN: r258680 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 236ea215452..fd7329f0622 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-03-19 Jason Merrill + + PR c++/84937 - ICE with class deduction and auto. + * pt.c (rewrite_template_parm): Fix auto handling. + 2018-03-19 Marek Polacek PR c++/84925 @@ -9,7 +14,7 @@ (cxx_eval_constant_expression): Verify constructor's flags unconditionally. -2018-03-16 Jason Merrill +2018-03-19 Jason Merrill PR c++/71834 - template-id with too few arguments. * pt.c (coerce_template_parms): Check fixed_parameter_pack_p. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 21a4de57745..d7c0c7bec81 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -25781,8 +25781,21 @@ rewrite_template_parm (tree olddecl, unsigned index, unsigned level, = TEMPLATE_TYPE_PARM_FOR_CLASS (oldtype); } else - newtype = tsubst (TREE_TYPE (olddecl), tsubst_args, - complain, NULL_TREE); + { + newtype = TREE_TYPE (olddecl); + if (type_uses_auto (newtype)) + { + // Substitute once to fix references to other template parameters. + newtype = tsubst (newtype, tsubst_args, + complain|tf_partial, NULL_TREE); + // Now substitute again to reduce the level of the auto. + newtype = tsubst (newtype, current_template_args (), + complain, NULL_TREE); + } + else + newtype = tsubst (newtype, tsubst_args, + complain, NULL_TREE); + } tree newdecl = build_decl (DECL_SOURCE_LOCATION (olddecl), TREE_CODE (olddecl), diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction51.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction51.C new file mode 100644 index 00000000000..eba7972c3c6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction51.C @@ -0,0 +1,11 @@ +// PR c++/84937 +// { dg-additional-options -std=c++17 } + +template struct A {}; + +template struct B +{ + template B(A); +}; + +B b(A<0,0>{});