From: Patrick Palka Date: Tue, 20 Jan 2026 20:25:07 +0000 (-0500) Subject: c++: non-dep reversed <=> returning int [PR123601] X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9fdccdaa54a176fc710972fa65caadee57b5f9c3;p=thirdparty%2Fgcc.git c++: non-dep reversed <=> returning int [PR123601] The code path for non-dependent operator expressions rewritten from a <=> returning a non-class type (added in r16-3727-gf2fddc4b84a843) is also reached for a reversed such <=> expression with the form 0 @ (y <=> x) where the @ is <=>, so we need to relax the relevant assert accordingly. PR c++/123601 gcc/cp/ChangeLog: * tree.cc (build_min_non_dep_op_overload): Relax COMPARISON_CLASS_P assert to accept SPACESHIP_EXPR too. gcc/testsuite/ChangeLog: * g++.dg/lookup/operator-9.C: New test. --- diff --git a/gcc/cp/tree.cc b/gcc/cp/tree.cc index 030af4d219d..ab9d0d532f5 100644 --- a/gcc/cp/tree.cc +++ b/gcc/cp/tree.cc @@ -3849,7 +3849,8 @@ build_min_non_dep_op_overload (enum tree_code op, if (TREE_CODE (non_dep) != CALL_EXPR) { - gcc_checking_assert (COMPARISON_CLASS_P (non_dep)); + gcc_checking_assert (COMPARISON_CLASS_P (non_dep) + || TREE_CODE (non_dep) == SPACESHIP_EXPR); if (reversed) std::swap (op0, op1); return build_min_non_dep (TREE_CODE (non_dep), non_dep, op0, op1); diff --git a/gcc/testsuite/g++.dg/lookup/operator-9.C b/gcc/testsuite/g++.dg/lookup/operator-9.C new file mode 100644 index 00000000000..6c9326ec050 --- /dev/null +++ b/gcc/testsuite/g++.dg/lookup/operator-9.C @@ -0,0 +1,17 @@ +// PR c++/123601 +// { dg-do compile { target c++20 } } + +#include + +struct A { + bool operator==(int); + int operator<=>(int); +}; + +template +void f() { + A a; + (void)(0 <=> a); +} + +template void f();