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 > >