Skip to content

Commit

Permalink
[libc++][span] SFINAE span default constructor on Extent == 0
Browse files Browse the repository at this point in the history
The default constructor of a static span requires _Extent == 0 so
SFINAE it out rather than using a static_assert

Differential Revision: https://reviews.llvm.org/D71994
  • Loading branch information
miscco authored and ldionne committed May 14, 2020
1 parent d061685 commit 7994108
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 8 deletions.
4 changes: 2 additions & 2 deletions libcxx/include/span
Expand Up @@ -200,8 +200,8 @@ public:
static constexpr size_type extent = _Extent;

// [span.cons], span constructors, copy, assignment, and destructor
_LIBCPP_INLINE_VISIBILITY constexpr span() noexcept : __data{nullptr}
{ static_assert(_Extent == 0, "Can't default construct a statically sized span with size > 0"); }
template <size_t _Sz = _Extent, enable_if_t<_Sz == 0, nullptr_t> = nullptr>
_LIBCPP_INLINE_VISIBILITY constexpr span() noexcept : __data{nullptr} {}

constexpr span (const span&) noexcept = default;
constexpr span& operator=(const span&) noexcept = default;
Expand Down
7 changes: 2 additions & 5 deletions libcxx/test/std/containers/views/span.cons/default.fail.cpp
Expand Up @@ -13,7 +13,7 @@
// constexpr span() noexcept;
//
// Remarks: This constructor shall not participate in overload resolution
// unless Extent <= 0 is true.
// unless Extent == 0 || Extent == dynamic_extent is true.


#include <span>
Expand All @@ -24,10 +24,7 @@

int main(int, char**)
{
std::span<int, 2> s; // expected-error-re@span:* {{static_assert failed{{( due to requirement '.*')?}} "Can't default construct a statically sized span with size > 0"}}

// TODO: This is what I want:
// eXpected-error {{no matching constructor for initialization of 'std::span<int, 2>'}}
std::span<int, 2> s; // expected-error {{no matching constructor for initialization of 'std::span<int, 2>'}}

return 0;
}
7 changes: 6 additions & 1 deletion libcxx/test/std/containers/views/span.cons/default.pass.cpp
Expand Up @@ -15,6 +15,7 @@
#include <span>
#include <cassert>
#include <string>
#include <type_traits>

#include "test_macros.h"

Expand Down Expand Up @@ -79,5 +80,9 @@ int main(int, char**)

checkCV();

return 0;
static_assert( std::is_default_constructible_v<std::span<int, std::dynamic_extent>>, "");
static_assert( std::is_default_constructible_v<std::span<int, 0>>, "");
static_assert(!std::is_default_constructible_v<std::span<int, 2>>, "");

return 0;
}

0 comments on commit 7994108

Please sign in to comment.