]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/12266 (incorrect instantiation of unneeded template during overload resolution)
authorMark Mitchell <mark@codesourcery.com>
Wed, 17 Sep 2003 23:42:55 +0000 (23:42 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 17 Sep 2003 23:42:55 +0000 (23:42 +0000)
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

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/overload/template1.C [new file with mode: 0644]

index 24f82d76f34838638f35fda76ed46cf173933a69..7d3ddc36d90069fcea1f59be69f5fde7cd971106 100644 (file)
@@ -1,5 +1,12 @@
 2003-09-17  Mark Mitchell  <mark@codesourcery.com>
 
+       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.
index 214fbae07a38917ee70d2428f78092a6c949122d..4f86cc67c3c8e814f07da5b207ca273020fc1c0b 100644 (file)
@@ -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);
index 1809f2d4961c2f756f4a03887fce3943d8a7ce1f..b76e7db4243a444b97c007b691883e23d42c8732 100644 (file)
@@ -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);
index dfa298f5379d5f05af9884bc03200b6631663647..ef38d5565d801b43e0f1864b2873fba27a175c14 100644 (file)
@@ -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.  */
index fae6be7893f944f647598a7fe0d88ea9b548a472..2bd53c546a85d87be7bc1281bcd714af1538f5a6 100644 (file)
@@ -1,3 +1,8 @@
+2003-09-17  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/12266
+       * g++.dg/overload/template1.C: New test.
+
 2003-09-17  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * 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 (file)
index 0000000..5bfad84
--- /dev/null
@@ -0,0 +1,12 @@
+template<typename T> T Foo (int) {T d;}
+
+void Baz (void (*)(int), int);
+
+int Foo ();
+int Baz (int (*)(), float);
+
+void Bar ()
+{
+  Baz (Foo, 1.0f);
+  
+}