From edf1849aa6b55871d799a0e8a574eb752f0b4c8a Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Fri, 17 Feb 2017 13:42:43 -0500 Subject: [PATCH] PR c++/79549 - C++17 ICE with non-type auto template parameter pack * pt.c (convert_template_argument): Just return an auto arg pack. (tsubst_template_args): Don't tsubst an auto pack type. From-SVN: r245544 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/pt.c | 11 +++++++++-- gcc/testsuite/g++.dg/cpp1z/nontype-auto8.C | 10 ++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/nontype-auto8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 65f2d19..a660c43 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2017-02-17 Jason Merrill + PR c++/79549 - C++17 ICE with non-type auto template parameter pack + * pt.c (convert_template_argument): Just return an auto arg pack. + (tsubst_template_args): Don't tsubst an auto pack type. + PR c++/79556 - C++17 ICE with non-type auto * pt.c (do_auto_deduction): Don't try to deduce from null type. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 093c0f9..04479d4 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7612,6 +7612,10 @@ convert_template_argument (tree parm, if (tree a = type_uses_auto (t)) { + if (ARGUMENT_PACK_P (orig_arg)) + /* There's nothing to check for an auto argument pack. */ + return orig_arg; + t = do_auto_deduction (t, arg, a, complain, adc_unify, args); if (t == error_mark_node) return error_mark_node; @@ -11649,8 +11653,11 @@ tsubst_template_args (tree t, tree args, tsubst_flags_t complain, tree in_decl) new_arg = error_mark_node; if (TREE_CODE (new_arg) == NONTYPE_ARGUMENT_PACK) { - TREE_TYPE (new_arg) = tsubst (TREE_TYPE (orig_arg), args, - complain, in_decl); + if (type_uses_auto (TREE_TYPE (orig_arg))) + TREE_TYPE (new_arg) = TREE_TYPE (orig_arg); + else + TREE_TYPE (new_arg) = tsubst (TREE_TYPE (orig_arg), args, + complain, in_decl); TREE_CONSTANT (new_arg) = TREE_CONSTANT (orig_arg); if (TREE_TYPE (new_arg) == error_mark_node) diff --git a/gcc/testsuite/g++.dg/cpp1z/nontype-auto8.C b/gcc/testsuite/g++.dg/cpp1z/nontype-auto8.C new file mode 100644 index 0000000..da4c88b --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/nontype-auto8.C @@ -0,0 +1,10 @@ +// PR c++/79549 +// { dg-options -std=c++1z } + +template +struct meow; + +template +struct meow { }; + +meow<1> m; -- 2.7.4