]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: non-dep reversed <=> returning int [PR123601]
authorPatrick Palka <ppalka@redhat.com>
Tue, 20 Jan 2026 20:25:07 +0000 (15:25 -0500)
committerPatrick Palka <ppalka@redhat.com>
Tue, 20 Jan 2026 20:25:07 +0000 (15:25 -0500)
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.

gcc/cp/tree.cc
gcc/testsuite/g++.dg/lookup/operator-9.C [new file with mode: 0644]

index 030af4d219d106b07662c663b2fb20ec66b25896..ab9d0d532f5412e343732a0ab30a241820b4bfda 100644 (file)
@@ -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 (file)
index 0000000..6c9326e
--- /dev/null
@@ -0,0 +1,17 @@
+// 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>();