]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/58119
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Aug 2013 12:58:47 +0000 (12:58 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Aug 2013 12:58:47 +0000 (12:58 +0000)
* cvt.c (build_expr_type_conversion): Don't complain about a
template that can't match the desired type category.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201880 138bc75d-0d04-0410-961f-82ee72b054a4

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" }
+}