[libcxx-commits] [libcxx] 8be1197 - [libc++] Implement P2499R0 (`string_view` range constructor should be `explicit`)

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Tue Aug 2 03:48:49 PDT 2022


Author: Igor Zhukov
Date: 2022-08-02T12:47:45+02:00
New Revision: 8be1197285bdff6e03bf26b77052daa710f73068

URL: https://github.com/llvm/llvm-project/commit/8be1197285bdff6e03bf26b77052daa710f73068
DIFF: https://github.com/llvm/llvm-project/commit/8be1197285bdff6e03bf26b77052daa710f73068.diff

LOG: [libc++] Implement P2499R0 (`string_view` range constructor should be `explicit`)

Reviewed By: #libc, philnik, Mordante

Spies: Mordante, jloser, philnik, libcxx-commits

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

Added: 
    

Modified: 
    libcxx/docs/ReleaseNotes.rst
    libcxx/docs/Status/Cxx2bPapers.csv
    libcxx/include/string_view
    libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp
    libcxx/test/std/strings/string.view/string.view.deduct/range.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/docs/ReleaseNotes.rst b/libcxx/docs/ReleaseNotes.rst
index f5ebc4e8e6430..e8f1f9d0068d4 100644
--- a/libcxx/docs/ReleaseNotes.rst
+++ b/libcxx/docs/ReleaseNotes.rst
@@ -37,6 +37,7 @@ What's New in Libc++ 16.0.0?
 
 Implemented Papers
 ------------------
+- P2499R0 - ``string_view`` range constructor should be ``explicit``
 
 Improvements and New Features
 -----------------------------

diff  --git a/libcxx/docs/Status/Cxx2bPapers.csv b/libcxx/docs/Status/Cxx2bPapers.csv
index 4c5dd10db0684..c3a63311d03d5 100644
--- a/libcxx/docs/Status/Cxx2bPapers.csv
+++ b/libcxx/docs/Status/Cxx2bPapers.csv
@@ -79,7 +79,7 @@
 "`P2467R1 <https://wg21.link/P2467R1>`__","LWG","Support exclusive mode for ``fstreams``","July 2022","",""
 "`P2474R2 <https://wg21.link/P2474R2>`__","LWG","``views::repeat``","July 2022","",""
 "`P2494R2 <https://wg21.link/P2494R2>`__","LWG","Relaxing range adaptors to allow for move only types","July 2022","",""
-"`P2499R0 <https://wg21.link/P2499R0>`__","LWG","``string_view`` range constructor should be ``explicit``","July 2022","",""
+"`P2499R0 <https://wg21.link/P2499R0>`__","LWG","``string_view`` range constructor should be ``explicit``","July 2022","|Complete|","16.0"
 "`P2502R2 <https://wg21.link/P2502R2>`__","LWG","``std::generator``: Synchronous Coroutine Generator for Ranges","July 2022","",""
 "`P2508R1 <https://wg21.link/P2508R1>`__","LWG","Exposing ``std::basic-format-string``","July 2022","",""
 "`P2513R4 <https://wg21.link/P2513R4>`__","LWG","``char8_t`` Compatibility and Portability Fixes","July 2022","",""

diff  --git a/libcxx/include/string_view b/libcxx/include/string_view
index a84ed50196147..a9aa304148e0e 100644
--- a/libcxx/include/string_view
+++ b/libcxx/include/string_view
@@ -331,7 +331,7 @@ public:
          typename remove_reference_t<_Range>::traits_type;
         } || is_same_v<typename remove_reference_t<_Range>::traits_type, _Traits>)
       )
-    constexpr _LIBCPP_HIDE_FROM_ABI
+    constexpr explicit _LIBCPP_HIDE_FROM_ABI
     basic_string_view(_Range&& __r) : __data(ranges::data(__r)), __size(ranges::size(__r)) {}
 #endif // _LIBCPP_STD_VER > 20 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)
 

diff  --git a/libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp b/libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp
index 83e96a41e0e34..a5533ea548459 100644
--- a/libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp
+++ b/libcxx/test/std/strings/string.view/string.view.cons/from_range.pass.cpp
@@ -98,13 +98,13 @@ constexpr bool test() {
   // Test that we're not trying to use the type's conversion operator to string_view in the constructor.
   {
     const DeletedConversionOperator d;
-    std::basic_string_view<char> csv = d;
+    std::basic_string_view<char> csv = std::basic_string_view<char>(d);
     assert(csv == "test");
   }
 
   {
     DeletedConstConversionOperator dc;
-    std::basic_string_view<char> sv = dc;
+    std::basic_string_view<char> sv = std::basic_string_view<char>(dc);
     assert(sv == "test");
   }
 
@@ -186,6 +186,8 @@ void test_throwing() {
 }
 #endif
 
+static_assert(!std::is_convertible_v<std::vector<char>, std::string_view>);
+
 int main(int, char**) {
   test();
   static_assert(test());

diff  --git a/libcxx/test/std/strings/string.view/string.view.deduct/range.pass.cpp b/libcxx/test/std/strings/string.view/string.view.deduct/range.pass.cpp
index 7efe9ef09db8e..38336db6f0687 100644
--- a/libcxx/test/std/strings/string.view/string.view.deduct/range.pass.cpp
+++ b/libcxx/test/std/strings/string.view/string.view.deduct/range.pass.cpp
@@ -44,7 +44,7 @@ void test() {
     contiguous_iterator<const char16_t*> begin() const { return contiguous_iterator<const char16_t*>(data_); }
     contiguous_iterator<const char16_t*> end() const { return contiguous_iterator<const char16_t*>(data_ + 3); }
   };
-  std::basic_string_view bsv = Widget();
+  std::basic_string_view bsv = std::basic_string_view(Widget());
   ASSERT_SAME_TYPE(decltype(bsv), std::basic_string_view<char16_t>);
 }
 


        


More information about the libcxx-commits mailing list