From: Jason Merrill Date: Tue, 16 Aug 2011 23:26:08 +0000 (-0400) Subject: re PR c++/50086 ([C++0x] Error on lookup of template function address with variadic... X-Git-Tag: releases/gcc-4.7.0~4425 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fd4198e6b89d8ccac63ff4112525bcf3ca7cf6f9;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c06a3078e440..4d6c353a178c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2011-08-16 Jason Merrill + 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. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9a4419a07835..9ab110aa225d 100644 --- a/gcc/cp/pt.c +++ b/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)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a9236cdf3aa..f435f140b853 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-08-16 Jason Merrill + 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. diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C b/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C new file mode 100644 index 000000000000..a8463de19808 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic-unresolved.C @@ -0,0 +1,12 @@ +// PR c++/50086 +// { dg-options -std=c++0x } + +template void tfun(); +template void fun1(T); +template void fun2(Types... args); + +int main() +{ + fun1(tfun); // ok + fun2(tfun); // error: unresolved overloaded function type +}