mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-08 19:20:44 +08:00
re PR c++/50086 ([C++0x] Error on lookup of template function address with variadic template arguments)
PR c++/50086 * pt.c (unify_pack_expansion): Correct overloaded unification logic. From-SVN: r177813
This commit is contained in:
parent
41669f5149
commit
fd4198e6b8
@ -1,5 +1,9 @@
|
||||
2011-08-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/50086
|
||||
* pt.c (unify_pack_expansion): Correct overloaded unification
|
||||
logic.
|
||||
|
||||
* pt.c (instantiate_class_template_1): If DECL_PRESERVE_P is set
|
||||
on a member function or static data member, call mark_used.
|
||||
|
||||
|
33
gcc/cp/pt.c
33
gcc/cp/pt.c
@ -15434,7 +15434,6 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
|
||||
tree arg = TREE_VEC_ELT (packed_args, i);
|
||||
tree arg_expr = NULL_TREE;
|
||||
int arg_strict = strict;
|
||||
bool skip_arg_p = false;
|
||||
|
||||
if (call_args_p)
|
||||
{
|
||||
@ -15477,19 +15476,15 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
|
||||
if (resolve_overloaded_unification
|
||||
(tparms, targs, parm, arg,
|
||||
(unification_kind_t) strict,
|
||||
sub_strict, explain_p)
|
||||
!= 0)
|
||||
return 1;
|
||||
skip_arg_p = true;
|
||||
sub_strict, explain_p))
|
||||
goto unified;
|
||||
return unify_overload_resolution_failure (explain_p, arg);
|
||||
}
|
||||
|
||||
if (!skip_arg_p)
|
||||
{
|
||||
arg_expr = arg;
|
||||
arg = unlowered_expr_type (arg);
|
||||
if (arg == error_mark_node)
|
||||
return 1;
|
||||
}
|
||||
arg_expr = arg;
|
||||
arg = unlowered_expr_type (arg);
|
||||
if (arg == error_mark_node)
|
||||
return unify_invalid (explain_p);
|
||||
}
|
||||
|
||||
arg_strict = sub_strict;
|
||||
@ -15500,16 +15495,14 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
|
||||
&parm, &arg, arg_expr);
|
||||
}
|
||||
|
||||
if (!skip_arg_p)
|
||||
{
|
||||
/* For deduction from an init-list we need the actual list. */
|
||||
if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr))
|
||||
arg = arg_expr;
|
||||
RECUR_AND_CHECK_FAILURE (tparms, targs, parm, arg, arg_strict,
|
||||
explain_p);
|
||||
}
|
||||
/* For deduction from an init-list we need the actual list. */
|
||||
if (arg_expr && BRACE_ENCLOSED_INITIALIZER_P (arg_expr))
|
||||
arg = arg_expr;
|
||||
RECUR_AND_CHECK_FAILURE (tparms, targs, parm, arg, arg_strict,
|
||||
explain_p);
|
||||
}
|
||||
|
||||
unified:
|
||||
/* For each parameter pack, collect the deduced value. */
|
||||
for (pack = packs; pack; pack = TREE_CHAIN (pack))
|
||||
{
|
||||
|
@ -1,5 +1,8 @@
|
||||
2011-08-16 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/50086
|
||||
* g++.dg/cpp0x/variadic-unresolved.C: New.
|
||||
|
||||
* g++.old-deja/g++.brendan/README: Add R.I.P.
|
||||
|
||||
* g++.dg/ext/attr-used-1.C: New.
|
||||
|
12
gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C
Normal file
12
gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C
Normal file
@ -0,0 +1,12 @@
|
||||
// PR c++/50086
|
||||
// { dg-options -std=c++0x }
|
||||
|
||||
template<typename T> void tfun();
|
||||
template<typename T> void fun1(T);
|
||||
template<typename... Types> void fun2(Types... args);
|
||||
|
||||
int main()
|
||||
{
|
||||
fun1(tfun<int>); // ok
|
||||
fun2(tfun<int>); // error: unresolved overloaded function type
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user