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// template<class OtherElementType, size_t OtherExtent>
13// constexpr span(const span<OtherElementType, OtherExtent>& s) noexcept;
14//
15// Remarks: This constructor shall not participate in overload resolution unless:
16// Extent == dynamic_extent || Extent == OtherExtent is true, and
17// OtherElementType(*)[] is convertible to ElementType(*)[].
18
19#include <span>
20#include <cassert>
21#include <string>
22
23#include "test_macros.h"
24
25template <class T, class From>
26TEST_CONSTEXPR_CXX20 void check() {
27 // dynamic -> dynamic
28 {
29 {
30 std::span<From> from;
31 std::span<T> span{from};
32 ASSERT_NOEXCEPT(std::span<T>(from));
33 assert(span.data() == nullptr);
34 assert(span.size() == 0);
35 }
36 {
37 From array[3] = {};
38 std::span<From> from(array);
39 std::span<T> span{from};
40 ASSERT_NOEXCEPT(std::span<T>(from));
41 assert(span.data() == array);
42 assert(span.size() == 3);
43 }
44 }
45
46 // static -> static
47 {
48 {
49 std::span<From, 0> from;
50 std::span<T, 0> span{from};
51 ASSERT_NOEXCEPT(std::span<T, 0>(from));
52 assert(span.data() == nullptr);
53 assert(span.size() == 0);
54 }
55
56 {
57 From array[3] = {};
58 std::span<From, 3> from(array);
59 std::span<T, 3> span{from};
60 ASSERT_NOEXCEPT(std::span<T, 3>(from));
61 assert(span.data() == array);
62 assert(span.size() == 3);
63 }
64 }
65
66 // static -> dynamic
67 {
68 {
69 std::span<From, 0> from;
70 std::span<T> span{from};
71 ASSERT_NOEXCEPT(std::span<T>(from));
72 assert(span.data() == nullptr);
73 assert(span.size() == 0);
74 }
75
76 {
77 From array[3] = {};
78 std::span<From, 3> from(array);
79 std::span<T> span{from};
80 ASSERT_NOEXCEPT(std::span<T>(from));
81 assert(span.data() == array);
82 assert(span.size() == 3);
83 }
84 }
85
86 // dynamic -> static (not allowed)
87}
88
89template <class T>
90TEST_CONSTEXPR_CXX20 void check_cvs() {
91 check<T, T>();
92
93 check<T const, T>();
94 check<T const, T const>();
95
96 check<T volatile, T>();
97 check<T volatile, T volatile>();
98
99 check<T const volatile, T>();
100 check<T const volatile, T const>();
101 check<T const volatile, T volatile>();
102 check<T const volatile, T const volatile>();
103}
104
105struct A {};
106
107TEST_CONSTEXPR_CXX20 bool test() {
108 check_cvs<int>();
109 check_cvs<long>();
110 check_cvs<double>();
111 check_cvs<std::string>();
112 check_cvs<A>();
113 return true;
114}
115
116int main(int, char**) {
117 static_assert(test());
118 test();
119
120 return 0;
121}
122

source code of libcxx/test/std/containers/views/views.span/span.cons/span.pass.cpp