1*879cbac0Szoecarver //===----------------------------------------------------------------------===// 2*879cbac0Szoecarver // 3*879cbac0Szoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*879cbac0Szoecarver // See https://llvm.org/LICENSE.txt for license information. 5*879cbac0Szoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*879cbac0Szoecarver // 7*879cbac0Szoecarver //===----------------------------------------------------------------------===// 8*879cbac0Szoecarver 9*879cbac0Szoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17 10*879cbac0Szoecarver // UNSUPPORTED: libcpp-no-concepts 11*879cbac0Szoecarver 12*879cbac0Szoecarver // <functional> 13*879cbac0Szoecarver 14*879cbac0Szoecarver // ranges::less 15*879cbac0Szoecarver 16*879cbac0Szoecarver #include <functional> 17*879cbac0Szoecarver #include <type_traits> 18*879cbac0Szoecarver #include <cassert> 19*879cbac0Szoecarver 20*879cbac0Szoecarver #include "test_macros.h" 21*879cbac0Szoecarver #include "compare_types.h" 22*879cbac0Szoecarver #include "MoveOnly.h" 23*879cbac0Szoecarver #include "pointer_comparison_test_helper.h" 24*879cbac0Szoecarver 25*879cbac0Szoecarver struct NotTotallyOrdered { 26*879cbac0Szoecarver friend bool operator<(const NotTotallyOrdered&, const NotTotallyOrdered&); 27*879cbac0Szoecarver }; 28*879cbac0Szoecarver 29*879cbac0Szoecarver static_assert(!std::is_invocable_v<std::ranges::less, NotTotallyOrdered, NotTotallyOrdered>); 30*879cbac0Szoecarver static_assert(!std::is_invocable_v<std::ranges::less, int, MoveOnly>); 31*879cbac0Szoecarver static_assert(std::is_invocable_v<std::ranges::less, explicit_operators, explicit_operators>); 32*879cbac0Szoecarver 33*879cbac0Szoecarver static_assert(requires { typename std::ranges::less::is_transparent; }); 34*879cbac0Szoecarver 35*879cbac0Szoecarver constexpr bool test() { 36*879cbac0Szoecarver auto fn = std::ranges::less(); 37*879cbac0Szoecarver 38*879cbac0Szoecarver assert(fn(MoveOnly(41), MoveOnly(42))); 39*879cbac0Szoecarver 40*879cbac0Szoecarver ForwardingTestObject a; 41*879cbac0Szoecarver ForwardingTestObject b; 42*879cbac0Szoecarver assert(!fn(a, b)); 43*879cbac0Szoecarver assert(fn(std::move(a), std::move(b))); 44*879cbac0Szoecarver 45*879cbac0Szoecarver assert(fn(1, 2)); 46*879cbac0Szoecarver assert(!fn(2, 2)); 47*879cbac0Szoecarver assert(!fn(2, 1)); 48*879cbac0Szoecarver 49*879cbac0Szoecarver assert(!fn(2, 1L)); 50*879cbac0Szoecarver 51*879cbac0Szoecarver return true; 52*879cbac0Szoecarver } 53*879cbac0Szoecarver 54*879cbac0Szoecarver int main(int, char**) { 55*879cbac0Szoecarver 56*879cbac0Szoecarver test(); 57*879cbac0Szoecarver static_assert(test()); 58*879cbac0Szoecarver 59*879cbac0Szoecarver // test total ordering of int* for less<int*> and less<void>. 60*879cbac0Szoecarver do_pointer_comparison_test(std::ranges::less()); 61*879cbac0Szoecarver 62*879cbac0Szoecarver return 0; 63*879cbac0Szoecarver } 64