diff --git a/libcxx/docs/Status/Cxx2bIssues.csv b/libcxx/docs/Status/Cxx2bIssues.csv --- a/libcxx/docs/Status/Cxx2bIssues.csv +++ b/libcxx/docs/Status/Cxx2bIssues.csv @@ -125,7 +125,7 @@ `3570 `__,"``basic_osyncstream::emit`` should be an unformatted output function","October 2021","","" `3571 `__,"``flush_emit`` should set ``badbit`` if the ``emit`` call fails","October 2021","","" `3572 `__,"``copyable-box`` should be fully ``constexpr``","October 2021","","","|ranges|" -`3573 `__,"Missing Throws element for ``basic_string_view(It begin, End end)``","October 2021","","" +`3573 `__,"Missing Throws element for ``basic_string_view(It begin, End end)``","October 2021","|Complete|","14.0" `3574 `__,"``common_iterator`` should be completely ``constexpr``-able","October 2021","","","|ranges|" `3580 `__,"``iota_view``'s ``iterator``'s binary ``operator+`` should be improved","October 2021","","","|ranges|" `3581 `__,"The range constructor makes ``basic_string_view`` not trivially move constructible","October 2021","","","|ranges|" diff --git a/libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp b/libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp --- a/libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp +++ b/libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include "make_string.h" @@ -43,6 +44,36 @@ return true; } +#ifndef TEST_HAS_NO_EXCEPTIONS +template +struct ThrowingSentinel { + friend bool operator==(const CharT*, ThrowingSentinel) noexcept { return true; } + friend std::iter_difference_t operator-(const CharT*, ThrowingSentinel) noexcept { return {}; } + friend std::iter_difference_t operator-(ThrowingSentinel, const CharT*) { throw 42; } +}; + +template +void test_throwing() { + auto val = MAKE_STRING_VIEW(CharT, "test"); + try { + (void)std::basic_string_view(val.begin(), ThrowingSentinel()); + assert(false); + } catch (int i) { + assert(i == 42); + } +} + +void test_throwing() { + test_throwing(); +#ifndef TEST_HAS_NO_WIDE_CHARACTERS + test_throwing(); +#endif + test_throwing(); + test_throwing(); + test_throwing(); +} +#endif + static_assert( std::is_constructible_v); static_assert( std::is_constructible_v); static_assert(!std::is_constructible_v); // not a sentinel @@ -54,6 +85,10 @@ test(); static_assert(test()); +#ifndef TEST_HAS_NO_EXCEPTIONS + test_throwing(); +#endif + return 0; }