Hi!

If the pack is unnamed, make_ith_pack_parameter_name will crash.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
acked by Jason in the PR, committed to trunk so far.

2012-12-01  Jakub Jelinek  <ja...@redhat.com>

        PR c++/55542
        * pt.c (make_ith_pack_parameter_name): Return NULL if
        name is NULL.
        (tsubst_decl): Call make_ith_pack_parameter_name even if
        DECL_NAME is NULL.

        * g++.dg/cpp0x/vt-55542.C: New test.

--- gcc/cp/pt.c.jj      2012-11-19 14:41:16.000000000 +0100
+++ gcc/cp/pt.c 2012-11-30 09:24:45.716620002 +0100
@@ -2905,6 +2905,8 @@ make_ith_pack_parameter_name (tree name,
   char* newname;
   int newname_len;
 
+  if (name == NULL_TREE)
+    return name;
   snprintf (numbuf, NUMBUF_LEN, "%i", i);
   newname_len = IDENTIFIER_LENGTH (name)
                + strlen (numbuf) + 2;
@@ -10267,10 +10269,9 @@ tsubst_decl (tree t, tree args, tsubst_f
                 /* Get the Ith type.  */
                 type = TREE_VEC_ELT (expanded_types, i);
 
-                if (DECL_NAME (r))
-                  /* Rename the parameter to include the index.  */
-                  DECL_NAME (r) =
-                    make_ith_pack_parameter_name (DECL_NAME (r), i);
+               /* Rename the parameter to include the index.  */
+               DECL_NAME (r)
+                 = make_ith_pack_parameter_name (DECL_NAME (r), i);
               }
             else if (!type)
               /* We're dealing with a normal parameter.  */
--- gcc/testsuite/g++.dg/cpp0x/vt-55542.C.jj    2012-11-30 09:37:14.042107481 
+0100
+++ gcc/testsuite/g++.dg/cpp0x/vt-55542.C       2012-11-30 09:35:02.000000000 
+0100
@@ -0,0 +1,22 @@
+// PR c++/55542
+// { dg-options "-std=c++11" }
+
+template <typename ... P>
+struct B
+{
+  template <typename O>
+  B (O *o, void (O::*f) (P ... p)) {}
+};
+class C
+{
+  void foo (void *, int);
+  template <typename ... A>
+  void bar (A ... a);
+  B <void *> c;
+  B <void *, int> d;
+  C (int) : c (this, &C::bar), d (this, &C::foo) {}
+};
+template <typename ... A>
+void C::bar (A ...)
+{
+}

        Jakub

Reply via email to