[PATCH] D150264: [libcxx] Add strict weak ordering checks to sorting algorithms

Danila Kutenin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 15 01:23:47 PDT 2023


danlark added inline comments.


================
Comment at: libcxx/include/__debug_utils/strict_weak_ordering_check.h:14
+
+#ifdef _LIBCPP_DEBUG_STRICT_WEAK_ORDERING_CHECK
+#  include <__algorithm/comp_ref_type.h>
----------------
philnik wrote:
> IMO we shouldn't include stuff based on whether we are in debug mode or not.
This is consistent with __debug_utils/randomize_range. I believe the intention is not to expose more headers than needed for compile times


================
Comment at: libcxx/include/__debug_utils/strict_weak_ordering_check.h:49
+        for (difference_type __a = __p; __a <= __b; ++__a) {
+          _LIBCPP_ASSERT(!__comp(*(__first + __a), *(__first + __b)), "Your comparator is not a valid strict-weak ordering");
+          _LIBCPP_ASSERT(!__comp(*(__first + __b), *(__first + __a)), "Your comparator is not a valid strict-weak ordering");
----------------
philnik wrote:
> Could we print the indices/types if they can be printed instead of just saying "you are wrong"?
This information might be incorrect. As said in the RFC, quadratic algorithm can show if there is a problem, not the triple that violates the condition

In this case we figured out a pair in the range that we think consist of equal elements to be comparable, say, it can be with the epsilon float sorting (2 elements are considered equal if their diff is no more than eps)

eps/2, eps, 2eps

We will detect a pair eps/2, 2eps and we will show it to the user. It does not explain much on what happened.


================
Comment at: libcxx/test/std/algorithms/alg.sorting/alg.heap.operations/sort.heap/ranges_sort_heap.pass.cpp:210
     [[maybe_unused]] std::same_as<std::ranges::dangling> decltype(auto) result =
-        std::ranges::sort_heap(std::array{2, 1, 3});
+        std::ranges::sort_heap(std::array{3, 1, 2});
   }
----------------
philnik wrote:
> Why is this changed?
Because 2, 1, 3 is not a max heap, calling sort_heap is incorrect in this case


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150264/new/

https://reviews.llvm.org/D150264



More information about the llvm-commits mailing list