116 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 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// <span>12 13// constexpr span(const span& other) noexcept = default;14 15#include <span>16#include <cassert>17#include <string>18#include <utility>19 20#include "test_macros.h"21 22template <class T>23constexpr void test() {24 ASSERT_NOEXCEPT(std::span<T>(std::declval<std::span<T> const&>()));25 ASSERT_NOEXCEPT(std::span<T>{std::declval<std::span<T> const&>()});26 27 // dynamic_extent28 {29 std::span<T> x;30 std::span<T> copy(x);31 assert(copy.data() == x.data());32 assert(copy.size() == x.size());33 }34 {35 T array[3] = {};36 std::span<T> x(array, 3);37 std::span<T> copy(x);38 assert(copy.data() == array);39 assert(copy.size() == 3);40 }41 {42 T array[3] = {};43 std::span<T> x(array, 2);44 std::span<T> copy(x);45 assert(copy.data() == array);46 assert(copy.size() == 2);47 }48 49 // static extent50 {51 std::span<T, 0> x;52 std::span<T, 0> copy(x);53 assert(copy.data() == x.data());54 assert(copy.size() == x.size());55 }56 {57 T array[3] = {};58 std::span<T, 3> x(array);59 std::span<T, 3> copy(x);60 assert(copy.data() == array);61 assert(copy.size() == 3);62 }63 {64 T array[2] = {};65 std::span<T, 2> x(array);66 std::span<T, 2> copy(x);67 assert(copy.data() == array);68 assert(copy.size() == 2);69 }70}71 72struct Foo {};73 74constexpr bool test_all() {75 test<int>();76 test<const int>();77 test<volatile int>();78 test<const volatile int>();79 80 test<long>();81 test<const long>();82 test<volatile long>();83 test<const volatile long>();84 85 test<double>();86 test<const double>();87 test<volatile double>();88 test<const volatile double>();89 90 // Note: Can't test non-fundamental types with volatile because we require `T*` to be indirectly_readable,91 // which isn't the case when T is volatile.92 test<Foo>();93 test<const Foo>();94 95 test<std::string>();96 test<const std::string>();97 98 // Regression test for https://llvm.org/PR10449699 {100 struct Incomplete;101 std::span<Incomplete> x;102 std::span<Incomplete> copy(x);103 assert(copy.data() == x.data());104 assert(copy.size() == x.size());105 }106 107 return true;108}109 110int main(int, char**) {111 test_all();112 static_assert(test_all());113 114 return 0;115}116