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() noexcept; |
13 | |
14 | #include <span> |
15 | #include <cassert> |
16 | #include <string> |
17 | #include <type_traits> |
18 | |
19 | #include "test_macros.h" |
20 | |
21 | void checkCV() |
22 | { |
23 | // Types the same (dynamic sized) |
24 | { |
25 | std::span< int> s1; |
26 | std::span<const int> s2; |
27 | std::span< volatile int> s3; |
28 | std::span<const volatile int> s4; |
29 | assert(s1.size() + s2.size() + s3.size() + s4.size() == 0); |
30 | } |
31 | |
32 | // Types the same (static sized) |
33 | { |
34 | std::span< int,0> s1; |
35 | std::span<const int,0> s2; |
36 | std::span< volatile int,0> s3; |
37 | std::span<const volatile int,0> s4; |
38 | assert(s1.size() + s2.size() + s3.size() + s4.size() == 0); |
39 | } |
40 | } |
41 | |
42 | |
43 | template <typename T> |
44 | constexpr bool testConstexprSpan() |
45 | { |
46 | std::span<const T> s1; |
47 | std::span<const T, 0> s2; |
48 | return |
49 | s1.data() == nullptr && s1.size() == 0 |
50 | && s2.data() == nullptr && s2.size() == 0; |
51 | } |
52 | |
53 | |
54 | template <typename T> |
55 | void testRuntimeSpan() |
56 | { |
57 | ASSERT_NOEXCEPT(T{}); |
58 | std::span<const T> s1; |
59 | std::span<const T, 0> s2; |
60 | assert(s1.data() == nullptr && s1.size() == 0); |
61 | assert(s2.data() == nullptr && s2.size() == 0); |
62 | } |
63 | |
64 | |
65 | struct A{}; |
66 | |
67 | int main(int, char**) |
68 | { |
69 | static_assert(testConstexprSpan<int>(), "" ); |
70 | static_assert(testConstexprSpan<long>(), "" ); |
71 | static_assert(testConstexprSpan<double>(), "" ); |
72 | static_assert(testConstexprSpan<A>(), "" ); |
73 | |
74 | testRuntimeSpan<int>(); |
75 | testRuntimeSpan<long>(); |
76 | testRuntimeSpan<double>(); |
77 | testRuntimeSpan<std::string>(); |
78 | testRuntimeSpan<A>(); |
79 | |
80 | checkCV(); |
81 | |
82 | static_assert( std::is_default_constructible_v<std::span<int, std::dynamic_extent>>, "" ); |
83 | static_assert( std::is_default_constructible_v<std::span<int, 0>>, "" ); |
84 | static_assert(!std::is_default_constructible_v<std::span<int, 2>>, "" ); |
85 | |
86 | return 0; |
87 | } |
88 | |