re PR c++/58119 (Invalid ambiguous default type conversion with only a single invalid...
authorJason Merrill <jason@redhat.com>
Tue, 20 Aug 2013 12:58:47 +0000 (08:58 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 20 Aug 2013 12:58:47 +0000 (08:58 -0400)
PR c++/58119
* cvt.c (build_expr_type_conversion): Don't complain about a
template that can't match the desired type category.

From-SVN: r201880

gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/testsuite/g++.dg/template/delete2.C [new file with mode: 0644]

index 5f55ca2e3ae40cb6685880395c725ff9875a30fd..c18bcb522634182b82f86475b95132e79db2ea75 100644 (file)
@@ -1,3 +1,9 @@
+2013-08-20  Jason Merrill  <jason@redhat.com>
+
+       PR c++/58119
+       * cvt.c (build_expr_type_conversion): Don't complain about a
+       template that can't match the desired type category.
+
 2013-08-20  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
        * error.c (pp_ggc_formatted_text): New.
index 532e8fd9d6bd9468b495dcd70be8d8d39d928c4b..08c026da1788ee9ad01ffee821e37cb1ec4eb316 100644 (file)
@@ -1590,17 +1590,6 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
       if (DECL_NONCONVERTING_P (cand))
        continue;
 
-      if (TREE_CODE (cand) == TEMPLATE_DECL)
-       {
-         if (complain)
-           {
-             error ("ambiguous default type conversion from %qT",
-                    basetype);
-             error ("  candidate conversions include %qD", cand);
-           }
-         return error_mark_node;
-       }
-
       candidate = non_reference (TREE_TYPE (TREE_TYPE (cand)));
 
       switch (TREE_CODE (candidate))
@@ -1634,11 +1623,23 @@ build_expr_type_conversion (int desires, tree expr, bool complain)
          break;
 
        default:
+         /* A wildcard could be instantiated to match any desired
+            type, but we can't deduce the template argument.  */
+         if (WILDCARD_TYPE_P (candidate))
+           win = true;
          break;
        }
 
       if (win)
        {
+         if (TREE_CODE (cand) == TEMPLATE_DECL)
+           {
+             if (complain)
+               error ("default type conversion can't deduce template"
+                      " argument for %qD", cand);
+             return error_mark_node;
+           }
+
          if (winner)
            {
              tree winner_type
diff --git a/gcc/testsuite/g++.dg/template/delete2.C b/gcc/testsuite/g++.dg/template/delete2.C
new file mode 100644 (file)
index 0000000..b6ab380
--- /dev/null
@@ -0,0 +1,26 @@
+// PR c++/58119
+
+template <class T>
+struct A
+{
+  operator T*();
+  template <class U>
+  operator A<U>();
+};
+
+template <class T>
+struct B
+{
+  operator T*();
+  template <class U>
+  operator A<U>*();
+};
+
+int main()
+{
+  A<int> a;
+  delete a;
+
+  B<int> b;
+  delete b;                    // { dg-error "template|delete" }
+}