[libcxx-commits] [PATCH] D122092: [libc++] `bitset::operator[] const` should return bool

Nikolas Klauser via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Sun Mar 20 06:44:52 PDT 2022


philnik updated this revision to Diff 416779.
philnik marked 3 inline comments as done.
philnik added a comment.

- Address comments


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D122092/new/

https://reviews.llvm.org/D122092

Files:
  libcxx/include/__config
  libcxx/include/bitset
  libcxx/test/std/utilities/template.bitset/bitset.members/index.pass.cpp
  libcxx/test/std/utilities/template.bitset/bitset.members/index_const.pass.cpp


Index: libcxx/test/std/utilities/template.bitset/bitset.members/index_const.pass.cpp
===================================================================
--- libcxx/test/std/utilities/template.bitset/bitset.members/index_const.pass.cpp
+++ libcxx/test/std/utilities/template.bitset/bitset.members/index_const.pass.cpp
@@ -12,10 +12,12 @@
 #include <cassert>
 #include <cstddef>
 #include <vector>
+#include <type_traits>
 
 #include "../bitset_test_cases.h"
 #include "test_macros.h"
 
+
 template <std::size_t N>
 void test_index_const() {
     std::vector<std::bitset<N> > const cases = get_test_cases<N>();
@@ -25,6 +27,13 @@
             assert(v[N/2] == v.test(N/2));
         }
     }
+#if defined(_LIBCPP_VERSION)
+#if _LIBCPP_ABI_VERSION >= 2
+    ASSERT_SAME_TYPE(decltype(cases[0][0]), bool);
+#else
+    ASSERT_SAME_TYPE(decltype(cases[0][0]), typename std::bitset<N>::const_reference);
+#endif
+#endif
 }
 
 int main(int, char**) {
Index: libcxx/test/std/utilities/template.bitset/bitset.members/index.pass.cpp
===================================================================
--- libcxx/test/std/utilities/template.bitset/bitset.members/index.pass.cpp
+++ libcxx/test/std/utilities/template.bitset/bitset.members/index.pass.cpp
@@ -42,6 +42,7 @@
             assert(r == false);
             assert(v1.test(N/2) == false);
         }
+        ASSERT_SAME_TYPE(decltype(v1[0]), typename std::bitset<N>::reference);
     }
 }
 
Index: libcxx/include/bitset
===================================================================
--- libcxx/include/bitset
+++ libcxx/include/bitset
@@ -714,9 +714,12 @@
     bitset& flip(size_t __pos);
 
     // element access:
-    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
-                              const_reference operator[](size_t __p) const {return base::__make_ref(__p);}
-    _LIBCPP_INLINE_VISIBILITY       reference operator[](size_t __p)       {return base::__make_ref(__p);}
+#ifdef _LIBCPP_ABI_BITSET_SUBSCRIPT_RETURN_BOOL
+    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR            bool operator[](size_t __p) const {return base::__make_ref(__p);}
+#else
+    _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR const_reference operator[](size_t __p) const {return base::__make_ref(__p);}
+#endif
+    _LIBCPP_HIDE_FROM_ABI                         reference operator[](size_t __p)       {return base::__make_ref(__p);}
     _LIBCPP_INLINE_VISIBILITY
     unsigned long to_ulong() const;
     _LIBCPP_INLINE_VISIBILITY
Index: libcxx/include/__config
===================================================================
--- libcxx/include/__config
+++ libcxx/include/__config
@@ -114,6 +114,8 @@
 #  define _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON
 // Remove vector base class
 #  define _LIBCPP_ABI_DO_NOT_EXPORT_VECTOR_BASE_COMMON
+// According to the standard `bitset::operator[] const` returns bool
+#  define _LIBCPP_ABI_BITSET_SUBSCRIPT_RETURN_BOOL
 #elif _LIBCPP_ABI_VERSION == 1
 #  if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
 // Enable compiling copies of now inline methods into the dylib to support


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D122092.416779.patch
Type: text/x-patch
Size: 3054 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20220320/1309c574/attachment-0001.bin>


More information about the libcxx-commits mailing list