summaryrefslogtreecommitdiffstats
path: root/clang/test/CXX/class/class.compare
diff options
context:
space:
mode:
authorRichard Smith <richard@metafoo.co.uk>2020-01-31 13:05:07 -0800
committerRichard Smith <richard@metafoo.co.uk>2020-01-31 13:08:25 -0800
commitfdedf39c46f526afb1c07b0ca91a7c5bc1e43b8f (patch)
treeba69121c31b2eee5fd4e8ed7cd8b4494401770b3 /clang/test/CXX/class/class.compare
parent8be11623043c54cc42d7d0a7fac7408efce4ef41 (diff)
downloadbcm5719-llvm-fdedf39c46f526afb1c07b0ca91a7c5bc1e43b8f.tar.gz
bcm5719-llvm-fdedf39c46f526afb1c07b0ca91a7c5bc1e43b8f.zip
PR44723: Trigger return type deduction for operator<=>s whose return
types are needed to compute the return type of a defaulted operator<=>. This raises the question of what to do if return type deduction fails. The standard doesn't say, and implementations vary, so for now reject that case eagerly to keep our options open. (cherry picked from commit 42d4a55f227a1cc78ab8071062d869abe88655d9)
Diffstat (limited to 'clang/test/CXX/class/class.compare')
-rw-r--r--clang/test/CXX/class/class.compare/class.spaceship/p2.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp b/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp
index a912384ccf7..dae31e925ba 100644
--- a/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp
+++ b/clang/test/CXX/class/class.compare/class.spaceship/p2.cpp
@@ -97,6 +97,39 @@ namespace Deduction {
// Check that the above mechanism works.
template void f<std::strong_ordering, weak>(); // expected-note {{instantiation of}}
+
+ std::strong_ordering x = A<strong>() <=> A<strong>();
+}
+
+namespace PR44723 {
+ // Make sure we trigger return type deduction for a callee 'operator<=>'
+ // before inspecting its return type.
+ template<int> struct a {
+ friend constexpr auto operator<=>(a const &lhs, a const &rhs) {
+ return std::strong_ordering::equal;
+ }
+ };
+ struct b {
+ friend constexpr auto operator<=>(b const &, b const &) = default;
+ a<0> m_value;
+ };
+ std::strong_ordering cmp_b = b() <=> b();
+
+ struct c {
+ auto operator<=>(const c&) const&; // expected-note {{selected 'operator<=>' for base class 'c' declared here}}
+ };
+ struct d : c { // expected-note {{base class 'c' declared here}}
+ friend auto operator<=>(const d&, const d&) = default; // #d
+ // expected-error@#d {{return type of defaulted 'operator<=>' cannot be deduced because three-way comparison for base class 'c' has a deduced return type and is not yet defined}}
+ // expected-warning@#d {{implicitly deleted}}
+ };
+ auto c::operator<=>(const c&) const& { // #c
+ return std::strong_ordering::equal;
+ }
+ // expected-error@+1 {{overload resolution selected deleted operator '<=>'}}
+ std::strong_ordering cmp_d = d() <=> d();
+ // expected-note@#c 2{{candidate}}
+ // expected-note@#d {{candidate function has been implicitly deleted}}
}
namespace BadDeducedType {
OpenPOWER on IntegriCloud