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
11*481ad59bSzoecarver // constexpr T* begin() noexcept;
12*481ad59bSzoecarver // constexpr const T* begin() const noexcept;
13*481ad59bSzoecarver
14*481ad59bSzoecarver #include <ranges>
15*481ad59bSzoecarver #include <cassert>
16*481ad59bSzoecarver
17*481ad59bSzoecarver #include "test_macros.h"
18*481ad59bSzoecarver
19*481ad59bSzoecarver struct Empty {};
20*481ad59bSzoecarver struct BigType { char buffer[64] = {10}; };
21*481ad59bSzoecarver
test()22*481ad59bSzoecarver constexpr bool test() {
23*481ad59bSzoecarver {
24*481ad59bSzoecarver auto sv = std::ranges::single_view<int>(42);
25*481ad59bSzoecarver assert(*sv.begin() == 42);
26*481ad59bSzoecarver
27*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.begin()), int*);
28*481ad59bSzoecarver static_assert(noexcept(sv.begin()));
29*481ad59bSzoecarver }
30*481ad59bSzoecarver {
31*481ad59bSzoecarver const auto sv = std::ranges::single_view<int>(42);
32*481ad59bSzoecarver assert(*sv.begin() == 42);
33*481ad59bSzoecarver
34*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.begin()), const int*);
35*481ad59bSzoecarver static_assert(noexcept(sv.begin()));
36*481ad59bSzoecarver }
37*481ad59bSzoecarver
38*481ad59bSzoecarver {
39*481ad59bSzoecarver auto sv = std::ranges::single_view<Empty>(Empty());
40*481ad59bSzoecarver assert(sv.begin() != nullptr);
41*481ad59bSzoecarver
42*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.begin()), Empty*);
43*481ad59bSzoecarver }
44*481ad59bSzoecarver {
45*481ad59bSzoecarver const auto sv = std::ranges::single_view<Empty>(Empty());
46*481ad59bSzoecarver assert(sv.begin() != nullptr);
47*481ad59bSzoecarver
48*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.begin()), const Empty*);
49*481ad59bSzoecarver }
50*481ad59bSzoecarver
51*481ad59bSzoecarver {
52*481ad59bSzoecarver auto sv = std::ranges::single_view<BigType>(BigType());
53*481ad59bSzoecarver assert(sv.begin()->buffer[0] == 10);
54*481ad59bSzoecarver
55*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.begin()), BigType*);
56*481ad59bSzoecarver }
57*481ad59bSzoecarver {
58*481ad59bSzoecarver const auto sv = std::ranges::single_view<BigType>(BigType());
59*481ad59bSzoecarver assert(sv.begin()->buffer[0] == 10);
60*481ad59bSzoecarver
61*481ad59bSzoecarver ASSERT_SAME_TYPE(decltype(sv.begin()), const BigType*);
62*481ad59bSzoecarver }
63*481ad59bSzoecarver
64*481ad59bSzoecarver return true;
65*481ad59bSzoecarver }
66*481ad59bSzoecarver
main(int,char **)67*481ad59bSzoecarver int main(int, char**) {
68*481ad59bSzoecarver test();
69*481ad59bSzoecarver static_assert(test());
70*481ad59bSzoecarver
71*481ad59bSzoecarver return 0;
72*481ad59bSzoecarver }
73