[llvm-branch-commits] [clang] 300cbdc - PR44761: Fix fallback to later tiebreakers if two non-template functions

Richard Smith via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Feb 4 12:23:02 PST 2020


Author: Richard Smith
Date: 2020-02-04T12:22:49-08:00
New Revision: 300cbdc59da05756f7a0334338076124536df03d

URL: https://github.com/llvm/llvm-project/commit/300cbdc59da05756f7a0334338076124536df03d
DIFF: https://github.com/llvm/llvm-project/commit/300cbdc59da05756f7a0334338076124536df03d.diff

LOG: PR44761: Fix fallback to later tiebreakers if two non-template functions
are equally constrained.

(cherry picked from commit cfacf9ae20b8c97a428f118a2720bc109ba6a143)

Added: 
    clang/test/CXX/over/over.match/over.match.best/p2.cpp

Modified: 
    clang/lib/Sema/SemaOverload.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index c5ada02ba898..9a9843827b3f 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -9579,17 +9579,15 @@ bool clang::isBetterOverloadCandidate(
       if (RC1 && RC2) {
         bool AtLeastAsConstrained1, AtLeastAsConstrained2;
         if (S.IsAtLeastAsConstrained(Cand1.Function, {RC1}, Cand2.Function,
-                                     {RC2}, AtLeastAsConstrained1))
-          return false;
-        if (!AtLeastAsConstrained1)
-          return false;
-        if (S.IsAtLeastAsConstrained(Cand2.Function, {RC2}, Cand1.Function,
+                                     {RC2}, AtLeastAsConstrained1) ||
+            S.IsAtLeastAsConstrained(Cand2.Function, {RC2}, Cand1.Function,
                                      {RC1}, AtLeastAsConstrained2))
           return false;
-        if (!AtLeastAsConstrained2)
-          return true;
-      } else if (RC1 || RC2)
+        if (AtLeastAsConstrained1 != AtLeastAsConstrained2)
+          return AtLeastAsConstrained1;
+      } else if (RC1 || RC2) {
         return RC1 != nullptr;
+      }
     }
   }
 

diff  --git a/clang/test/CXX/over/over.match/over.match.best/p2.cpp b/clang/test/CXX/over/over.match/over.match.best/p2.cpp
new file mode 100644
index 000000000000..3a4443665576
--- /dev/null
+++ b/clang/test/CXX/over/over.match/over.match.best/p2.cpp
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -std=c++2a -verify %s
+
+namespace PR44761 {
+  template<typename T> concept X = (sizeof(T) == sizeof(T));
+
+  template<typename T> struct A {
+    bool operator<(const A&) const & requires X<T>; // #1
+    int operator<=>(const A&) const & requires X<T> && X<int> = delete; // #2
+  };
+  bool k1 = A<int>() < A<int>(); // not ordered by constraints: prefer non-rewritten form
+  bool k2 = A<float>() < A<float>(); // prefer more-constrained 'operator<=>'
+  // expected-error at -1 {{deleted}}
+  // expected-note@#1 {{candidate}}
+  // expected-note@#2 {{candidate function has been explicitly deleted}}
+  // expected-note@#2 {{candidate function (with reversed parameter order) has been explicitly deleted}}
+}


        


More information about the llvm-branch-commits mailing list