PR c++/84770 - ICE with typedef and parameter pack.
authorJason Merrill <jason@redhat.com>
Sat, 10 Mar 2018 03:34:37 +0000 (22:34 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sat, 10 Mar 2018 03:34:37 +0000 (22:34 -0500)
* pt.c (verify_unstripped_args_1): Split out from
verify_unstripped_args.

From-SVN: r258408

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/variadic173.C [new file with mode: 0644]

index 95ed64d..7ed0d5e 100644 (file)
@@ -1,5 +1,9 @@
 2018-03-09  Jason Merrill  <jason@redhat.com>
 
+       PR c++/84770 - ICE with typedef and parameter pack.
+       * pt.c (verify_unstripped_args_1): Split out from
+       verify_unstripped_args.
+
        PR c++/84785 - ICE with alias template and default targs.
        * pt.c (type_unification_real): Set processing_template_decl if
        saw_undeduced == 1.
index d91e8bb..a92b36a 100644 (file)
@@ -1134,26 +1134,31 @@ optimize_specialization_lookup_p (tree tmpl)
    gone through coerce_template_parms by now.  */
 
 static void
+verify_unstripped_args_1 (tree inner)
+{
+  for (int i = 0; i < TREE_VEC_LENGTH (inner); ++i)
+    {
+      tree arg = TREE_VEC_ELT (inner, i);
+      if (TREE_CODE (arg) == TEMPLATE_DECL)
+       /* OK */;
+      else if (TYPE_P (arg))
+       gcc_assert (strip_typedefs (arg, NULL) == arg);
+      else if (ARGUMENT_PACK_P (arg))
+       verify_unstripped_args_1 (ARGUMENT_PACK_ARGS (arg));
+      else if (strip_typedefs (TREE_TYPE (arg), NULL) != TREE_TYPE (arg))
+       /* Allow typedefs on the type of a non-type argument, since a
+          parameter can have them.  */;
+      else
+       gcc_assert (strip_typedefs_expr (arg, NULL) == arg);
+    }
+}
+
+static void
 verify_unstripped_args (tree args)
 {
   ++processing_template_decl;
   if (!any_dependent_template_arguments_p (args))
-    {
-      tree inner = INNERMOST_TEMPLATE_ARGS (args);
-      for (int i = 0; i < TREE_VEC_LENGTH (inner); ++i)
-       {
-         tree arg = TREE_VEC_ELT (inner, i);
-         if (TREE_CODE (arg) == TEMPLATE_DECL)
-           /* OK */;
-         else if (TYPE_P (arg))
-           gcc_assert (strip_typedefs (arg, NULL) == arg);
-         else if (strip_typedefs (TREE_TYPE (arg), NULL) != TREE_TYPE (arg))
-           /* Allow typedefs on the type of a non-type argument, since a
-              parameter can have them.  */;
-         else
-           gcc_assert (strip_typedefs_expr (arg, NULL) == arg);
-       }
-    }
+    verify_unstripped_args_1 (INNERMOST_TEMPLATE_ARGS (args));
   --processing_template_decl;
 }
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic173.C b/gcc/testsuite/g++.dg/cpp0x/variadic173.C
new file mode 100644 (file)
index 0000000..a0ca89b
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/84770
+// { dg-do compile { target c++11 } }
+
+typedef int T;
+
+template<T&...> struct A {};
+
+int i;
+
+A<i> a;