re PR c++/48292 ([C++0x] "sorry, unimplemented: use of 'type_pack_expansion' in templ...
authorJason Merrill <jason@redhat.com>
Wed, 25 May 2011 14:32:06 +0000 (10:32 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 25 May 2011 14:32:06 +0000 (10:32 -0400)
PR c++/48292
* pt.c (tsubst_decl) [PARM_DECL]: Handle partial instantiation of
function parameter pack.
(tsubst_pack_expansion): Likewise.

From-SVN: r174201

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

index fc9b883f63715c296da7b3edbd5b18c3ef0f7849..57321507c8109d36733b201d9f1f8e162d1e8a99 100644 (file)
@@ -1,5 +1,10 @@
 2011-05-25  Jason Merrill  <jason@redhat.com>
 
+       PR c++/48292
+       * pt.c (tsubst_decl) [PARM_DECL]: Handle partial instantiation of
+       function parameter pack.
+       (tsubst_pack_expansion): Likewise.
+
        * cp-objcp-common.c (cp_common_init_ts): TYPE_ARGUMENT_PACK has
        TS_COMMON.
 
index bd9aeba91b8fec234e6bc67253ff1601ccede5da..fc84314daafde4a07d416001ee997f32b247cad4 100644 (file)
@@ -8711,7 +8711,12 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain,
                 have the wrong value for a recursive call.  Just make a
                 dummy decl, since it's only used for its type.  */
              arg_pack = tsubst_decl (parm_pack, args, complain);
-             arg_pack = make_fnparm_pack (arg_pack);
+             if (arg_pack && FUNCTION_PARAMETER_PACK_P (arg_pack))
+               /* Partial instantiation of the parm_pack, we can't build
+                  up an argument pack yet.  */
+               arg_pack = NULL_TREE;
+             else
+               arg_pack = make_fnparm_pack (arg_pack);
            }
        }
       else
@@ -9801,14 +9806,14 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
             if (DECL_TEMPLATE_PARM_P (t))
               SET_DECL_TEMPLATE_PARM_P (r);
 
-           /* An argument of a function parameter pack is not a parameter
-              pack.  */
-           FUNCTION_PARAMETER_PACK_P (r) = false;
-
             if (expanded_types)
               /* We're on the Ith parameter of the function parameter
                  pack.  */
               {
+               /* An argument of a function parameter pack is not a parameter
+                  pack.  */
+               FUNCTION_PARAMETER_PACK_P (r) = false;
+
                 /* Get the Ith type.  */
                 type = TREE_VEC_ELT (expanded_types, i);
 
index 4258b91106cd389d30b01041da0826265b0da000..9f13b0d757357d2f6bd52b32200552eff1db215c 100644 (file)
@@ -1,3 +1,7 @@
+2011-05-25  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/variadic109.C: New.
+
 2011-05-25  H.J. Lu  <hongjiu.lu@intel.com>
 
         * gcc.target/i386/pause-1.c: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic109.C b/gcc/testsuite/g++.dg/cpp0x/variadic109.C
new file mode 100644 (file)
index 0000000..0ec69af
--- /dev/null
@@ -0,0 +1,17 @@
+// PR c++/48292
+// { dg-options -std=c++0x }
+
+template <typename... Args> int g(Args...);
+
+template <int N = 0>
+struct A
+{
+    template <typename... Args>
+    static auto f(Args... args) -> decltype(g(args...));
+};
+
+int main()
+{
+    A<>::f();
+    return 0;
+}