From bc7f13bf15c30ee57601c3ec0c8390cfc15e01db Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 25 May 2011 10:32:06 -0400 Subject: [PATCH] re PR c++/48292 ([C++0x] "sorry, unimplemented: use of 'type_pack_expansion' in template") 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 | 5 +++++ gcc/cp/pt.c | 15 ++++++++++----- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/cpp0x/variadic109.C | 17 +++++++++++++++++ 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic109.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fc9b883f637..57321507c81 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2011-05-25 Jason Merrill + 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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index bd9aeba91b8..fc84314daaf 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4258b91106c..9f13b0d7573 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-05-25 Jason Merrill + + * g++.dg/cpp0x/variadic109.C: New. + 2011-05-25 H.J. Lu * 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 index 00000000000..0ec69af812e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic109.C @@ -0,0 +1,17 @@ +// PR c++/48292 +// { dg-options -std=c++0x } + +template int g(Args...); + +template +struct A +{ + template + static auto f(Args... args) -> decltype(g(args...)); +}; + +int main() +{ + A<>::f(); + return 0; +}