Stephan Bergmann 56e6d683db double operator < is not a strict weak ordering due to NaN
...so recent LLVM 19 trunk libc++ in debug mode complained during
CppunitTest_chart2_export2 about

> ~/llvm/inst/bin/../include/c++/v1/__debug_utils/strict_weak_ordering_check.h:59: assertion __comp(*(__first + __a), *(__first + __b)) failed: Your comparator is not a valid strict-weak ordering

at

> 5   libsystem_c.dylib                   0x0000000183279a40 abort + 180
> 6   libc++.1.0.dylib                    0x00000001030f9d98 _ZNSt3__123__cxx_atomic_notify_oneEPVKv + 0
> 7   libchartcorelo.dylib                0x00000002f817f0ec _ZNSt3__135__check_strict_weak_ordering_sortedB8de190000INS_11__wrap_iterIPNS_6vectorIdNS_9allocatorIdEEEEEEN5chart12_GLOBAL__N_116lcl_LessXOfPointEEEvT_SB_RT0_ + 960
> 8   libchartcorelo.dylib                0x00000002f817e6cc _ZNSt3__118__stable_sort_implB8de190000INS_17_ClassicAlgPolicyENS_11__wrap_iterIPNS_6vectorIdNS_9allocatorIdEEEEEEN5chart12_GLOBAL__N_116lcl_LessXOfPointEEEvT0_SC_RT1_ + 268
> 9   libchartcorelo.dylib                0x00000002f8172a90 _ZNSt3__111stable_sortB8de190000INS_11__wrap_iterIPNS_6vectorIdNS_9allocatorIdEEEEEEN5chart12_GLOBAL__N_116lcl_LessXOfPointEEEvT_SB_T0_ + 68
> 10  libchartcorelo.dylib                0x00000002f8172820 _ZN5chart11VDataSeries15doSortByXValuesEv + 508
> 11  libchartcorelo.dylib                0x00000002f8064c44 _ZN5chart9AreaChart12createShapesEv + 1528
> 12  libchartcorelo.dylib                0x00000002f80f2ae0 _ZN5chart9ChartView28impl_createDiagramAndContentERKNS_18CreateShapeParam2DERKN3com3sun4star3awt4SizeE + 4440
> 13  libchartcorelo.dylib                0x00000002f80f77ac _ZN5chart9ChartView14createShapes2DERKN3com3sun4star3awt4SizeE + 2728
> 14  libchartcorelo.dylib                0x00000002f80f58ec _ZN5chart9ChartView12createShapesEv + 692
> 15  libchartcorelo.dylib                0x00000002f80f4598 _ZN5chart9ChartView15impl_updateViewEb + 288

But the introduced use of `std::strong_order(first[0], second[0]) < 0` then
triggered a false

> lo/core/chart2/source/view/main/VDataSeries.cxx:105:61: error: NullToMemberPointer ValueDependentIsNotNull ZeroLiteral -> nullptr [loplugin:nullptr]
>   105 |             return std::strong_order(first[0], second[0]) < 0;
>       |                                                             ^

so needed some hack in loplugin:nullptr.

And old versions of libc++, still used at least on Android, do not have any
implementations of std::strong_order.  So detect those cases in configure.ac
(checking for std::strong_order for double, which is what is actually being used
in the code) and fall back to operator <=> for now, even if that will not
provide a strict weak ordering and will thus continue to violate the
requirements of std::sort.

And then our venerable clang-format 5.0.0 would have broken the token `<=>` into
`<= >`, so exclude include/o3tl/compare.hxx from its mis-treatment.

Change-Id: I7a64a630eb5f560dce59f3ff9d51ca3d1adc70be
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163075
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
2024-02-07 21:03:46 +01:00

30 lines
722 B
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include "sal/config.h"
#include <compare>
struct S
{
void* p;
};
int main()
{
S s{
0 // expected-error {{NullToPointer ValueDependentIsNotNull ZeroLiteral -> nullptr [loplugin:nullptr]}}
};
(void)s;
(void)(std::strong_order(0, 1) < 0);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */