On Fri, 25 Jul 2025, Patrick Palka wrote:
> After r16-2519-gba5a6787374dea, we should never see a C++20 rewritten
> comparison operator expressed as a built-in acting on an operator<=>
> call, e.g. operator<=>(x, y) < 0. This is because operator<=> always
> returns a class type (std::strong/weak/partial_ordering), so the < will
> necessarily resolve to an operator< for that class type. So the
> corresponding handling in extract_call_expr is dead code -- except for
> the TRUTH_NOT_EXPR case, where we can plausibly still have
> !(operator==(x, y)), but it doesn't makes sense to recognize just that
> one special case of operator rewriting. So let's remove all this
> handling from extract_call_expr.
Oh, also the handling imprecisely makes us return non-NULL for ordinary
operator expressions e.g.
f() < 0
0 > f()
where no rewriting was involved at all.
>
> gcc/cp/ChangeLog:
>
> * call.cc (extract_call_expr): Remove handling of C++20
> rewritten comparison operators.
> ---
> gcc/cp/call.cc | 22 ----------------------
> 1 file changed, 22 deletions(-)
>
> diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
> index 0f3143375261..5a53c496c5fb 100644
> --- a/gcc/cp/call.cc
> +++ b/gcc/cp/call.cc
> @@ -7900,28 +7900,6 @@ extract_call_expr (tree call)
> call = TREE_OPERAND (call, 0);
> if (TREE_CODE (call) == TARGET_EXPR)
> call = TARGET_EXPR_INITIAL (call);
> - if (cxx_dialect >= cxx20)
> - switch (TREE_CODE (call))
> - {
> - /* C++20 rewritten comparison operators. */
> - case TRUTH_NOT_EXPR:
> - call = TREE_OPERAND (call, 0);
> - break;
> - case LT_EXPR:
> - case LE_EXPR:
> - case GT_EXPR:
> - case GE_EXPR:
> - case SPACESHIP_EXPR:
> - {
> - tree op0 = TREE_OPERAND (call, 0);
> - if (integer_zerop (op0))
> - call = TREE_OPERAND (call, 1);
> - else
> - call = op0;
> - }
> - break;
> - default:;
> - }
>
> if (TREE_CODE (call) != CALL_EXPR
> && TREE_CODE (call) != AGGR_INIT_EXPR
> --
> 2.50.1.439.g97e14d99f6
>
>