`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
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
-----------
typedef typename _Cp::difference_type difference_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:
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++()
{
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;
// 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>
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**)