Skip to content

Commit 6c89879

Browse files
committed
WIP: Addressed some comments
1 parent 2383ac3 commit 6c89879

File tree

3 files changed

+15
-7
lines changed

3 files changed

+15
-7
lines changed

libcxx/include/span

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,8 @@ public:
233233
_LIBCPP_HIDE_FROM_ABI constexpr explicit span(std::initializer_list<value_type> __il)
234234
requires is_const_v<element_type>
235235
: __data_{__il.begin()} {
236-
_LIBCPP_ASSERT_INTERNAL(_Extent == __il.size(), "Size mismatch in span's constructor _Extent != __il.size().");
236+
_LIBCPP_ASSERT_VALID_INPUT_RANGE(
237+
_Extent == __il.size(), "Size mismatch in span's constructor _Extent != __il.size().");
237238
}
238239
# endif
239240

libcxx/test/std/containers/views/views.span/span.cons/initializer_list.pass.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <span>
1818
#include <type_traits>
1919

20+
#include "test_convertible.h"
2021
#include "test_macros.h"
2122

2223
#if TEST_STD_VER >= 26
@@ -31,6 +32,8 @@ static_assert(!ConstElementType<std::span<int>>);
3132
static_assert(ConstElementType<std::span<const int, 94>>);
3233
static_assert(!ConstElementType<std::span<int, 94>>);
3334

35+
// Constructor constraings
36+
3437
template <typename I, typename T, std::size_t... N>
3538
concept HasInitializerListCtr = requires(I il) { std::span<T, N...>{il}; };
3639

@@ -39,6 +42,15 @@ static_assert(!HasInitializerListCtr<std::initializer_list<int>, int>);
3942
static_assert(HasInitializerListCtr<std::initializer_list<const int>, const int, 94>);
4043
static_assert(!HasInitializerListCtr<std::initializer_list<int>, int, 94>);
4144

45+
// Constructor conditionally explicit
46+
47+
static_assert(!test_convertible<std::span<const int, 28>, std::initializer_list<int>>(),
48+
"This constructor must be explicit");
49+
static_assert(std::is_constructible_v<std::span<const int, 28>, std::initializer_list<int>>);
50+
static_assert(test_convertible<std::span<const int>, std::initializer_list<int>>(),
51+
"This constructor must not be explicit");
52+
static_assert(std::is_constructible_v<std::span<const int>, std::initializer_list<int>>);
53+
4254
#endif
4355

4456
struct Sink {

libcxx/test/std/containers/views/views.span/span.cons/iterator_len.verify.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,7 @@ void test() {
3434
std::span<int> sp = {0, 0};
3535
// expected-error@+1 {{no matching constructor for initialization of 'std::span<int, 2>'}}
3636
std::span<int, 2> sp2 = {0, 0};
37-
#if TEST_STD_VER >= 26
38-
// No error in C++26
39-
std::span<const int> csp = {0, 0};
40-
// expected-error@+1 {{chosen constructor is explicit in copy-initialization}}
41-
std::span<const int, 2> csp2 = {0, 0};
42-
#else
37+
#if TEST_STD_VER < 26
4338
// expected-error@+1 {{no matching constructor for initialization of 'std::span<const int>'}}
4439
std::span<const int> csp = {0, 0};
4540
// expected-error@+1 {{no matching constructor for initialization of 'std::span<const int, 2>'}}

0 commit comments

Comments
 (0)