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_equal 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_equal, NotTotallyOrdered, NotTotallyOrdered>); 30*879cbac0Szoecarver static_assert(!std::is_invocable_v<std::ranges::less_equal, int, MoveOnly>); 31*879cbac0Szoecarver static_assert(std::is_invocable_v<std::ranges::less_equal, explicit_operators, explicit_operators>); 32*879cbac0Szoecarver 33*879cbac0Szoecarver static_assert(requires { typename std::ranges::less_equal::is_transparent; }); 34*879cbac0Szoecarver 35*879cbac0Szoecarver constexpr bool test() { 36*879cbac0Szoecarver auto fn = std::ranges::less_equal(); 37*879cbac0Szoecarver 38*879cbac0Szoecarver assert(fn(MoveOnly(41), MoveOnly(42))); 39*879cbac0Szoecarver 40*879cbac0Szoecarver // These are the opposite of other tests. 41*879cbac0Szoecarver ForwardingTestObject a; 42*879cbac0Szoecarver ForwardingTestObject b; 43*879cbac0Szoecarver assert(fn(a, b)); 44*879cbac0Szoecarver assert(!fn(std::move(a), std::move(b))); 45*879cbac0Szoecarver 46*879cbac0Szoecarver assert(fn(1, 2)); 47*879cbac0Szoecarver assert(fn(2, 2)); 48*879cbac0Szoecarver assert(!fn(2, 1)); 49*879cbac0Szoecarver 50*879cbac0Szoecarver assert(!fn(2, 1L)); 51*879cbac0Szoecarver 52*879cbac0Szoecarver return true; 53*879cbac0Szoecarver } 54*879cbac0Szoecarver 55*879cbac0Szoecarver int main(int, char**) { 56*879cbac0Szoecarver 57*879cbac0Szoecarver test(); 58*879cbac0Szoecarver static_assert(test()); 59*879cbac0Szoecarver 60*879cbac0Szoecarver // test total ordering of int* for less_equal<int*> and less_equal<void>. 61*879cbac0Szoecarver do_pointer_comparison_test(std::ranges::less_equal()); 62*879cbac0Szoecarver 63*879cbac0Szoecarver return 0; 64*879cbac0Szoecarver } 65