diff --git a/libcxx/include/__algorithm/three_way_comp_ref_type.h b/libcxx/include/__algorithm/three_way_comp_ref_type.h --- a/libcxx/include/__algorithm/three_way_comp_ref_type.h +++ b/libcxx/include/__algorithm/three_way_comp_ref_type.h @@ -27,6 +27,13 @@ _Comp& __comp_; _LIBCPP_HIDE_FROM_ABI constexpr __debug_three_way_comp(_Comp& __c) : __comp_(__c) {} + template + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(const _Tp& __x, const _Up& __y) { + auto __r = __comp_(__x, __y); + __do_compare_assert(0, __y, __x, __r); + return __r; + } + template _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp& __x, _Up& __y) { auto __r = __comp_(__x, __y); @@ -55,7 +62,7 @@ // Pass the comparator by lvalue reference. Or in debug mode, using a // debugging wrapper that stores a reference. -# ifndef _LIBCPP_ENABLE_DEBUG_MODE +# ifdef _LIBCPP_ENABLE_DEBUG_MODE template using __three_way_comp_ref_type = __debug_three_way_comp<_Comp>; # else diff --git a/libcxx/test/std/algorithms/alg.sorting/alg.three.way/lexicographical_compare_three_way_comp.pass.cpp b/libcxx/test/std/algorithms/alg.sorting/alg.three.way/lexicographical_compare_three_way_comp.pass.cpp --- a/libcxx/test/std/algorithms/alg.sorting/alg.three.way/lexicographical_compare_three_way_comp.pass.cpp +++ b/libcxx/test/std/algorithms/alg.sorting/alg.three.way/lexicographical_compare_three_way_comp.pass.cpp @@ -16,15 +16,15 @@ // Cmp comp) // -> decltype(comp(*b1, *b2)); -#include #include +#include #include #include #include #include -#include "test_macros.h" #include "test_iterators.h" +#include "test_macros.h" using std::array; @@ -161,7 +161,11 @@ constexpr bool test() { test_iterator_types(); test_comparison_categories(); + // In debug mode the comparator will be called twice by the debugging wrapper + // `__debug_three_way_comp` +#ifndef _LIBCPP_ENABLE_DEBUG_MODE test_comparator_invocation_count(); +#endif return true; }