| // -*- C++ -*- |
| //===------------------------------ span ---------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is dual licensed under the MIT and the University of Illinois Open |
| // Source Licenses. See LICENSE.TXT for details. |
| // |
| //===---------------------------------------------------------------------===// |
| // UNSUPPORTED: c++98, c++03, c++11, c++14, c++17 |
| |
| // <span> |
| |
| // constexpr span(const span& other) noexcept = default; |
| |
| #include <span> |
| #include <cassert> |
| #include <string> |
| |
| #include "test_macros.h" |
| |
| template <typename T> |
| constexpr bool doCopy(const T &rhs) |
| { |
| ASSERT_NOEXCEPT(T{rhs}); |
| T lhs{rhs}; |
| return lhs.data() == rhs.data() |
| && lhs.size() == rhs.size(); |
| } |
| |
| struct A{}; |
| |
| template <typename T> |
| void testCV () |
| { |
| int arr[] = {1,2,3}; |
| assert((doCopy(std::span<T> () ))); |
| assert((doCopy(std::span<T,0>() ))); |
| assert((doCopy(std::span<T> (&arr[0], 1)))); |
| assert((doCopy(std::span<T,1>(&arr[0], 1)))); |
| assert((doCopy(std::span<T> (&arr[0], 2)))); |
| assert((doCopy(std::span<T,2>(&arr[0], 2)))); |
| } |
| |
| |
| int main () |
| { |
| constexpr int carr[] = {1,2,3}; |
| |
| static_assert(doCopy(std::span< int> ()), ""); |
| static_assert(doCopy(std::span< int,0>()), ""); |
| static_assert(doCopy(std::span<const int> (&carr[0], 1)), ""); |
| static_assert(doCopy(std::span<const int,1>(&carr[0], 1)), ""); |
| static_assert(doCopy(std::span<const int> (&carr[0], 2)), ""); |
| static_assert(doCopy(std::span<const int,2>(&carr[0], 2)), ""); |
| |
| static_assert(doCopy(std::span<long>()), ""); |
| static_assert(doCopy(std::span<double>()), ""); |
| static_assert(doCopy(std::span<A>()), ""); |
| |
| std::string s; |
| assert(doCopy(std::span<std::string> () )); |
| assert(doCopy(std::span<std::string, 0>() )); |
| assert(doCopy(std::span<std::string> (&s, 1))); |
| assert(doCopy(std::span<std::string, 1>(&s, 1))); |
| |
| testCV< int>(); |
| testCV<const int>(); |
| testCV< volatile int>(); |
| testCV<const volatile int>(); |
| } |