summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaOverload.cpp14
-rw-r--r--clang/test/CXX/over/over.match/over.match.best/p2.cpp16
2 files changed, 22 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index c5ada02ba89..9a9843827b3 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 00000000000..3a444366557
--- /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@-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}}
+}
OpenPOWER on IntegriCloud