xref: /llvm-project/libcxx/test/std/ranges/range.adaptors/range.elements/ctor.default.pass.cpp (revision 94461822c75d5080bf648f86552f7a59b76905c9)
1*94461822SHui Xie //===----------------------------------------------------------------------===//
2*94461822SHui Xie //
3*94461822SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*94461822SHui Xie // See https://llvm.org/LICENSE.txt for license information.
5*94461822SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*94461822SHui Xie //
7*94461822SHui Xie //===----------------------------------------------------------------------===//
8*94461822SHui Xie 
9*94461822SHui Xie // UNSUPPORTED: c++03, c++11, c++14, c++17
10*94461822SHui Xie 
11*94461822SHui Xie // elements_view() requires default_initializable<V> = default;
12*94461822SHui Xie 
13*94461822SHui Xie #include <cassert>
14*94461822SHui Xie #include <ranges>
15*94461822SHui Xie #include <tuple>
16*94461822SHui Xie #include <type_traits>
17*94461822SHui Xie 
18*94461822SHui Xie template <bool DefaultInitializable>
19*94461822SHui Xie struct View : std::ranges::view_base {
20*94461822SHui Xie   int i = 42;
21*94461822SHui Xie   constexpr explicit View()
22*94461822SHui Xie     requires DefaultInitializable
23*94461822SHui Xie   = default;
24*94461822SHui Xie   std::tuple<int>* begin() const;
25*94461822SHui Xie   std::tuple<int>* end() const;
26*94461822SHui Xie };
27*94461822SHui Xie 
28*94461822SHui Xie 
29*94461822SHui Xie // clang-format off
30*94461822SHui Xie static_assert( std::is_default_constructible_v<std::ranges::elements_view<View<true >, 0>>);
31*94461822SHui Xie static_assert(!std::is_default_constructible_v<std::ranges::elements_view<View<false>, 0>>);
32*94461822SHui Xie // clang-format on
33*94461822SHui Xie 
test()34*94461822SHui Xie constexpr bool test() {
35*94461822SHui Xie   {
36*94461822SHui Xie     std::ranges::elements_view<View<true>, 0> ev = {};
37*94461822SHui Xie     assert(ev.base().i == 42);
38*94461822SHui Xie   }
39*94461822SHui Xie 
40*94461822SHui Xie   return true;
41*94461822SHui Xie }
42*94461822SHui Xie 
main(int,char **)43*94461822SHui Xie int main(int, char**) {
44*94461822SHui Xie   test();
45*94461822SHui Xie   static_assert(test());
46*94461822SHui Xie   return 0;
47*94461822SHui Xie }
48