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
This commit is contained in:
parent
f52ac76fa9
commit
c8f4e43a8c
@ -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.
|
||||
|
25
gcc/cp/pt.c
25
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;
|
||||
|
@ -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
|
||||
|
14
gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C
Normal file
14
gcc/testsuite/g++.dg/cpp0x/variadic-unify-2.C
Normal file
@ -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);
|
Loading…
Reference in New Issue
Block a user