diff options
author | Richard Smith <richard@metafoo.co.uk> | 2019-12-05 18:51:19 -0800 |
---|---|---|
committer | Richard Smith <richard@metafoo.co.uk> | 2019-12-09 14:54:06 -0800 |
commit | e6e6e34b95cfe03275943fde0db259cc7d57f4ad (patch) | |
tree | e646ed63dcfd9eaa1cd158b0e9220dbb6da9cac0 /clang/test/CXX/class/class.compare/class.compare.default/p5.cpp | |
parent | 295db41ce230d9b0f1e0d24829abf0fb772b31ff (diff) | |
download | bcm5719-llvm-e6e6e34b95cfe03275943fde0db259cc7d57f4ad.tar.gz bcm5719-llvm-e6e6e34b95cfe03275943fde0db259cc7d57f4ad.zip |
[c++20] Defaulted comparison support for array members.
Diffstat (limited to 'clang/test/CXX/class/class.compare/class.compare.default/p5.cpp')
-rw-r--r-- | clang/test/CXX/class/class.compare/class.compare.default/p5.cpp | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/clang/test/CXX/class/class.compare/class.compare.default/p5.cpp b/clang/test/CXX/class/class.compare/class.compare.default/p5.cpp index f863ed09bc6..5489051a29c 100644 --- a/clang/test/CXX/class/class.compare/class.compare.default/p5.cpp +++ b/clang/test/CXX/class/class.compare/class.compare.default/p5.cpp @@ -12,7 +12,7 @@ namespace std { // Check that we compare subobjects in the right order. struct Log { - char buff[8] = {}; + char buff[10] = {}; int n = 0; constexpr void add(char c) { buff[n++] = c; } constexpr bool operator==(const char *p) const { return __builtin_strcmp(p, buff) == 0; } @@ -24,22 +24,37 @@ template<char C> struct B { constexpr std::strong_ordering operator<=>(const B&) const { log->add(C); return {0}; } }; +template<typename T> constexpr bool check(bool which, const char *str) { + Log log; + T c(&log); + (void)(which ? c == c : c <=> c); + return log == str; +} + struct C : B<'a'>, B<'b'> { + B<'r'> r[3]; B<'c'> c; + B<'s'> s[2]; B<'d'> d; - // FIXME: Test arrays once we handle them properly. - constexpr C(Log *p) : B<'a'>{p}, B<'b'>{p}, c{p}, d{p} {} + constexpr C(Log *p) : B<'a'>{p}, B<'b'>{p}, r{p, p, p}, c{p}, s{p, p}, d{p} {} bool operator==(const C&) const = default; std::strong_ordering operator<=>(const C&) const = default; }; -constexpr bool check(bool which) { - Log log; - C c(&log); - (void)(which ? c == c : c <=> c); - return log == "abcd"; -} -static_assert(check(false)); -static_assert(check(true)); +static_assert(check<C>(false, "abrrrcssd")); +static_assert(check<C>(true, "abrrrcssd")); + +struct D { + B<'x'> x; + B<'y'> y[2]; + + constexpr D(Log *p) : x{p}, y{p, p} {} + + bool operator==(const D&) const = default; + std::strong_ordering operator<=>(const D&) const = default; +}; + +static_assert(check<D>(false, "xyy")); +static_assert(check<D>(true, "xyy")); |