PR c++/72801 - ICE with variadic partial specialization
authorJason Merrill <jason@redhat.com>
Wed, 28 Jun 2017 19:59:37 +0000 (15:59 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 28 Jun 2017 19:59:37 +0000 (15:59 -0400)
* pt.c (unify_pack_expansion): Use PACK_EXPANSION_EXTRA_ARGS.

From-SVN: r249755

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

index f4b93ca7d10007d20e547eb64f53d19446c270b8..ae6de7f009c2cae73085f38a915b7401c2398233 100644 (file)
@@ -1,5 +1,8 @@
 2017-06-28  Jason Merrill  <jason@redhat.com>
 
+       PR c++/72801 - ICE with variadic partial specialization
+       * pt.c (unify_pack_expansion): Use PACK_EXPANSION_EXTRA_ARGS.
+
        PR c++/55639 - partial specialization with ::template
        * parser.c (cp_parser_class_head): Handle ::template.
 
index b060a19094677fb374ab244d28c32bd368691dd2..b86b346164d9fb2ebffe982be39905ee3168ece8 100644 (file)
@@ -20044,6 +20044,9 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
   tree pack, packs = NULL_TREE;
   int i, start = TREE_VEC_LENGTH (packed_parms) - 1;
 
+  /* Add in any args remembered from an earlier partial instantiation.  */
+  targs = add_to_template_args (PACK_EXPANSION_EXTRA_ARGS (parm), targs);
+
   packed_args = expand_template_argument_pack (packed_args);
 
   int len = TREE_VEC_LENGTH (packed_args);
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-partial1.C b/gcc/testsuite/g++.dg/cpp0x/variadic-partial1.C
new file mode 100644 (file)
index 0000000..6f8df3e
--- /dev/null
@@ -0,0 +1,22 @@
+// PR c++/72801
+// { dg-do compile { target c++11 } }
+
+template < typename, typename > struct A {};
+
+template < typename ... T > struct B
+{ 
+  template < typename > struct C
+  { 
+    static const int a = 0;
+  };
+
+  template < typename R, typename ... S >
+  struct C < R (A < T, S > ...) >
+  { 
+    static const int a = 1;
+  };
+};
+
+#define SA(X) static_assert ((X), #X)
+SA(B <>::C<int()>::a == 1);
+