//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14, c++17 // // constexpr span(const span& other) noexcept = default; #include #include #include #include #include "test_macros.h" template constexpr void test() { ASSERT_NOEXCEPT(std::span(std::declval const&>())); ASSERT_NOEXCEPT(std::span{std::declval const&>()}); // dynamic_extent { std::span x; std::span copy(x); assert(copy.data() == x.data()); assert(copy.size() == x.size()); } { T array[3] = {}; std::span x(array, 3); std::span copy(x); assert(copy.data() == array); assert(copy.size() == 3); } { T array[3] = {}; std::span x(array, 2); std::span copy(x); assert(copy.data() == array); assert(copy.size() == 2); } // static extent { std::span x; std::span copy(x); assert(copy.data() == x.data()); assert(copy.size() == x.size()); } { T array[3] = {}; std::span x(array); std::span copy(x); assert(copy.data() == array); assert(copy.size() == 3); } { T array[2] = {}; std::span x(array); std::span copy(x); assert(copy.data() == array); assert(copy.size() == 2); } } struct Foo {}; constexpr bool test_all() { test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); test(); // Note: Can't test non-fundamental types with volatile because we require `T*` to be indirectly_readable, // which isn't the case when T is volatile. test(); test(); test(); test(); // Regression test for https://github.com/llvm/llvm-project/issues/104496 { struct Incomplete; std::span x; std::span copy(x); assert(copy.data() == x.data()); assert(copy.size() == x.size()); } return true; } int main(int, char**) { test_all(); static_assert(test_all()); return 0; }