In C++20, if there is no viable operator< available, lhs < rhs gets
rewritten to (lhs <=> rhs) < 0, where operator< for the comparison
categories is intended to accept literal 0 on the RHS but not other
integers. We don't want this to produce a warning from
-Wzero-as-null-pointer-constant.
Tested x86_64-pc-linux-gnu, applying to trunk and 10.
gcc/cp/ChangeLog:
* call.c (build_new_op_1): Suppress
warn_zero_as_null_pointer_constant across comparison of <=> result
to 0.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/spaceship-synth2.C: Add
-Wzero-as-null-pointer-constant.
---
gcc/cp/call.c | 1 +
gcc/testsuite/g++.dg/cpp2a/spaceship-synth2.C | 3 +++
2 files changed, 4 insertions(+)
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index d8582883917..a51ebb5d9e3 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -6410,6 +6410,7 @@ build_new_op_1 (const op_location_t &loc, enum tree_code
code, int flags,
tree rhs = integer_zero_node;
if (cand->reversed ())
std::swap (lhs, rhs);
+ warning_sentinel ws (warn_zero_as_null_pointer_constant);
result = build_new_op (loc, code,
LOOKUP_NORMAL|LOOKUP_REWRITTEN,
lhs, rhs, NULL_TREE,
diff --git a/gcc/testsuite/g++.dg/cpp2a/spaceship-synth2.C
b/gcc/testsuite/g++.dg/cpp2a/spaceship-synth2.C
index e6401d29ef0..9b6cfa081d1 100644
--- a/gcc/testsuite/g++.dg/cpp2a/spaceship-synth2.C
+++ b/gcc/testsuite/g++.dg/cpp2a/spaceship-synth2.C
@@ -1,6 +1,9 @@
// Test with only spaceship defaulted.
// { dg-do run { target c++20 } }
+// Add this warning to test PR c++/95242
+// { dg-additional-options -Wzero-as-null-pointer-constant }
+
#include <compare>
struct D
base-commit: ac9face8d26ea4b6aa72902ecc22e89ef00763c5
--
2.18.1