From a41bb2c947782287f983daac7807f0e0e4ef4b65 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 8 Oct 2014 17:05:50 -0400 Subject: [PATCH] re PR c++/63405 (ICE in cp_perform_integral_promotions, at cp/typeck.c:2084) PR c++/63405 * pt.c (tsubst_pack_expansion): Limit simple expansion to type packs. From-SVN: r216013 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/pt.c | 8 +++++++- gcc/testsuite/g++.dg/cpp0x/variadic162.C | 14 ++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic162.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 975193d6a12..1f9f4121cd1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-10-08 Jason Merrill + PR c++/63405 + * pt.c (tsubst_pack_expansion): Limit simple expansion to type packs. + PR c++/63485 * tree.c (build_cplus_array_type): Look for a type with no typedef-name or attributes. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d1dddff3ac2..7d380e54b4a 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9929,7 +9929,13 @@ tsubst_pack_expansion (tree t, tree args, tsubst_flags_t complain, /* If the expansion is just T..., return the matching argument pack. */ if (!unsubstituted_packs && TREE_PURPOSE (packs) == pattern) - return ARGUMENT_PACK_ARGS (TREE_VALUE (packs)); + { + tree args = ARGUMENT_PACK_ARGS (TREE_VALUE (packs)); + if (TREE_CODE (t) == TYPE_PACK_EXPANSION + || pack_expansion_args_count (args)) + return args; + /* Otherwise use the normal path so we get convert_from_reference. */ + } /* We cannot expand this expansion expression, because we don't have all of the argument packs we need. */ diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic162.C b/gcc/testsuite/g++.dg/cpp0x/variadic162.C new file mode 100644 index 00000000000..9e5386deb47 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic162.C @@ -0,0 +1,14 @@ +// PR c++/63405 +// { dg-do compile { target c++11 } } + +template _Tp forward(_Tp); +template struct Format { Format(int, Args); }; +template auto format(Args &&... args) -> Format { + return {0, args...}; +} + +template void msg(Args... args) { + format(forward(args)...); +} + +void some_function() { msg('x'); } -- 2.30.2