//===----------------------------------------------------------------------===// // // 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, c++20 // constexpr explicit repeat_view(const T& value, Bound bound = Bound()) requires copy_constructible; // constexpr explicit repeat_view(T&& value, Bound bound = Bound()); #include #include #include #include #include "MoveOnly.h" struct Empty {}; // Test explicit static_assert(std::is_constructible_v, const Empty&>); static_assert(std::is_constructible_v, Empty&&>); static_assert(std::is_constructible_v, const Empty&>); static_assert(std::is_constructible_v, Empty&&>); static_assert(!std::is_convertible_v>); static_assert(!std::is_convertible_v>); static_assert(!std::is_convertible_v>); static_assert(!std::is_convertible_v>); static_assert(!std::is_constructible_v, const MoveOnly&>); static_assert(std::is_constructible_v, MoveOnly&&>); constexpr bool test() { // Move && unbound && default argument { std::ranges::repeat_view rv(Empty{}); assert(rv.begin() + 10 != rv.end()); } // Move && unbound && user-provided argument { std::ranges::repeat_view rv(Empty{}, std::unreachable_sentinel); assert(rv.begin() + 10 != rv.end()); } // Move && bound && default argument { std::ranges::repeat_view rv(Empty{}); assert(rv.begin() == rv.end()); } // Move && bound && user-provided argument { std::ranges::repeat_view rv(Empty{}, 10); assert(rv.begin() + 10 == rv.end()); } // Copy && unbound && default argument { Empty e; std::ranges::repeat_view rv(e); assert(rv.begin() + 10 != rv.end()); } // Copy && unbound && user-provided argument { Empty e; std::ranges::repeat_view rv(e, std::unreachable_sentinel); assert(rv.begin() + 10 != rv.end()); } // Copy && bound && default argument { Empty e; std::ranges::repeat_view rv(e); assert(rv.begin() == rv.end()); } // Copy && bound && user-provided argument { Empty e; std::ranges::repeat_view rv(e, 10); assert(rv.begin() + 10 == rv.end()); } return true; } int main(int, char**) { test(); static_assert(test()); return 0; }