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 // UNSUPPORTED: c++03, c++11, c++14, c++17
9 
10 // <span>
11 //
12 // constexpr span<T, Extent>::span(Iterator it, Sentinel sent);
13 //
14 // Check that we ensure `Extent == sent - it` and also that `[it, sent)` is a valid range.
15 //
16 //
17 // constexpr span<T, dynamic_extent>::span(Iterator it, Sentinel sent);
18 //
19 // Check that we ensure that `[it, sent)` is a valid range.
20 
21 // REQUIRES: has-unix-headers
22 // XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx{{10.9|10.10|10.11|10.12|10.13|10.14|10.15|11.0|12.0}}
23 // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_ASSERTIONS=1
24 
25 #include <array>
26 #include <span>
27 
28 #include "check_assertion.h"
29 
main(int,char **)30 int main(int, char**) {
31     {
32         std::array<int, 3> array{0, 1, 2};
33 
34         auto invalid_range = [&] { std::span<int> const s(array.end(), array.begin()); (void)s; };
35         TEST_LIBCPP_ASSERT_FAILURE(invalid_range(), "invalid range in span's constructor (iterator, sentinel)");
36     }
37     {
38         std::array<int, 3> array{0, 1, 2};
39 
40         auto invalid_range = [&] { std::span<int, 3> const s(array.end(), array.begin()); (void)s; };
41         TEST_LIBCPP_ASSERT_FAILURE(invalid_range(), "invalid range in span's constructor (iterator, sentinel)");
42 
43         auto invalid_size = [&] { std::span<int, 3> const s(array.begin(), array.begin() + 2); (void)s; };
44         TEST_LIBCPP_ASSERT_FAILURE(invalid_size(), "invalid range in span's constructor (iterator, sentinel): last - first != extent");
45     }
46 
47     return 0;
48 }
49