[libcxx-commits] [libcxx] 907ed12 - [libc++] Change vector<bool>::const_iterator::reference to bool in ABIv2

Nikolas Klauser via libcxx-commits libcxx-commits at lists.llvm.org
Fri Apr 22 11:57:35 PDT 2022


Author: Nikolas Klauser
Date: 2022-04-22T20:57:30+02:00
New Revision: 907ed12d950f8e138620769420e5f84c0c7ece78

URL: https://github.com/llvm/llvm-project/commit/907ed12d950f8e138620769420e5f84c0c7ece78
DIFF: https://github.com/llvm/llvm-project/commit/907ed12d950f8e138620769420e5f84c0c7ece78.diff

LOG: [libc++] Change vector<bool>::const_iterator::reference to bool in ABIv2

`vector<bool>::const_reference` and `vector<bool>::const_iterator::reference` should be the same type.

Reviewed By: Mordante, #libc

Spies: libcxx-commits

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

Added: 
    

Modified: 
    libcxx/docs/ReleaseNotes.rst
    libcxx/include/__bit_reference
    libcxx/test/std/containers/sequences/vector.bool/iterators.pass.cpp
    libcxx/test/std/containers/sequences/vector.bool/types.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/docs/ReleaseNotes.rst b/libcxx/docs/ReleaseNotes.rst
index dc86c58844a41..ddb785b07ef40 100644
--- a/libcxx/docs/ReleaseNotes.rst
+++ b/libcxx/docs/ReleaseNotes.rst
@@ -86,6 +86,9 @@ API Changes
   supported anymore. Please migrate to using the new support for
   :ref:`assertions <assertions-mode>` instead.
 
+- ``vector<bool>::const_reference``, ``vector<bool>::const_iterator::reference``
+  and ``bitset::const_reference`` are now aliases for `bool` in the unstable ABI.
+
 ABI Changes
 -----------
 

diff  --git a/libcxx/include/__bit_reference b/libcxx/include/__bit_reference
index 53af4b3b48b72..b6a4699df907a 100644
--- a/libcxx/include/__bit_reference
+++ b/libcxx/include/__bit_reference
@@ -1109,7 +1109,11 @@ public:
     typedef typename _Cp::
diff erence_type                                                          
diff erence_type;
     typedef bool                                                                                  value_type;
     typedef __bit_iterator                                                                        pointer;
+#ifndef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL
     typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference;
+#else
+    using reference = typename conditional<_IsConst, bool, __bit_reference<_Cp>>::type;
+#endif
     typedef random_access_iterator_tag                                                            iterator_category;
 
 private:
@@ -1149,8 +1153,10 @@ public:
         return *this;
     }
 
-    _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT
-        {return reference(__seg_, __storage_type(1) << __ctz_);}
+    _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT {
+        return typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >
+                ::type(__seg_, __storage_type(1) << __ctz_);
+    }
 
     _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++()
     {

diff  --git a/libcxx/test/std/containers/sequences/vector.bool/iterators.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/iterators.pass.cpp
index 7714e53b2cd5f..1714c73742b62 100644
--- a/libcxx/test/std/containers/sequences/vector.bool/iterators.pass.cpp
+++ b/libcxx/test/std/containers/sequences/vector.bool/iterators.pass.cpp
@@ -24,6 +24,15 @@
 
 int main(int, char**)
 {
+    using IterRefT = std::iterator_traits<std::vector<bool>::iterator>::reference;
+    ASSERT_SAME_TYPE(IterRefT, std::vector<bool>::reference);
+
+    using ConstIterRefT = std::iterator_traits<std::vector<bool>::const_iterator>::reference;
+#if !defined(_LIBCPP_VERSION) || defined(_LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL)
+    ASSERT_SAME_TYPE(ConstIterRefT, bool);
+#else
+    ASSERT_SAME_TYPE(ConstIterRefT, std::__bit_const_reference<std::vector<bool> >);
+#endif
     {
         typedef bool T;
         typedef std::vector<T> C;

diff  --git a/libcxx/test/std/containers/sequences/vector.bool/types.pass.cpp b/libcxx/test/std/containers/sequences/vector.bool/types.pass.cpp
index 07053ee4b03cf..d75d715147352 100644
--- a/libcxx/test/std/containers/sequences/vector.bool/types.pass.cpp
+++ b/libcxx/test/std/containers/sequences/vector.bool/types.pass.cpp
@@ -24,6 +24,7 @@
 //     typedef typename allocator_type::const_pointer   const_pointer;
 //     typedef std::reverse_iterator<iterator>          reverse_iterator;
 //     typedef std::reverse_iterator<const_iterator>    const_reverse_iterator;
+//     typedef bool                                     const_reference;
 // };
 
 #include <vector>
@@ -66,6 +67,9 @@ test()
     static_assert((std::is_same<
         typename C::const_reverse_iterator,
         std::reverse_iterator<typename C::const_iterator> >::value), "");
+#if !defined(_LIBCPP_VERSION) || defined(_LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL)
+    static_assert(std::is_same<typename C::const_reference, bool>::value, "");
+#endif
 }
 
 int main(int, char**)


        


More information about the libcxx-commits mailing list