| // { dg-do run { target c++20 } } |
| // { dg-options "" } |
| |
| #include <compare> |
| |
| struct C { |
| int y; |
| int x[4]; |
| auto operator<=>(C const&) const = default; |
| }; |
| |
| struct D { |
| int y; |
| int x[1]; |
| auto operator<=>(D const&) const = default; |
| }; |
| |
| struct E { |
| int y; |
| int x[0]; |
| auto operator<=>(E const&) const = default; |
| }; |
| |
| int |
| main () |
| { |
| constexpr C c1 = { 1, { 2, 3, 4, 5 } }; |
| constexpr C c2 = { 1, { 2, 3, 5, 4 } }; |
| constexpr C c3 = { 1, { 2, 2, 6, 7 } }; |
| static_assert (c1 < c2); |
| static_assert (c3 < c1); |
| constexpr D d1 = { 1, { 2 } }; |
| constexpr D d2 = { 1, { 3 } }; |
| constexpr D d3 = { 1, { 1 } }; |
| static_assert (d1 < d2); |
| static_assert (d3 < d1); |
| constexpr E e1 = { 1, {} }; |
| constexpr E e2 = { 2, {} }; |
| constexpr E e3 = { 1, {} }; |
| static_assert (e1 < e2); |
| static_assert (e1 == e3); |
| C c4 = { 1, { 2, 3, 4, 5 } }; |
| C c5 = { 1, { 2, 3, 5, 4 } }; |
| C c6 = { 1, { 2, 2, 6, 7 } }; |
| if (c4 >= c5 || c6 >= c4) |
| __builtin_abort (); |
| D d4 = { 1, { 2 } }; |
| D d5 = { 1, { 3 } }; |
| D d6 = { 1, { 1 } }; |
| if (d4 >= d5 || d6 >= d4) |
| __builtin_abort (); |
| E e4 = { 1, {} }; |
| E e5 = { 2, {} }; |
| E e6 = { 1, {} }; |
| if (e4 >= e5 || e4 != e6) |
| __builtin_abort (); |
| } |