1*e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===// 2*e53c461bSKonstantin Varlamov // 3*e53c461bSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*e53c461bSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information. 5*e53c461bSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*e53c461bSKonstantin Varlamov // 7*e53c461bSKonstantin Varlamov //===----------------------------------------------------------------------===// 8*e53c461bSKonstantin Varlamov 9*e53c461bSKonstantin Varlamov // UNSUPPORTED: c++03, c++11, c++14, c++17 10*e53c461bSKonstantin Varlamov 11*e53c461bSKonstantin Varlamov // lazy_split_view() requires default_initializable<V> && default_initializable<P> = default; 12*e53c461bSKonstantin Varlamov 13*e53c461bSKonstantin Varlamov #include <ranges> 14*e53c461bSKonstantin Varlamov 15*e53c461bSKonstantin Varlamov #include <cassert> 16*e53c461bSKonstantin Varlamov #include "types.h" 17*e53c461bSKonstantin Varlamov 18*e53c461bSKonstantin Varlamov struct ThrowingDefaultCtorForwardView : std::ranges::view_base { 19*e53c461bSKonstantin Varlamov ThrowingDefaultCtorForwardView() noexcept(false); 20*e53c461bSKonstantin Varlamov forward_iterator<int*> begin() const; 21*e53c461bSKonstantin Varlamov forward_iterator<int*> end() const; 22*e53c461bSKonstantin Varlamov }; 23*e53c461bSKonstantin Varlamov 24*e53c461bSKonstantin Varlamov struct NoDefaultCtorForwardView : std::ranges::view_base { 25*e53c461bSKonstantin Varlamov NoDefaultCtorForwardView() = delete; 26*e53c461bSKonstantin Varlamov forward_iterator<int*> begin() const; 27*e53c461bSKonstantin Varlamov forward_iterator<int*> end() const; 28*e53c461bSKonstantin Varlamov }; 29*e53c461bSKonstantin Varlamov 30*e53c461bSKonstantin Varlamov static_assert( std::is_default_constructible_v<std::ranges::lazy_split_view<ForwardView, ForwardView>>); 31*e53c461bSKonstantin Varlamov static_assert(!std::is_default_constructible_v<std::ranges::lazy_split_view<NoDefaultCtorForwardView, ForwardView>>); 32*e53c461bSKonstantin Varlamov static_assert(!std::is_default_constructible_v<std::ranges::lazy_split_view<ForwardView, NoDefaultCtorForwardView>>); 33*e53c461bSKonstantin Varlamov 34*e53c461bSKonstantin Varlamov static_assert( std::is_nothrow_default_constructible_v<std::ranges::lazy_split_view<ForwardView, ForwardView>>); 35*e53c461bSKonstantin Varlamov static_assert(!std::is_nothrow_default_constructible_v<ThrowingDefaultCtorForwardView>); 36*e53c461bSKonstantin Varlamov static_assert(!std::is_nothrow_default_constructible_v< 37*e53c461bSKonstantin Varlamov std::ranges::lazy_split_view<ThrowingDefaultCtorForwardView, ForwardView>>); 38*e53c461bSKonstantin Varlamov 39*e53c461bSKonstantin Varlamov constexpr bool test() { 40*e53c461bSKonstantin Varlamov { 41*e53c461bSKonstantin Varlamov std::ranges::lazy_split_view<CopyableView, ForwardView> v; 42*e53c461bSKonstantin Varlamov assert(v.base() == CopyableView()); 43*e53c461bSKonstantin Varlamov } 44*e53c461bSKonstantin Varlamov 45*e53c461bSKonstantin Varlamov { 46*e53c461bSKonstantin Varlamov std::ranges::lazy_split_view<CopyableView, ForwardView> v = {}; 47*e53c461bSKonstantin Varlamov assert(v.base() == CopyableView()); 48*e53c461bSKonstantin Varlamov } 49*e53c461bSKonstantin Varlamov 50*e53c461bSKonstantin Varlamov return true; 51*e53c461bSKonstantin Varlamov } 52*e53c461bSKonstantin Varlamov 53*e53c461bSKonstantin Varlamov int main(int, char**) { 54*e53c461bSKonstantin Varlamov test(); 55*e53c461bSKonstantin Varlamov static_assert(test()); 56*e53c461bSKonstantin Varlamov 57*e53c461bSKonstantin Varlamov return 0; 58*e53c461bSKonstantin Varlamov } 59