1*a8cf78c7SLouis Dionne //===---------------------------------------------------------------------===//
2*a8cf78c7SLouis Dionne //
3*a8cf78c7SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*a8cf78c7SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*a8cf78c7SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*a8cf78c7SLouis Dionne //
7*a8cf78c7SLouis Dionne //===---------------------------------------------------------------------===//
8*a8cf78c7SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14, c++17
9*a8cf78c7SLouis Dionne 
10*a8cf78c7SLouis Dionne // <span>
11*a8cf78c7SLouis Dionne 
12*a8cf78c7SLouis Dionne // template <class It, class End>
13*a8cf78c7SLouis Dionne // constexpr explicit(Extent != dynamic_extent) span(It first, End last);
14*a8cf78c7SLouis Dionne // Requires: [first, last) shall be a valid range.
15*a8cf78c7SLouis Dionne //   If Extent is not equal to dynamic_extent, then last - first shall be equal to Extent.
16*a8cf78c7SLouis Dionne //
17*a8cf78c7SLouis Dionne 
18*a8cf78c7SLouis Dionne #include <span>
19*a8cf78c7SLouis Dionne #include <cassert>
20*a8cf78c7SLouis Dionne 
21*a8cf78c7SLouis Dionne #include "test_iterators.h"
22*a8cf78c7SLouis Dionne 
23*a8cf78c7SLouis Dionne template <class T, class Sentinel>
test_ctor()24*a8cf78c7SLouis Dionne constexpr bool test_ctor() {
25*a8cf78c7SLouis Dionne   T val[2] = {};
26*a8cf78c7SLouis Dionne   auto s1 = std::span<T>(std::begin(val), Sentinel(std::end(val)));
27*a8cf78c7SLouis Dionne   auto s2 = std::span<T, 2>(std::begin(val), Sentinel(std::end(val)));
28*a8cf78c7SLouis Dionne   assert(s1.data() == std::data(val) && s1.size() == std::size(val));
29*a8cf78c7SLouis Dionne   assert(s2.data() == std::data(val) && s2.size() == std::size(val));
30*a8cf78c7SLouis Dionne   return true;
31*a8cf78c7SLouis Dionne }
32*a8cf78c7SLouis Dionne 
33*a8cf78c7SLouis Dionne template <size_t Extent>
test_constructibility()34*a8cf78c7SLouis Dionne constexpr void test_constructibility() {
35*a8cf78c7SLouis Dionne   static_assert(std::is_constructible_v<std::span<int, Extent>, int*, int*>);
36*a8cf78c7SLouis Dionne   static_assert(!std::is_constructible_v<std::span<int, Extent>, const int*, const int*>);
37*a8cf78c7SLouis Dionne   static_assert(!std::is_constructible_v<std::span<int, Extent>, volatile int*, volatile int*>);
38*a8cf78c7SLouis Dionne   static_assert(std::is_constructible_v<std::span<const int, Extent>, int*, int*>);
39*a8cf78c7SLouis Dionne   static_assert(std::is_constructible_v<std::span<const int, Extent>, const int*, const int*>);
40*a8cf78c7SLouis Dionne   static_assert(!std::is_constructible_v<std::span<const int, Extent>, volatile int*, volatile int*>);
41*a8cf78c7SLouis Dionne   static_assert(std::is_constructible_v<std::span<volatile int, Extent>, int*, int*>);
42*a8cf78c7SLouis Dionne   static_assert(!std::is_constructible_v<std::span<volatile int, Extent>, const int*, const int*>);
43*a8cf78c7SLouis Dionne   static_assert(std::is_constructible_v<std::span<volatile int, Extent>, volatile int*, volatile int*>);
44*a8cf78c7SLouis Dionne   static_assert(!std::is_constructible_v<std::span<int, Extent>, int*, float*>); // types wrong
45*a8cf78c7SLouis Dionne }
46*a8cf78c7SLouis Dionne 
test()47*a8cf78c7SLouis Dionne constexpr bool test() {
48*a8cf78c7SLouis Dionne   test_constructibility<std::dynamic_extent>();
49*a8cf78c7SLouis Dionne   test_constructibility<3>();
50*a8cf78c7SLouis Dionne   struct A {};
51*a8cf78c7SLouis Dionne   assert((test_ctor<int, int*>()));
52*a8cf78c7SLouis Dionne   assert((test_ctor<int, sized_sentinel<int*>>()));
53*a8cf78c7SLouis Dionne   assert((test_ctor<A, A*>()));
54*a8cf78c7SLouis Dionne   assert((test_ctor<A, sized_sentinel<A*>>()));
55*a8cf78c7SLouis Dionne   return true;
56*a8cf78c7SLouis Dionne }
57*a8cf78c7SLouis Dionne 
main(int,char **)58*a8cf78c7SLouis Dionne int main(int, char**) {
59*a8cf78c7SLouis Dionne   test();
60*a8cf78c7SLouis Dionne   static_assert(test());
61*a8cf78c7SLouis Dionne 
62*a8cf78c7SLouis Dionne   return 0;
63*a8cf78c7SLouis Dionne }
64