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 @@ -13,6 +13,7 @@ #include <__config> #include <__debug> #include <__utility/declval.h> +#include <__utility/forward.h> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header @@ -28,8 +29,8 @@ _LIBCPP_HIDE_FROM_ABI constexpr __debug_three_way_comp(_Comp& __c) : __comp_(__c) {} template - _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp& __x, _Up& __y) { - auto __r = __comp_(__x, __y); + _LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Tp&& __x, _Up&& __y) { + auto __r = __comp_(std::forward<_Tp>(__x), std::forward<_Up>(__y)); __do_compare_assert(0, __y, __x, __r); return __r; } @@ -55,7 +56,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; @@ -155,7 +155,11 @@ // The comparator is invoked only `min(left.size(), right.size())` times test_lexicographical_compare( std::array{0, 1, 2}, std::array{0, 1, 2, 3}, compare_last_digit_counting, std::strong_ordering::less); - assert(compare_invocation_count == 3); +#ifdef _LIBCPP_ENABLE_DEBUG_MODE + assert(compare_invocation_count <= 6); +#else + assert(compare_invocation_count <= 3); +#endif } constexpr bool test() {