From: Mark Mitchell Date: Wed, 17 Sep 2003 23:42:55 +0000 (+0000) Subject: re PR c++/12266 (incorrect instantiation of unneeded template during overload resolution) X-Git-Tag: releases/gcc-3.4.0~3688 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8458320833c8fbfb61d9261c411ce072461b639b;p=thirdparty%2Fgcc.git re PR c++/12266 (incorrect instantiation of unneeded template during overload resolution) PR c++/12266 * cp-tree.h (tsubst_flags_t): Add tf_conv. * class.c (standard_conversion): Pass tf_conv to instantiate_type. (resolve_address_of_overloaded_function): Do not call mark_used when just checking conversions. PR c++/12266 * g++.dg/overload/template1.C: New test. From-SVN: r71483 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 24f82d76f348..7d3ddc36d900 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,12 @@ 2003-09-17 Mark Mitchell + PR c++/12266 + * cp-tree.h (tsubst_flags_t): Add tf_conv. + * class.c (standard_conversion): Pass tf_conv to + instantiate_type. + (resolve_address_of_overloaded_function): Do not call mark_used + when just checking conversions. + PR debug/12066 * cp-lang.c (LANG_HOOKS_BUILTIN_TYPE_DECLS): Define. * cp-tree.h (cxx_builtin_type_decls): Declare. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 214fbae07a38..4f86cc67c3c8 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -593,7 +593,7 @@ standard_conversion (tree to, tree from, tree expr) if ((TYPE_PTRFN_P (to) || TYPE_PTRMEMFUNC_P (to)) && expr && type_unknown_p (expr)) { - expr = instantiate_type (to, expr, tf_none); + expr = instantiate_type (to, expr, tf_conv); if (expr == error_mark_node) return NULL_TREE; from = TREE_TYPE (expr); diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 1809f2d4961c..b76e7db4243a 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5937,7 +5937,13 @@ cannot resolve overloaded function `%D' based on conversion to type `%T'", explained = 1; } } - mark_used (fn); + + /* If we're doing overload resolution purely for the purpose of + determining conversion sequences, we should not consider the + function used. If this conversion sequence is selected, the + function will be marked as used at this point. */ + if (!(flags & tf_conv)) + mark_used (fn); if (TYPE_PTRFN_P (target_type) || TYPE_PTRMEMFUNC_P (target_type)) return build_unary_op (ADDR_EXPR, fn, 0); diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index dfa298f5379d..ef38d5565d80 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3034,9 +3034,13 @@ typedef enum tsubst_flags_t { (lookup_template_class use) */ tf_stmt_expr_cmpd = 1 << 6, /* tsubsting the compound statement of a statement expr. */ - tf_stmt_expr_body = 1 << 7 /* tsubsting the statements in the + tf_stmt_expr_body = 1 << 7, /* tsubsting the statements in the body of the compound statement of a statement expr. */ + tf_conv = 1 << 8 /* We are determining what kind of + conversion might be permissible, + not actually performing the + conversion. */ } tsubst_flags_t; /* The kind of checking we can do looking in a class hierarchy. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fae6be7893f9..2bd53c546a85 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-09-17 Mark Mitchell + + PR c++/12266 + * g++.dg/overload/template1.C: New test. + 2003-09-17 Eric Botcazou * g++.dg/opt/cfg3.C: New test. diff --git a/gcc/testsuite/g++.dg/overload/template1.C b/gcc/testsuite/g++.dg/overload/template1.C new file mode 100644 index 000000000000..5bfad8464f7d --- /dev/null +++ b/gcc/testsuite/g++.dg/overload/template1.C @@ -0,0 +1,12 @@ +template T Foo (int) {T d;} + +void Baz (void (*)(int), int); + +int Foo (); +int Baz (int (*)(), float); + +void Bar () +{ + Baz (Foo, 1.0f); + +}