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:
Jason Merrill 2011-08-16 19:26:08 -04:00 committed by Jason Merrill
parent 41669f5149
commit fd4198e6b8
4 changed files with 32 additions and 20 deletions

View File

@ -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.

View File

@ -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))
{

View File

@ -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.

View 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
}