The patch r16-3414-gfcb3009a32dc33 changed the representation of unordered to optimize reversing of order, but it did not update implementation of reversing operator<=>(0, partial_order).
libstdc++-v3/ChangeLog: * libsupc++/compare (operator<=>(__cmp_cat::__unspec, partial_ordering)): Implement using _M_reverse. Signed-off-by: Tomasz Kamiński <tkami...@redhat.com> --- I have forgotten that we have reverse operation. It is used when operator<=> is rewriten by compiler, where b <=> a, becomes 0 <=> (a <=> b), so it should have real impact. Testing on x86_64-linux. OK for trunk? libstdc++-v3/libsupc++/compare | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/libstdc++-v3/libsupc++/compare b/libstdc++-v3/libsupc++/compare index 2624fa9144f..ef0f0376964 100644 --- a/libstdc++-v3/libsupc++/compare +++ b/libstdc++-v3/libsupc++/compare @@ -155,12 +155,7 @@ namespace std _GLIBCXX_VISIBILITY(default) [[nodiscard]] friend constexpr partial_ordering operator<=>(__cmp_cat::__unspec, partial_ordering __v) noexcept - { - if (__v._M_value & 1) - return partial_ordering(__cmp_cat::_Ord(-__v._M_value)); - else - return __v; - } + { return partial_ordering(__cmp_cat::_Ncmp(__v._M_reverse())); } }; // valid values' definitions -- 2.50.1