1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11, c++14, c++17 10 // UNSUPPORTED: libcpp-has-no-incomplete-ranges 11 12 // iterator() requires default_initializable<OuterIter> = default; 13 14 #include <ranges> 15 16 #include <cassert> 17 #include <type_traits> 18 #include "test_iterators.h" 19 #include "../types.h" 20 21 template <class It> 22 struct view : std::ranges::view_base { 23 It begin() const; 24 sentinel_wrapper<It> end() const; 25 }; 26 27 template <class It> test_default_constructible()28constexpr void test_default_constructible() { 29 using JoinView = std::ranges::join_view<view<It>>; 30 using JoinIterator = std::ranges::iterator_t<JoinView>; 31 static_assert(std::is_default_constructible_v<JoinIterator>); 32 JoinIterator it; (void)it; 33 } 34 35 template <class It> test_non_default_constructible()36constexpr void test_non_default_constructible() { 37 using JoinView = std::ranges::join_view<view<It>>; 38 using JoinIterator = std::ranges::iterator_t<JoinView>; 39 static_assert(!std::is_default_constructible_v<JoinIterator>); 40 } 41 test()42constexpr bool test() { 43 test_non_default_constructible<cpp17_input_iterator<ChildView*>>(); 44 // NOTE: cpp20_input_iterator can't be used with join_view because it is not copyable. 45 test_default_constructible<forward_iterator<ChildView*>>(); 46 test_default_constructible<bidirectional_iterator<ChildView*>>(); 47 test_default_constructible<random_access_iterator<ChildView*>>(); 48 test_default_constructible<contiguous_iterator<ChildView*>>(); 49 return true; 50 } 51 main(int,char **)52int main(int, char**) { 53 test(); 54 static_assert(test()); 55 return 0; 56 } 57