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