1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++03, c++11, c++14, c++17
// struct unreachable_sentinel_t;
// inline constexpr unreachable_sentinel_t unreachable_sentinel;
#include <iterator>
#include <cassert>
#include <concepts>
#include <type_traits>
#include "test_macros.h"
template<class T, class U>
concept weakly_equality_comparable_with = requires(const T& t, const U& u) {
{ t == u } -> std::same_as<bool>;
{ t != u } -> std::same_as<bool>;
{ u == t } -> std::same_as<bool>;
{ u != t } -> std::same_as<bool>;
};
constexpr bool test() {
static_assert(std::is_empty_v<std::unreachable_sentinel_t>);
static_assert(std::semiregular<std::unreachable_sentinel_t>);
static_assert(std::same_as<decltype(std::unreachable_sentinel), const std::unreachable_sentinel_t>);
auto sentinel = std::unreachable_sentinel;
int i = 42;
assert(i != sentinel);
assert(sentinel != i);
assert(!(i == sentinel));
assert(!(sentinel == i));
assert(&i != sentinel);
assert(sentinel != &i);
assert(!(&i == sentinel));
assert(!(sentinel == &i));
int *p = nullptr;
assert(p != sentinel);
assert(sentinel != p);
assert(!(p == sentinel));
assert(!(sentinel == p));
static_assert( weakly_equality_comparable_with<std::unreachable_sentinel_t, int>);
static_assert( weakly_equality_comparable_with<std::unreachable_sentinel_t, int*>);
static_assert(!weakly_equality_comparable_with<std::unreachable_sentinel_t, void*>);
ASSERT_NOEXCEPT(sentinel == p);
ASSERT_NOEXCEPT(sentinel != p);
return true;
}
int main(int, char**) {
test();
static_assert(test());
return 0;
}
|