1*481ad59bSzoecarver //===----------------------------------------------------------------------===//
2*481ad59bSzoecarver //
3*481ad59bSzoecarver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*481ad59bSzoecarver // See https://llvm.org/LICENSE.txt for license information.
5*481ad59bSzoecarver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*481ad59bSzoecarver //
7*481ad59bSzoecarver //===----------------------------------------------------------------------===//
8*481ad59bSzoecarver
9*481ad59bSzoecarver // UNSUPPORTED: c++03, c++11, c++14, c++17
10*481ad59bSzoecarver // UNSUPPORTED: libcpp-has-no-incomplete-ranges
11*481ad59bSzoecarver
12*481ad59bSzoecarver // constexpr T* data() noexcept;
13*481ad59bSzoecarver // constexpr const T* data() const noexcept;
14*481ad59bSzoecarver
15*481ad59bSzoecarver #include <ranges>
16*481ad59bSzoecarver #include <cassert>
17*481ad59bSzoecarver
18*481ad59bSzoecarver #include "test_macros.h"
19*481ad59bSzoecarver
20*481ad59bSzoecarver struct Empty {};
21*481ad59bSzoecarver struct BigType { char buffer[64] = {10}; };
22*481ad59bSzoecarver
test()23*481ad59bSzoecarver constexpr bool test() {
24*481ad59bSzoecarver {
25*481ad59bSzoecarver auto sv = std::ranges::single_view<int>(42);
26*481ad59bSzoecarver assert(*sv.data() == 42);
27*481ad59bSzoecarver
28*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.data()), int*);
29*481ad59bSzoecarver static_assert(noexcept(sv.data()));
30*481ad59bSzoecarver }
31*481ad59bSzoecarver {
32*481ad59bSzoecarver const auto sv = std::ranges::single_view<int>(42);
33*481ad59bSzoecarver assert(*sv.data() == 42);
34*481ad59bSzoecarver
35*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.data()), const int*);
36*481ad59bSzoecarver static_assert(noexcept(sv.data()));
37*481ad59bSzoecarver }
38*481ad59bSzoecarver
39*481ad59bSzoecarver {
40*481ad59bSzoecarver auto sv = std::ranges::single_view<Empty>(Empty());
41*481ad59bSzoecarver assert(sv.data() != nullptr);
42*481ad59bSzoecarver
43*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.data()), Empty*);
44*481ad59bSzoecarver }
45*481ad59bSzoecarver {
46*481ad59bSzoecarver const auto sv = std::ranges::single_view<Empty>(Empty());
47*481ad59bSzoecarver assert(sv.data() != nullptr);
48*481ad59bSzoecarver
49*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.data()), const Empty*);
50*481ad59bSzoecarver }
51*481ad59bSzoecarver
52*481ad59bSzoecarver {
53*481ad59bSzoecarver auto sv = std::ranges::single_view<BigType>(BigType());
54*481ad59bSzoecarver assert(sv.data()->buffer[0] == 10);
55*481ad59bSzoecarver
56*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.data()), BigType*);
57*481ad59bSzoecarver }
58*481ad59bSzoecarver {
59*481ad59bSzoecarver const auto sv = std::ranges::single_view<BigType>(BigType());
60*481ad59bSzoecarver assert(sv.data()->buffer[0] == 10);
61*481ad59bSzoecarver
62*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.data()), const BigType*);
63*481ad59bSzoecarver }
64*481ad59bSzoecarver
65*481ad59bSzoecarver return true;
66*481ad59bSzoecarver }
67*481ad59bSzoecarver
main(int,char **)68*481ad59bSzoecarver int main(int, char**) {
69*481ad59bSzoecarver test();
70*481ad59bSzoecarver static_assert(test());
71*481ad59bSzoecarver
72*481ad59bSzoecarver return 0;
73*481ad59bSzoecarver }
74