[libcxx-commits] [libcxx] 494dad6 - [libc++][NFC] Mark LWG3573 as complete

Joe Loser via libcxx-commits libcxx-commits at lists.llvm.org
Tue Oct 19 11:19:52 PDT 2021


Author: Joe Loser
Date: 2021-10-19T14:18:49-04:00
New Revision: 494dad6b72d499ea832ab4b9b9bb76e0330e4eeb

URL: https://github.com/llvm/llvm-project/commit/494dad6b72d499ea832ab4b9b9bb76e0330e4eeb
DIFF: https://github.com/llvm/llvm-project/commit/494dad6b72d499ea832ab4b9b9bb76e0330e4eeb.diff

LOG: [libc++][NFC] Mark LWG3573 as complete

Mark LWG3573 as complete. It involves a change in wording around when
`basic_string_view`'s constructor for iterator/sentinel can throw. The
current implementation is not marked conditionally `noexcept`, so there
is nothing to do here. Add a test that binds this behavior to verify the
constructor is not marked `noexcept(true)` when `end - begin` throws.

Reviewed By: ldionne, Mordante, #libc

Differential Revision: https://reviews.llvm.org/D111925

Added: 
    

Modified: 
    libcxx/docs/Status/Cxx2bIssues.csv
    libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/docs/Status/Cxx2bIssues.csv b/libcxx/docs/Status/Cxx2bIssues.csv
index 97c560407c0f4..93ef7246eb520 100644
--- a/libcxx/docs/Status/Cxx2bIssues.csv
+++ b/libcxx/docs/Status/Cxx2bIssues.csv
@@ -125,7 +125,7 @@
 `3570 <https://wg21.link/LWG3570>`__,"``basic_osyncstream::emit`` should be an unformatted output function","October 2021","",""
 `3571 <https://wg21.link/LWG3571>`__,"``flush_emit`` should set ``badbit`` if the ``emit`` call fails","October 2021","",""
 `3572 <https://wg21.link/LWG3572>`__,"``copyable-box`` should be fully ``constexpr``","October 2021","","","|ranges|"
-`3573 <https://wg21.link/LWG3573>`__,"Missing Throws element for ``basic_string_view(It begin, End end)``","October 2021","",""
+`3573 <https://wg21.link/LWG3573>`__,"Missing Throws element for ``basic_string_view(It begin, End end)``","October 2021","|Complete|","14.0"
 `3574 <https://wg21.link/LWG3574>`__,"``common_iterator`` should be completely ``constexpr``-able","October 2021","","","|ranges|"
 `3580 <https://wg21.link/LWG3580>`__,"``iota_view``'s ``iterator``'s binary ``operator+`` should be improved","October 2021","","","|ranges|"
 `3581 <https://wg21.link/LWG3581>`__,"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
index e7a9e0a836db1..f53018c5c8e0a 100644
--- 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 <string_view>
 #include <cassert>
+#include <iterator>
 #include <ranges>
 
 #include "make_string.h"
@@ -43,6 +44,36 @@ constexpr bool test() {
   return true;
 }
 
+#ifndef TEST_HAS_NO_EXCEPTIONS
+template<class CharT>
+struct ThrowingSentinel {
+  friend bool operator==(const CharT*, ThrowingSentinel) noexcept { return true; }
+  friend std::iter_
diff erence_t<const CharT*> operator-(const CharT*, ThrowingSentinel) noexcept { return {}; }
+  friend std::iter_
diff erence_t<const CharT*> operator-(ThrowingSentinel, const CharT*) { throw 42; }
+};
+
+template <class CharT>
+void test_throwing() {
+  auto val = MAKE_STRING_VIEW(CharT, "test");
+  try {
+    (void)std::basic_string_view<CharT>(val.begin(), ThrowingSentinel<CharT>());
+    assert(false);
+  } catch (int i) {
+    assert(i == 42);
+  }
+}
+
+void test_throwing() {
+  test_throwing<char>();
+#ifndef TEST_HAS_NO_WIDE_CHARACTERS
+  test_throwing<wchar_t>();
+#endif
+  test_throwing<char8_t>();
+  test_throwing<char16_t>();
+  test_throwing<char32_t>();
+}
+#endif
+
 static_assert( std::is_constructible_v<std::string_view, const char*, char*>);
 static_assert( std::is_constructible_v<std::string_view, char*, const char*>);
 static_assert(!std::is_constructible_v<std::string_view, char*, void*>);               // not a sentinel
@@ -54,6 +85,10 @@ int main(int, char**) {
   test();
   static_assert(test());
 
+#ifndef TEST_HAS_NO_EXCEPTIONS
+  test_throwing();
+#endif
+
   return 0;
 }
 


        


More information about the libcxx-commits mailing list