mirror of
https://github.com/nlohmann/json.git
synced 2026-10-03 05:00:30 +00:00
Classify leaves with operator<=> itself past the nesting bound
In C++20, an ordered comparison past the nesting bound classified a pair of leaves by asking == first and then order_leaves(), which calls < and > - both derived from <=>. For a pair of binary values with the same bytes but a different subtype, == reports them unequal, while <=> (through std::vector<std::uint8_t>::operator<=>) reports them equivalent, so the pair ended the comparison as unordered instead of letting the next element decide - unlike an array or object within the bound, which compares such a pair with its own operator<=> and gets equivalent. So operator<=>, and the <, <=, >, >= derived from it, could give a different result for the same two values depending on how deeply the values were nested, or unordered at every depth with JSON_NO_THREAD_LOCAL defined. compare_leaves() now classifies such a pair in C++20 with operator<=> itself instead, matching how a value within the bound is compared; the equality-only and pre-C++20 ordered cases are unchanged. Which of the three runs is chosen by overloading on std::integral_constant<bool, Ordered>, the same tag dispatch order_leaves() already uses, rather than a runtime "if (Ordered)" on a template parameter, which MSVC would flag as a constant condition (C4127). Added a regression test to unit-comparison.cpp that nests such a pair 0, 127, 128 and 200 levels deep (127 stays within the 128-level bound, 128 and 200 do not) and checks that operator<=> and operator< agree at every depth. Fixes #5654. Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
@@ -96,5 +96,8 @@ Linear.
|
||||
|
||||
## Version history
|
||||
|
||||
1. Added in version 3.11.0.
|
||||
1. Added in version 3.11.0. Fixed in version 3.13.0 to keep the result independent of nesting depth: before, a pair
|
||||
of binary values with the same bytes but a different subtype - unequal by `operator==`, yet equivalent by
|
||||
`operator<=>` - could end an ordered comparison as `unordered` only past 128 levels of nesting, or at every depth
|
||||
with [`JSON_NO_THREAD_LOCAL`](../macros/json_no_thread_local.md) defined.
|
||||
2. Added in version 3.11.0.
|
||||
|
||||
Reference in New Issue
Block a user