aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2010-01-07 19:21:46 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2010-01-07 20:21:46 +0100
commitc8f4e43a8c80cc3262b91d969a5420da62dae306 (patch)
treec6ba028fdb64ff90cbb07c7f3741fe2f070b3bfb
parentf52ac76fa9e3b61eae00ee131d4a1215e641b2e1 (diff)
downloadgcc-c8f4e43a8c80cc3262b91d969a5420da62dae306.zip
gcc-c8f4e43a8c80cc3262b91d969a5420da62dae306.tar.gz
gcc-c8f4e43a8c80cc3262b91d969a5420da62dae306.tar.bz2
re PR c++/40155 ([c++0x] variadic template pack problem)
Fix PR c++/40155 gcc/cp/ChangeLog: c++/40155 * pt.c (unify_pack_expansion): In non-deduced contexts, re-use template arguments that were previously deduced. gcc/testsuite/ChangeLog: c++/40155 * g++.dg/cpp0x/variadic-unify-2.C: New test. From-SVN: r155705
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c25
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C14
4 files changed, 32 insertions, 18 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 158e80d..07a3486 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2010-01-07 Dodji Seketeli <dodji@redhat.com>
+
+ c++/40155
+ * pt.c (unify_pack_expansion): In non-deduced contexts, re-use template
+ arguments that were previously deduced.
+
2010-01-05 Jason Merrill <jason@redhat.com>
* pt.c (unify_pack_expansion): Handle deduction from init-list.
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index d814736..f27b931 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -14074,8 +14074,15 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
tree old_pack = TREE_VALUE (pack);
tree new_args = TREE_TYPE (pack);
int i, len = TREE_VEC_LENGTH (new_args);
+ int idx, level;
bool nondeduced_p = false;
+ /* By default keep the original deduced argument pack.
+ If necessary, more specific code is going to update the
+ resulting deduced argument later down in this function. */
+ template_parm_level_and_index (TREE_PURPOSE (pack), &level, &idx);
+ TMPL_ARG (targs, level, idx) = old_pack;
+
/* If NEW_ARGS contains any NULL_TREE entries, we didn't
actually deduce anything. */
for (i = 0; i < len && !nondeduced_p; ++i)
@@ -14106,10 +14113,6 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
if (!old_pack)
{
tree result;
- int idx, level;
-
- template_parm_level_and_index (TREE_PURPOSE (pack), &level, &idx);
-
/* Build the deduced *_ARGUMENT_PACK. */
if (TREE_CODE (TREE_PURPOSE (pack)) == TEMPLATE_PARM_INDEX)
{
@@ -14133,12 +14136,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
{
/* We only had the explicitly-provided arguments before, but
now we have a complete set of arguments. */
- int idx, level;
tree explicit_args = ARGUMENT_PACK_EXPLICIT_ARGS (old_pack);
- template_parm_level_and_index (TREE_PURPOSE (pack), &level, &idx);
-
- /* Keep the original deduced argument pack. */
- TMPL_ARG (targs, level, idx) = old_pack;
SET_ARGUMENT_PACK_ARGS (old_pack, new_args);
ARGUMENT_PACK_INCOMPLETE_P (old_pack) = 1;
@@ -14148,15 +14146,6 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
new_args))
/* Inconsistent unification of this parameter pack. */
return 1;
- else
- {
- int idx, level;
-
- template_parm_level_and_index (TREE_PURPOSE (pack), &level, &idx);
-
- /* Keep the original deduced argument pack. */
- TMPL_ARG (targs, level, idx) = old_pack;
- }
}
return 0;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d68e6e9..f222396 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-07 Dodji Seketeli <dodji@redhat.com>
+
+ c++/40155
+ * g++.dg/cpp0x/variadic-unify-2.C: New test.
+
2010-01-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/42625
diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C b/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C
new file mode 100644
index 0000000..80c9f5d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C
@@ -0,0 +1,14 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/40155
+// { dg-options "-std=c++0x" }
+// { dg-do compile }
+
+template <typename T> struct identity
+{ typedef T type; };
+
+template <typename RT, typename... A>
+int forward_call(RT (*) (A...), typename identity<A>::type...);
+
+int g (double);
+
+int i = forward_call(&g, 0);