1*849b650cSJens Massberg // RUN: %clang_cc1 -fsyntax-only -verify %s -Wzero-as-null-pointer-constant -std=c++20
2*849b650cSJens Massberg
3*849b650cSJens Massberg namespace std {
4*849b650cSJens Massberg class strong_ordering;
5*849b650cSJens Massberg
6*849b650cSJens Massberg // Mock how STD defined unspecified parameters for the operators below.
7*849b650cSJens Massberg struct _CmpUnspecifiedParam {
8*849b650cSJens Massberg consteval
_CmpUnspecifiedParamstd::_CmpUnspecifiedParam9*849b650cSJens Massberg _CmpUnspecifiedParam(int _CmpUnspecifiedParam::*) noexcept {}
10*849b650cSJens Massberg };
11*849b650cSJens Massberg
12*849b650cSJens Massberg struct strong_ordering {
13*849b650cSJens Massberg signed char value;
14*849b650cSJens Massberg
operator ==(strong_ordering v,_CmpUnspecifiedParam)15*849b650cSJens Massberg friend constexpr bool operator==(strong_ordering v,
16*849b650cSJens Massberg _CmpUnspecifiedParam) noexcept {
17*849b650cSJens Massberg return v.value == 0;
18*849b650cSJens Massberg }
operator <(strong_ordering v,_CmpUnspecifiedParam)19*849b650cSJens Massberg friend constexpr bool operator<(strong_ordering v,
20*849b650cSJens Massberg _CmpUnspecifiedParam) noexcept {
21*849b650cSJens Massberg return v.value < 0;
22*849b650cSJens Massberg }
operator >(strong_ordering v,_CmpUnspecifiedParam)23*849b650cSJens Massberg friend constexpr bool operator>(strong_ordering v,
24*849b650cSJens Massberg _CmpUnspecifiedParam) noexcept {
25*849b650cSJens Massberg return v.value > 0;
26*849b650cSJens Massberg }
operator >=(strong_ordering v,_CmpUnspecifiedParam)27*849b650cSJens Massberg friend constexpr bool operator>=(strong_ordering v,
28*849b650cSJens Massberg _CmpUnspecifiedParam) noexcept {
29*849b650cSJens Massberg return v.value >= 0;
30*849b650cSJens Massberg }
31*849b650cSJens Massberg static const strong_ordering equal, greater, less;
32*849b650cSJens Massberg };
33*849b650cSJens Massberg constexpr strong_ordering strong_ordering::equal = {0};
34*849b650cSJens Massberg constexpr strong_ordering strong_ordering::greater = {1};
35*849b650cSJens Massberg constexpr strong_ordering strong_ordering::less = {-1};
36*849b650cSJens Massberg } // namespace std
37*849b650cSJens Massberg
38*849b650cSJens Massberg struct A {
39*849b650cSJens Massberg int a;
40*849b650cSJens Massberg constexpr auto operator<=>(const A &other) const = default;
41*849b650cSJens Massberg };
42*849b650cSJens Massberg
test_cxx_rewritten_binary_ops()43*849b650cSJens Massberg void test_cxx_rewritten_binary_ops() {
44*849b650cSJens Massberg A a1, a2;
45*849b650cSJens Massberg bool result;
46*849b650cSJens Massberg result = (a1 < a2);
47*849b650cSJens Massberg result = (a1 >= a2);
48*849b650cSJens Massberg int *ptr = 0; // expected-warning{{zero as null pointer constant}}
49*849b650cSJens Massberg result = (a1 > (ptr == 0 ? a1 : a2)); // expected-warning{{zero as null pointer constant}}
50*849b650cSJens Massberg result = (a1 > ((a1 > (ptr == 0 ? a1 : a2)) ? a1 : a2)); // expected-warning{{zero as null pointer constant}}
51*849b650cSJens Massberg }
52