blob: 80a0f07f625220c00ae7ce0122901697b6dc476c [file] [log] [blame]
Marshall Clow8a0794b2018-07-24 03:01:02 +00001// -*- C++ -*-
2//===------------------------------ span ---------------------------------===//
3//
4// The LLVM Compiler Infrastructure
5//
6// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
8//
9//===---------------------------------------------------------------------===//
10// UNSUPPORTED: c++98, c++03, c++11, c++14, c++17
11
12// <span>
13
14// template<size_t N>
15// constexpr span(element_type (&arr)[N]) noexcept;
16//
17// Remarks: These constructors shall not participate in overload resolution unless:
18// — extent == dynamic_extent || N == extent is true, and
19// — remove_pointer_t<decltype(data(arr))>(*)[] is convertible to ElementType(*)[].
20//
21
22
23#include <span>
24#include <cassert>
25#include <string>
26
27#include "test_macros.h"
28
29
30void checkCV()
31{
32 int arr[] = {1,2,3};
33 const int carr[] = {4,5,6};
34 volatile int varr[] = {7,8,9};
35 const volatile int cvarr[] = {1,3,5};
36
37// Types the same (dynamic sized)
38 {
39 std::span< int> s1{ arr}; // a span< int> pointing at int.
40 std::span<const int> s2{ carr}; // a span<const int> pointing at const int.
41 std::span< volatile int> s3{ varr}; // a span< volatile int> pointing at volatile int.
42 std::span<const volatile int> s4{cvarr}; // a span<const volatile int> pointing at const volatile int.
43 assert(s1.size() + s2.size() + s3.size() + s4.size() == 12);
44 }
45
46// Types the same (static sized)
47 {
48 std::span< int,3> s1{ arr}; // a span< int> pointing at int.
49 std::span<const int,3> s2{ carr}; // a span<const int> pointing at const int.
50 std::span< volatile int,3> s3{ varr}; // a span< volatile int> pointing at volatile int.
51 std::span<const volatile int,3> s4{cvarr}; // a span<const volatile int> pointing at const volatile int.
52 assert(s1.size() + s2.size() + s3.size() + s4.size() == 12);
53 }
54
55
56// types different (dynamic sized)
57 {
58 std::span<const int> s1{ arr}; // a span<const int> pointing at int.
59 std::span< volatile int> s2{ arr}; // a span< volatile int> pointing at int.
60 std::span< volatile int> s3{ arr}; // a span< volatile int> pointing at const int.
61 std::span<const volatile int> s4{ arr}; // a span<const volatile int> pointing at int.
62 std::span<const volatile int> s5{carr}; // a span<const volatile int> pointing at const int.
63 std::span<const volatile int> s6{varr}; // a span<const volatile int> pointing at volatile int.
64 assert(s1.size() + s2.size() + s3.size() + s4.size() + s5.size() + s6.size() == 18);
65 }
66
67// types different (static sized)
68 {
69 std::span<const int,3> s1{ arr}; // a span<const int> pointing at int.
70 std::span< volatile int,3> s2{ arr}; // a span< volatile int> pointing at int.
71 std::span< volatile int,3> s3{ arr}; // a span< volatile int> pointing at const int.
72 std::span<const volatile int,3> s4{ arr}; // a span<const volatile int> pointing at int.
73 std::span<const volatile int,3> s5{carr}; // a span<const volatile int> pointing at const int.
74 std::span<const volatile int,3> s6{varr}; // a span<const volatile int> pointing at volatile int.
75 assert(s1.size() + s2.size() + s3.size() + s4.size() + s5.size() + s6.size() == 18);
76 }
77}
78
79
80template <typename T>
81constexpr bool testConstexprSpan()
82{
83 constexpr T val[2] = {};
84
85 ASSERT_NOEXCEPT(std::span<const T> {val});
86 ASSERT_NOEXCEPT(std::span<const T, 2>{val});
87 std::span<const T> s1{val};
88 std::span<const T, 2> s2{val};
89 return
90 s1.data() == &val[0] && s1.size() == 2
91 && s2.data() == &val[0] && s2.size() == 2;
92}
93
94
95template <typename T>
96void testRuntimeSpan()
97{
98 T val[2] = {};
99 ASSERT_NOEXCEPT(std::span<T> {val});
100 ASSERT_NOEXCEPT(std::span<T, 2>{val});
101 std::span<T> s1{val};
102 std::span<T, 2> s2{val};
103 assert(s1.data() == &val[0] && s1.size() == 2);
104 assert(s2.data() == &val[0] && s2.size() == 2);
105}
106
107struct A{};
108
109int main ()
110{
111 static_assert(testConstexprSpan<int>(), "");
112 static_assert(testConstexprSpan<long>(), "");
113 static_assert(testConstexprSpan<double>(), "");
114 static_assert(testConstexprSpan<A>(), "");
115
116 testRuntimeSpan<int>();
117 testRuntimeSpan<long>();
118 testRuntimeSpan<double>();
119 testRuntimeSpan<std::string>();
120 testRuntimeSpan<A>();
121
122 checkCV();
123}