commit 1eeb6fca6149f32f711ab2b404ce442c4a40b550 Author: Jason Merrill Date: Fri Feb 17 12:46:52 2017 -0500 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. 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;