//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // UNSUPPORTED: libcpp-has-no-incomplete-ranges // template // struct min_max_result; #include #include #include #include "MoveOnly.h" template struct ConvertibleFrom { constexpr ConvertibleFrom(T c) : content{c} {} T content; }; struct A { explicit A(int); }; static_assert(!std::is_constructible_v, std::ranges::min_max_result>); struct B { B(const int&); B(int&&); }; static_assert(std::is_constructible_v, std::ranges::min_max_result>); static_assert(std::is_constructible_v, std::ranges::min_max_result&>); static_assert(std::is_constructible_v, const std::ranges::min_max_result>); static_assert(std::is_constructible_v, const std::ranges::min_max_result&>); struct C { C(int&); }; static_assert(!std::is_constructible_v, std::ranges::min_max_result&>); static_assert(std::is_convertible_v&, std::ranges::min_max_result>); static_assert(std::is_convertible_v&, std::ranges::min_max_result>); static_assert(std::is_convertible_v&&, std::ranges::min_max_result>); static_assert(std::is_convertible_v&&, std::ranges::min_max_result>); struct NotConvertible {}; static_assert(!std::is_convertible_v, std::ranges::min_max_result>); constexpr bool test() { { std::ranges::min_max_result res{10, 1}; assert(res.min == 10); assert(res.max == 1); std::ranges::min_max_result> res2 = res; assert(res2.min.content == 10); assert(res2.max.content == 1); } { std::ranges::min_max_result res{MoveOnly{}, MoveOnly{}}; assert(res.min.get() == 1); assert(res.max.get() == 1); [[maybe_unused]] auto res2 = static_cast>(std::move(res)); assert(res.min.get() == 0); assert(res.max.get() == 0); } auto [min, max] = std::ranges::min_max_result{1, 2}; assert(min == 1); assert(max == 2); return true; } int main(int, char**) { test(); static_assert(test()); return 0; }