122 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8// UNSUPPORTED: c++03, c++11, c++14, c++179 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, and17// 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 -> dynamic28 {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 -> static47 {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 -> dynamic67 {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