1 // { dg-do run { target c++2a } }
2 
3 #include <compare>
4 
5 #define assert(X) do { if (!(X)) __builtin_abort(); } while(0)
6 
main()7 int main()
8 {
9   {
10     constexpr auto v = 1 <=> 2;
11     static_assert (__is_same_as (decltype (v), const std::strong_ordering));
12     static_assert (!is_eq (v));
13     static_assert (is_neq (v));
14     static_assert (is_lt (v));
15     static_assert (is_lteq (v));
16     static_assert (!is_gt (v));
17     static_assert (!is_gteq (v));
18   }
19 
20   {
21     enum E { a = 0 };
22     constexpr auto v = E::a <=> 1;
23     static_assert (__is_same_as (decltype (v), const std::strong_ordering));
24     static_assert (!is_eq (v));
25     static_assert (is_neq (v));
26     static_assert (is_lt (v));
27     static_assert (is_lteq (v));
28     static_assert (!is_gt (v));
29     static_assert (!is_gteq (v));
30   }
31 
32   {
33     enum class E { a, b };
34     constexpr auto v = E::a <=> E::b;
35     static_assert (__is_same_as (decltype (v), const std::strong_ordering));
36     static_assert (!is_eq (v));
37     static_assert (is_neq (v));
38     static_assert (is_lt (v));
39     static_assert (is_lteq (v));
40     static_assert (!is_gt (v));
41     static_assert (!is_gteq (v));
42   }
43 
44   {
45     int ar[2];
46     constexpr auto v = &ar[1] <=> &ar[0];
47     static_assert (__is_same_as (decltype (v), const std::strong_ordering));
48     static_assert (!is_eq (v));
49     static_assert (is_neq (v));
50     static_assert (!is_lt (v));
51     static_assert (!is_lteq (v));
52     static_assert (is_gt (v));
53     static_assert (is_gteq (v));
54   }
55 
56   {
57     constexpr auto v = 3.14 <=> 3.14;
58     static_assert (__is_same_as (decltype (v), const std::partial_ordering));
59     static_assert (is_eq (v));
60     static_assert (!is_neq (v));
61     static_assert (!is_lt (v));
62     static_assert (is_lteq (v));
63     static_assert (!is_gt (v));
64     static_assert (is_gteq (v));
65   }
66 }
67