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 <class It> 13a8cf78c7SLouis Dionne // constexpr explicit(Extent != dynamic_extent) span(It first, size_type count); 14a8cf78c7SLouis Dionne // If Extent is not equal to dynamic_extent, then count shall be equal to Extent. 15a8cf78c7SLouis Dionne // 16a8cf78c7SLouis Dionne 17a8cf78c7SLouis Dionne #include <cassert> 18*e99c4906SNikolas Klauser #include <cstddef> 19a8cf78c7SLouis Dionne #include <iterator> 20*e99c4906SNikolas Klauser #include <span> 21a8cf78c7SLouis Dionne #include <type_traits> 22a8cf78c7SLouis Dionne 23fb855eb9SMark de Wever template <std::size_t Extent> 24a8cf78c7SLouis Dionne constexpr void test_constructibility() { 25a8cf78c7SLouis Dionne struct Other {}; 26fb855eb9SMark de Wever static_assert(std::is_constructible_v<std::span<int, Extent>, int*, std::size_t>); 27fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<int, Extent>, const int*, std::size_t>); 28fb855eb9SMark de Wever static_assert(std::is_constructible_v<std::span<const int, Extent>, int*, std::size_t>); 29fb855eb9SMark de Wever static_assert(std::is_constructible_v<std::span<const int, Extent>, const int*, std::size_t>); 30fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<int, Extent>, volatile int*, std::size_t>); 31fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<int, Extent>, const volatile int*, std::size_t>); 32fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<const int, Extent>, volatile int*, std::size_t>); 33fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<const int, Extent>, const volatile int*, std::size_t>); 34fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<volatile int, Extent>, const int*, std::size_t>); 35fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<volatile int, Extent>, const volatile int*, std::size_t>); 36a8cf78c7SLouis Dionne static_assert( 37fb855eb9SMark de Wever !std::is_constructible_v<std::span<int, Extent>, double*, std::size_t>); // iterator type differs from span type 38fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<int, Extent>, std::size_t, size_t>); 39fb855eb9SMark de Wever static_assert(!std::is_constructible_v<std::span<int, Extent>, Other*, std::size_t>); // unrelated iterator type 40a8cf78c7SLouis Dionne } 41a8cf78c7SLouis Dionne 42a8cf78c7SLouis Dionne template <class T> 43a8cf78c7SLouis Dionne constexpr bool test_ctor() { 44a8cf78c7SLouis Dionne T val[2] = {}; 45a8cf78c7SLouis Dionne auto s1 = std::span<T>(val, 2); 46a8cf78c7SLouis Dionne auto s2 = std::span<T, 2>(val, 2); 47a8cf78c7SLouis Dionne assert(s1.data() == std::data(val) && s1.size() == std::size(val)); 48a8cf78c7SLouis Dionne assert(s2.data() == std::data(val) && s2.size() == std::size(val)); 49a8cf78c7SLouis Dionne return true; 50a8cf78c7SLouis Dionne } 51a8cf78c7SLouis Dionne 52a8cf78c7SLouis Dionne constexpr bool test() { 53a8cf78c7SLouis Dionne test_constructibility<std::dynamic_extent>(); 54a8cf78c7SLouis Dionne test_constructibility<3>(); 55a8cf78c7SLouis Dionne 56a8cf78c7SLouis Dionne struct A {}; 57a8cf78c7SLouis Dionne test_ctor<int>(); 58a8cf78c7SLouis Dionne test_ctor<A>(); 59a8cf78c7SLouis Dionne 60a8cf78c7SLouis Dionne return true; 61a8cf78c7SLouis Dionne } 62a8cf78c7SLouis Dionne 63a8cf78c7SLouis Dionne int main(int, char**) { 64a8cf78c7SLouis Dionne test(); 65a8cf78c7SLouis Dionne static_assert(test()); 66a8cf78c7SLouis Dionne 67a8cf78c7SLouis Dionne return 0; 68a8cf78c7SLouis Dionne } 69