1a8cf78c7SLouis Dionne //===----------------------------------------------------------------------===//
2a8cf78c7SLouis Dionne //
3a8cf78c7SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a8cf78c7SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5a8cf78c7SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a8cf78c7SLouis Dionne //
7a8cf78c7SLouis Dionne //===----------------------------------------------------------------------===//
8a8cf78c7SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
9a8cf78c7SLouis Dionne
10a8cf78c7SLouis Dionne // <span>
11a8cf78c7SLouis Dionne
12a8cf78c7SLouis Dionne // template<size_t N>
13a8cf78c7SLouis Dionne // constexpr span(array<value_type, N>& arr) noexcept;
14a8cf78c7SLouis Dionne // template<size_t N>
15a8cf78c7SLouis Dionne // constexpr span(const array<value_type, N>& arr) noexcept;
16a8cf78c7SLouis Dionne //
17a8cf78c7SLouis Dionne // Remarks: These constructors shall not participate in overload resolution unless:
18*355e0ce3SLouis Dionne // - extent == dynamic_extent || N == extent is true, and
19*355e0ce3SLouis Dionne // - remove_pointer_t<decltype(data(arr))>(*)[] is convertible to ElementType(*)[].
20a8cf78c7SLouis Dionne //
21a8cf78c7SLouis Dionne
22a8cf78c7SLouis Dionne
23a8cf78c7SLouis Dionne #include <span>
24a8cf78c7SLouis Dionne #include <array>
25a8cf78c7SLouis Dionne #include <cassert>
26a8cf78c7SLouis Dionne #include <string>
27a8cf78c7SLouis Dionne
28a8cf78c7SLouis Dionne #include "test_macros.h"
29a8cf78c7SLouis Dionne
checkCV()30a8cf78c7SLouis Dionne void checkCV()
31a8cf78c7SLouis Dionne {
32a8cf78c7SLouis Dionne std::array<int, 3> arr = {1,2,3};
33a8cf78c7SLouis Dionne // STL says these are not cromulent
34a8cf78c7SLouis Dionne // std::array<const int,3> carr = {4,5,6};
35a8cf78c7SLouis Dionne // std::array<volatile int, 3> varr = {7,8,9};
36a8cf78c7SLouis Dionne // std::array<const volatile int, 3> cvarr = {1,3,5};
37a8cf78c7SLouis Dionne
38a8cf78c7SLouis Dionne // Types the same (dynamic sized)
39a8cf78c7SLouis Dionne {
40a8cf78c7SLouis Dionne std::span< int> s1{ arr}; // a span< int> pointing at int.
41a8cf78c7SLouis Dionne }
42a8cf78c7SLouis Dionne
43a8cf78c7SLouis Dionne // Types the same (static sized)
44a8cf78c7SLouis Dionne {
45a8cf78c7SLouis Dionne std::span< int,3> s1{ arr}; // a span< int> pointing at int.
46a8cf78c7SLouis Dionne }
47a8cf78c7SLouis Dionne
48a8cf78c7SLouis Dionne
49a8cf78c7SLouis Dionne // types different (dynamic sized)
50a8cf78c7SLouis Dionne {
51a8cf78c7SLouis Dionne std::span<const int> s1{ arr}; // a span<const int> pointing at int.
52a8cf78c7SLouis Dionne std::span< volatile int> s2{ arr}; // a span< volatile int> pointing at int.
53a8cf78c7SLouis Dionne std::span< volatile int> s3{ arr}; // a span< volatile int> pointing at const int.
54a8cf78c7SLouis Dionne std::span<const volatile int> s4{ arr}; // a span<const volatile int> pointing at int.
55a8cf78c7SLouis Dionne }
56a8cf78c7SLouis Dionne
57a8cf78c7SLouis Dionne // types different (static sized)
58a8cf78c7SLouis Dionne {
59a8cf78c7SLouis Dionne std::span<const int,3> s1{ arr}; // a span<const int> pointing at int.
60a8cf78c7SLouis Dionne std::span< volatile int,3> s2{ arr}; // a span< volatile int> pointing at int.
61a8cf78c7SLouis Dionne std::span< volatile int,3> s3{ arr}; // a span< volatile int> pointing at const int.
62a8cf78c7SLouis Dionne std::span<const volatile int,3> s4{ arr}; // a span<const volatile int> pointing at int.
63a8cf78c7SLouis Dionne }
64a8cf78c7SLouis Dionne }
65a8cf78c7SLouis Dionne
66a8cf78c7SLouis Dionne template <typename T, typename U>
testConstructorArray()67a8cf78c7SLouis Dionne constexpr bool testConstructorArray() {
68a8cf78c7SLouis Dionne std::array<U, 2> val = {U(), U()};
69a8cf78c7SLouis Dionne ASSERT_NOEXCEPT(std::span<T>{val});
70a8cf78c7SLouis Dionne ASSERT_NOEXCEPT(std::span<T, 2>{val});
71a8cf78c7SLouis Dionne std::span<T> s1{val};
72a8cf78c7SLouis Dionne std::span<T, 2> s2{val};
73a8cf78c7SLouis Dionne return s1.data() == &val[0] && s1.size() == 2 && s2.data() == &val[0] &&
74a8cf78c7SLouis Dionne s2.size() == 2;
75a8cf78c7SLouis Dionne }
76a8cf78c7SLouis Dionne
77a8cf78c7SLouis Dionne template <typename T, typename U>
testConstructorConstArray()78a8cf78c7SLouis Dionne constexpr bool testConstructorConstArray() {
79a8cf78c7SLouis Dionne const std::array<U, 2> val = {U(), U()};
80a8cf78c7SLouis Dionne ASSERT_NOEXCEPT(std::span<const T>{val});
81a8cf78c7SLouis Dionne ASSERT_NOEXCEPT(std::span<const T, 2>{val});
82a8cf78c7SLouis Dionne std::span<const T> s1{val};
83a8cf78c7SLouis Dionne std::span<const T, 2> s2{val};
84a8cf78c7SLouis Dionne return s1.data() == &val[0] && s1.size() == 2 && s2.data() == &val[0] &&
85a8cf78c7SLouis Dionne s2.size() == 2;
86a8cf78c7SLouis Dionne }
87a8cf78c7SLouis Dionne
88a8cf78c7SLouis Dionne template <typename T>
testConstructors()89a8cf78c7SLouis Dionne constexpr bool testConstructors() {
90a8cf78c7SLouis Dionne static_assert(testConstructorArray<T, T>(), "");
91a8cf78c7SLouis Dionne static_assert(testConstructorArray<const T, const T>(), "");
92a8cf78c7SLouis Dionne static_assert(testConstructorArray<const T, T>(), "");
93a8cf78c7SLouis Dionne static_assert(testConstructorConstArray<T, T>(), "");
94a8cf78c7SLouis Dionne static_assert(testConstructorConstArray<const T, const T>(), "");
95a8cf78c7SLouis Dionne static_assert(testConstructorConstArray<const T, T>(), "");
96a8cf78c7SLouis Dionne
97a8cf78c7SLouis Dionne return testConstructorArray<T, T>() &&
98a8cf78c7SLouis Dionne testConstructorArray<const T, const T>() &&
99a8cf78c7SLouis Dionne testConstructorArray<const T, T>() &&
100a8cf78c7SLouis Dionne testConstructorConstArray<T, T>() &&
101a8cf78c7SLouis Dionne testConstructorConstArray<const T, const T>() &&
102a8cf78c7SLouis Dionne testConstructorConstArray<const T, T>();
103a8cf78c7SLouis Dionne }
104a8cf78c7SLouis Dionne
105a8cf78c7SLouis Dionne struct A{};
106a8cf78c7SLouis Dionne
main(int,char **)107a8cf78c7SLouis Dionne int main(int, char**)
108a8cf78c7SLouis Dionne {
109a8cf78c7SLouis Dionne assert(testConstructors<int>());
110a8cf78c7SLouis Dionne assert(testConstructors<long>());
111a8cf78c7SLouis Dionne assert(testConstructors<double>());
112a8cf78c7SLouis Dionne assert(testConstructors<A>());
113a8cf78c7SLouis Dionne
114a8cf78c7SLouis Dionne assert(testConstructors<int*>());
115a8cf78c7SLouis Dionne assert(testConstructors<const int*>());
116a8cf78c7SLouis Dionne
117a8cf78c7SLouis Dionne checkCV();
118a8cf78c7SLouis Dionne
119a8cf78c7SLouis Dionne return 0;
120a8cf78c7SLouis Dionne }
121