Index: libcxx/include/__compare/ordering.h =================================================================== --- libcxx/include/__compare/ordering.h +++ libcxx/include/__compare/ordering.h @@ -39,9 +39,15 @@ template inline constexpr bool __one_of_v = (is_same_v<_Tp, _Args> || ...); +void __literal_zero_is_expected(); + struct _CmpUnspecifiedParam { - _LIBCPP_HIDE_FROM_ABI constexpr - _CmpUnspecifiedParam(int _CmpUnspecifiedParam::*) noexcept {} + consteval + _CmpUnspecifiedParam(int __literal_zero) noexcept { + if (__literal_zero != 0) { + __literal_zero_is_expected(); + } + } template>> _CmpUnspecifiedParam(_Tp) = delete; Index: libcxx/test/libcxx/language.support/cmp/cmp.categories.pre/zero_type.verify.cpp =================================================================== --- libcxx/test/libcxx/language.support/cmp/cmp.categories.pre/zero_type.verify.cpp +++ libcxx/test/libcxx/language.support/cmp/cmp.categories.pre/zero_type.verify.cpp @@ -8,10 +8,6 @@ // UNSUPPORTED: c++03, c++11, c++14, c++17 -// In MSVC mode, there's a slightly different number of errors printed for -// each of these, so it doesn't add up to the exact expected count of 18. -// XFAIL: msvc - // // Ensure we reject all cases where an argument other than a literal 0 is used @@ -23,9 +19,7 @@ void(v op 0L); \ void(0L op v); \ void(v op nullptr); \ - void(nullptr op v); \ - void(v op(1 - 1)); \ - void((1 - 1) op v) + void(nullptr op v) #define TEST_PASS(v, op) \ void(v op 0); \ @@ -33,13 +27,13 @@ template void test_category(T v) { - TEST_FAIL(v, ==); // expected-error 18 {{}} - TEST_FAIL(v, !=); // expected-error 18 {{}} - TEST_FAIL(v, <); // expected-error 18 {{}} - TEST_FAIL(v, <=); // expected-error 18 {{}} - TEST_FAIL(v, >); // expected-error 18 {{}} - TEST_FAIL(v, >=); // expected-error 18 {{}} - TEST_FAIL(v, <=>); // expected-error 18 {{}} + TEST_FAIL(v, ==); // expected-error 12 {{}} + TEST_FAIL(v, !=); // expected-error 12 {{}} + TEST_FAIL(v, <); // expected-error 12 {{}} + TEST_FAIL(v, <=); // expected-error 12 {{}} + TEST_FAIL(v, >); // expected-error 12 {{}} + TEST_FAIL(v, >=); // expected-error 12 {{}} + TEST_FAIL(v, <=>); // expected-error 12 {{}} TEST_PASS(v, ==); TEST_PASS(v, !=); Index: libcxx/utils/libcxx/test/params.py =================================================================== --- libcxx/utils/libcxx/test/params.py +++ libcxx/utils/libcxx/test/params.py @@ -18,6 +18,7 @@ '-Wshadow', '-Wundef', '-Wunused-template', + '-Wzero-as-null-pointer-constant', '-Wno-unused-command-line-argument', '-Wno-attributes', '-Wno-pessimizing-move',