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.
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);
--- /dev/null
+// PR c++/123601
+// { dg-do compile { target c++20 } }
+
+#include <compare>
+
+struct A {
+ bool operator==(int);
+ int operator<=>(int);
+};
+
+template<class T>
+void f() {
+ A a;
+ (void)(0 <=> a);
+}
+
+template void f<int>();