PR c++/79549 - C++17 ICE with non-type auto template parameter pack
authorJason Merrill <jason@redhat.com>
Fri, 17 Feb 2017 18:42:43 +0000 (13:42 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 17 Feb 2017 18:42:43 +0000 (13:42 -0500)
* 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
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp1z/nontype-auto8.C [new file with mode: 0644]

index 65f2d19eda0d16014d29d1d81546edb0952f13e0..a660c434c7945a2f00dad346d529f30b19266618 100644 (file)
@@ -1,5 +1,9 @@
 2017-02-17  Jason Merrill  <jason@redhat.com>
 
+       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.
 
index 093c0f9377567a71b7e69194c42a450e88ba310a..04479d4d48642c8ed80844fb1e61ff096eb1991c 100644 (file)
@@ -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 (file)
index 0000000..da4c88b
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/79549
+// { dg-options -std=c++1z }
+
+template <auto...>
+struct meow;
+
+template <auto C>
+struct meow<C> { };
+
+meow<1> m;