1df324bbaSzoecarver //===----------------------------------------------------------------------===//
2df324bbaSzoecarver //
3df324bbaSzoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4df324bbaSzoecarver // See https://llvm.org/LICENSE.txt for license information.
5df324bbaSzoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6df324bbaSzoecarver //
7df324bbaSzoecarver //===----------------------------------------------------------------------===//
8df324bbaSzoecarver 
9df324bbaSzoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
10df324bbaSzoecarver // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11df324bbaSzoecarver 
12df324bbaSzoecarver // join_view() requires default_initializable<V> = default;
13df324bbaSzoecarver 
14df324bbaSzoecarver #include <cassert>
15df324bbaSzoecarver #include <ranges>
16df324bbaSzoecarver 
17df324bbaSzoecarver #include "types.h"
18df324bbaSzoecarver 
19*3d3103b7SHui Xie struct DefaultView : std::ranges::view_base {
20*3d3103b7SHui Xie   int i; // deliberately uninitialised
21*3d3103b7SHui Xie 
22*3d3103b7SHui Xie   ChildView* begin() const;
23*3d3103b7SHui Xie   ChildView* end() const;
24*3d3103b7SHui Xie };
25df324bbaSzoecarver 
test()26df324bbaSzoecarver constexpr bool test() {
27*3d3103b7SHui Xie   {
28df324bbaSzoecarver     std::ranges::join_view<ParentView<ChildView>> jv;
29df324bbaSzoecarver     assert(std::move(jv).base().ptr_ == globalChildren);
30*3d3103b7SHui Xie   }
31*3d3103b7SHui Xie 
32*3d3103b7SHui Xie   // Default constructor should value initialise underlying view
33*3d3103b7SHui Xie   {
34*3d3103b7SHui Xie     std::ranges::join_view<DefaultView> jv;
35*3d3103b7SHui Xie     assert(jv.base().i == 0);
36*3d3103b7SHui Xie   }
37df324bbaSzoecarver 
38df324bbaSzoecarver   static_assert( std::default_initializable<std::ranges::join_view<ParentView<ChildView>>>);
39df324bbaSzoecarver   static_assert(!std::default_initializable<std::ranges::join_view<CopyableParent>>);
40df324bbaSzoecarver 
41df324bbaSzoecarver   return true;
42df324bbaSzoecarver }
43df324bbaSzoecarver 
main(int,char **)44df324bbaSzoecarver int main(int, char**) {
45df324bbaSzoecarver   test();
46df324bbaSzoecarver   static_assert(test());
47df324bbaSzoecarver 
48df324bbaSzoecarver   return 0;
49df324bbaSzoecarver }
50