PR c++/81843 - ICE with variadic member template.
authorJason Merrill <jason@redhat.com>
Wed, 17 Jan 2018 17:44:35 +0000 (12:44 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 17 Jan 2018 17:44:35 +0000 (12:44 -0500)
PR c++/72801
* pt.c (unify_pack_expansion): Don't try to deduce enclosing
template args.

From-SVN: r256802

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

index ed44be73fd1a6082794b32aaf7e7cd39c4657bef..ff09fe32fdb53605f934c42b9cf86140f2b47dee 100644 (file)
@@ -1,3 +1,10 @@
+2018-01-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/81843 - ICE with variadic member template.
+       PR c++/72801
+       * pt.c (unify_pack_expansion): Don't try to deduce enclosing
+       template args.
+
 2018-01-17  David Malcolm  <dmalcolm@redhat.com>
 
        PR c++/83799
index 85997e2fd518d56ecf0acbee2f22272d2b0f91cd..3d7d45864c62253c2689e2e1df597f05609caa69 100644 (file)
@@ -20370,6 +20370,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
 
   /* Add in any args remembered from an earlier partial instantiation.  */
   targs = add_to_template_args (PACK_EXPANSION_EXTRA_ARGS (parm), targs);
+  int levels = TMPL_ARGS_DEPTH (targs);
 
   packed_args = expand_template_argument_pack (packed_args);
 
@@ -20385,6 +20386,8 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
 
       /* Determine the index and level of this parameter pack.  */
       template_parm_level_and_index (parm_pack, &level, &idx);
+      if (level < levels)
+       continue;
 
       /* Keep track of the parameter packs and their corresponding
          argument packs.  */
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic171.C b/gcc/testsuite/g++.dg/cpp0x/variadic171.C
new file mode 100644 (file)
index 0000000..1e26814
--- /dev/null
@@ -0,0 +1,12 @@
+// PR c++/81843
+// { dg-do compile { target c++11 } }
+
+template < typename > struct A;
+template < typename, typename > struct B;
+template < typename ... S > struct C
+{
+  template < typename > struct D {};
+  template < typename ... T > struct D < A < B < S, T > ... > >;
+};
+
+C <>::D < A < B < int, int > > > c;