Index: libcxx/include/__compare/ordering.h =================================================================== --- libcxx/include/__compare/ordering.h +++ libcxx/include/__compare/ordering.h @@ -40,8 +40,12 @@ inline constexpr bool __one_of_v = (is_same_v<_Tp, _Args> || ...); struct _CmpUnspecifiedParam { - _LIBCPP_HIDE_FROM_ABI constexpr - _CmpUnspecifiedParam(int _CmpUnspecifiedParam::*) noexcept {} + _LIBCPP_HIDE_FROM_ABI consteval + _CmpUnspecifiedParam(int __literal_zero) noexcept { + if (__literal_zero != 0) { + __builtin_abort(); + } + } template>> _CmpUnspecifiedParam(_Tp) = delete; Index: libcxx/test/std/language.support/cmp/cmp.categories.pre/zero_type.verify.cpp =================================================================== --- libcxx/test/std/language.support/cmp/cmp.categories.pre/zero_type.verify.cpp +++ libcxx/test/std/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/test/std/language.support/cmp/cmp.partialord/partialord.pass.cpp =================================================================== --- libcxx/test/std/language.support/cmp/cmp.partialord/partialord.pass.cpp +++ libcxx/test/std/language.support/cmp/cmp.partialord/partialord.pass.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 +// ADDITIONAL_COMPILE_FLAGS: -Wzero-as-null-pointer-constant // Index: libcxx/test/std/language.support/cmp/cmp.strongord/strongord.pass.cpp =================================================================== --- libcxx/test/std/language.support/cmp/cmp.strongord/strongord.pass.cpp +++ libcxx/test/std/language.support/cmp/cmp.strongord/strongord.pass.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 +// ADDITIONAL_COMPILE_FLAGS: -Wzero-as-null-pointer-constant // Index: libcxx/test/std/language.support/cmp/cmp.weakord/weakord.pass.cpp =================================================================== --- libcxx/test/std/language.support/cmp/cmp.weakord/weakord.pass.cpp +++ libcxx/test/std/language.support/cmp/cmp.weakord/weakord.pass.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 +// ADDITIONAL_COMPILE_FLAGS: -Wzero-as-null-pointer-constant //