PR c++/51079, DR 495
authorJason Merrill <jason@redhat.com>
Thu, 10 Nov 2011 20:28:16 +0000 (15:28 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 10 Nov 2011 20:28:16 +0000 (15:28 -0500)
PR c++/51079, DR 495
* call.c (joust): Check the second conversion sequence
before checking templates.

From-SVN: r181270

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

index 33bfa33..4492b3b 100644 (file)
@@ -1,3 +1,9 @@
+2011-11-10  Jason Merrill  <jason@redhat.com>
+
+       PR c++/51079, DR 495
+       * call.c (joust): Check the second conversion sequence
+       before checking templates.
+
 2011-11-09  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/50837
index 578905e..e81950c 100644 (file)
@@ -8109,6 +8109,22 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
   if (winner)
     return winner;
 
+  /* DR 495 moved this tiebreaker above the template ones.  */
+  /* or, if not that,
+     the  context  is  an  initialization by user-defined conversion (see
+     _dcl.init_  and  _over.match.user_)  and  the  standard   conversion
+     sequence  from  the return type of F1 to the destination type (i.e.,
+     the type of the entity being initialized)  is  a  better  conversion
+     sequence  than the standard conversion sequence from the return type
+     of F2 to the destination type.  */
+
+  if (cand1->second_conv)
+    {
+      winner = compare_ics (cand1->second_conv, cand2->second_conv);
+      if (winner)
+       return winner;
+    }
+
   /* or, if not that,
      F1 is a non-template function and F2 is a template function
      specialization.  */
@@ -8137,21 +8153,6 @@ joust (struct z_candidate *cand1, struct z_candidate *cand2, bool warn)
        return winner;
     }
 
-  /* or, if not that,
-     the  context  is  an  initialization by user-defined conversion (see
-     _dcl.init_  and  _over.match.user_)  and  the  standard   conversion
-     sequence  from  the return type of F1 to the destination type (i.e.,
-     the type of the entity being initialized)  is  a  better  conversion
-     sequence  than the standard conversion sequence from the return type
-     of F2 to the destination type.  */
-
-  if (cand1->second_conv)
-    {
-      winner = compare_ics (cand1->second_conv, cand2->second_conv);
-      if (winner)
-       return winner;
-    }
-
   /* Check whether we can discard a builtin candidate, either because we
      have two identical ones or matching builtin and non-builtin candidates.
 
index f3315cb..e57b535 100644 (file)
@@ -1,5 +1,8 @@
 2011-11-10  Jason Merrill  <jason@redhat.com>
 
+       PR c++/51079
+       * g++.dg/template/conv12.C: New.
+
        PR debug/50983
        * gcc.dg/debug/dwarf2/asm-line1.c: New.
 
diff --git a/gcc/testsuite/g++.dg/template/conv12.C b/gcc/testsuite/g++.dg/template/conv12.C
new file mode 100644 (file)
index 0000000..e6af054
--- /dev/null
@@ -0,0 +1,25 @@
+// PR c++/51079
+
+#if __cplusplus > 199711L
+struct C1
+{
+  template <class T>
+  operator T() = delete;       // { dg-message "declared here" "" { target c++11 } }
+  operator bool() { return false; }
+} c1;
+
+int ic1 = c1;                  // { dg-error "deleted" "" { target c++11 } }
+int ac1 = c1 + c1;             // { dg-error "deleted" "" { target c++11 } }
+#endif
+
+struct C2
+{
+private:
+  template <class T>
+  operator T();                        // { dg-error "private" }
+public:
+  operator bool() { return false; }
+} c2;
+
+int ic2 = c2;                  // { dg-error "" }
+int ac2 = c2 + c2;             // { dg-error "" }