Commit c8f4e43a by Dodji Seketeli Committed by Dodji Seketeli

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
parent f52ac76f
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> 2010-01-05 Jason Merrill <jason@redhat.com>
* pt.c (unify_pack_expansion): Handle deduction from init-list. * pt.c (unify_pack_expansion): Handle deduction from init-list.
......
...@@ -14074,8 +14074,15 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, ...@@ -14074,8 +14074,15 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
tree old_pack = TREE_VALUE (pack); tree old_pack = TREE_VALUE (pack);
tree new_args = TREE_TYPE (pack); tree new_args = TREE_TYPE (pack);
int i, len = TREE_VEC_LENGTH (new_args); int i, len = TREE_VEC_LENGTH (new_args);
int idx, level;
bool nondeduced_p = false; 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 /* If NEW_ARGS contains any NULL_TREE entries, we didn't
actually deduce anything. */ actually deduce anything. */
for (i = 0; i < len && !nondeduced_p; ++i) for (i = 0; i < len && !nondeduced_p; ++i)
...@@ -14106,10 +14113,6 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, ...@@ -14106,10 +14113,6 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
if (!old_pack) if (!old_pack)
{ {
tree result; tree result;
int idx, level;
template_parm_level_and_index (TREE_PURPOSE (pack), &level, &idx);
/* Build the deduced *_ARGUMENT_PACK. */ /* Build the deduced *_ARGUMENT_PACK. */
if (TREE_CODE (TREE_PURPOSE (pack)) == TEMPLATE_PARM_INDEX) if (TREE_CODE (TREE_PURPOSE (pack)) == TEMPLATE_PARM_INDEX)
{ {
...@@ -14133,12 +14136,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, ...@@ -14133,12 +14136,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
{ {
/* We only had the explicitly-provided arguments before, but /* We only had the explicitly-provided arguments before, but
now we have a complete set of arguments. */ now we have a complete set of arguments. */
int idx, level;
tree explicit_args = ARGUMENT_PACK_EXPLICIT_ARGS (old_pack); 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); SET_ARGUMENT_PACK_ARGS (old_pack, new_args);
ARGUMENT_PACK_INCOMPLETE_P (old_pack) = 1; ARGUMENT_PACK_INCOMPLETE_P (old_pack) = 1;
...@@ -14148,15 +14146,6 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms, ...@@ -14148,15 +14146,6 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
new_args)) new_args))
/* Inconsistent unification of this parameter pack. */ /* Inconsistent unification of this parameter pack. */
return 1; 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; return 0;
......
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> 2010-01-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/42625 PR tree-optimization/42625
......
// 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);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment