diff options
Diffstat (limited to 'libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc')
-rw-r--r-- | libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc index bd50c3058e6..a5745fcb603 100644 --- a/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc +++ b/libstdc++-v3/testsuite/21_strings/basic_string_view/cons/char/range_c++20.cc @@ -36,7 +36,7 @@ test01() }; R r; - std::string_view s = r; + std::string_view s{r}; VERIFY( s == r.str ); VERIFY( s.data() == std::ranges::data(r) ); VERIFY( s.size() == std::ranges::size(r) ); @@ -50,10 +50,15 @@ test01() static_assert( std::ranges::contiguous_range<R2> ); static_assert( std::ranges::sized_range<R2> ); R2 r2; - std::string_view s2 = r2; // uses conversion to string_view + std::string_view s2(r2); // uses conversion to string_view VERIFY( s2 == "Out of range" ); VERIFY( std::string_view(const_cast<const R2&>(r2)) == s2 ); + // And again using copy-initialization instead of direct-initialization. + std::string_view s2_implicit = r2; // uses conversion to string_view + VERIFY( s2_implicit == "Out of range" ); + VERIFY( std::string_view(const_cast<const R2&>(r2)) == s2_implicit ); + struct R3 : R { using R::begin; @@ -91,7 +96,7 @@ test01() static_assert( std::ranges::contiguous_range<R5> ); static_assert( std::ranges::sized_range<R5> ); R5 r5; - std::string_view s5 = r5; // Uses range constructor + std::string_view s5(r5); // Uses range constructor VERIFY( s5 == r5.str ); s5 = std::string_view(std::move(r5)); // In C++20 this used conversion op. VERIFY( s5 == r5.str ); // In C++23 it uses range constructor. @@ -156,15 +161,30 @@ test04() }; R r; - std::basic_string_view s = r; // Use deduction guide. + std::basic_string_view s(r); // Use deduction guide. static_assert( std::is_same_v<decltype(s), std::string_view> ); } +void +test05() +{ + struct R + { + const char* begin() const { return nullptr; } + const char* end() const { return nullptr; } + }; + + // P2499R0 string_view range constructor should be explicit + // P2516R0 string_view is implicitly convertible from what? + static_assert( ! std::is_convertible_v<R, std::string_view> ); +} + int main() { test01(); test02(); test03(); test04(); + test05(); } |