Perform __glibcxx_assert check on indices to bitset<>::op[] for
const and non-const overloads.

libstdc++-v3/ChangeLog
        PR libstdc++/118341
        * include/std/bitset (operator[] (2x)): Add assertion.
        * testsuite/20_util/bitset/118341_asrt_ix.cc: New smoke test.
        * testsuite/20_util/bitset/118341_asrt_ix_neg1.cc: New negative test.
        * testsuite/20_util/bitset/118341_asrt_ix_neg2.cc: New negative test.
---
 libstdc++-v3/include/std/bitset                  | 10 ++++++++--
 .../testsuite/20_util/bitset/118341_asrt_ix.cc   | 16 ++++++++++++++++
 .../20_util/bitset/118341_asrt_ix_neg1.cc        | 13 +++++++++++++
 .../20_util/bitset/118341_asrt_ix_neg2.cc        | 13 +++++++++++++
 4 files changed, 50 insertions(+), 2 deletions(-)
 create mode 100644 libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix.cc
 create mode 100644 libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix_neg1.cc
 create mode 100644 libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix_neg2.cc

diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset
index 331d0894342..eb200ab9246 100644
--- a/libstdc++-v3/include/std/bitset
+++ b/libstdc++-v3/include/std/bitset
@@ -1290,11 +1290,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
       _GLIBCXX23_CONSTEXPR
       reference
       operator[](size_t __position)
-      { return reference(*this, __position); }
+      {
+       __glibcxx_assert(__position < _Nb);
+       return reference(*this, __position);
+      }
 
       _GLIBCXX_CONSTEXPR bool
       operator[](size_t __position) const
-      { return _Unchecked_test(__position); }
+      {
+       __glibcxx_assert(__position < _Nb);
+       return _Unchecked_test(__position);
+      }
       ///@}
 
       /**
diff --git a/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix.cc 
b/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix.cc
new file mode 100644
index 00000000000..bc5c7ece6df
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix.cc
@@ -0,0 +1,16 @@
+// { dg-do run { target c++26 } }
+// { dg-options "-D_GLIBCXX_ASSERTIONS" }
+
+#include <bitset>
+#include <testsuite_hooks.h>
+
+int main()
+{
+  std::bitset<13> bs{"1010101010101"};
+  for (int i = 0; i < 13; ++i)
+    VERIFY(bs[i] != (i & 1)); // op[], range check
+
+  const std::bitset<13> cbs{"1010101010101"};
+  for (int i = 0; i < 13; ++i)
+    VERIFY(cbs[i] != (i & 1));  // op[] const, range check
+}
diff --git a/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix_neg1.cc 
b/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix_neg1.cc
new file mode 100644
index 00000000000..f22beab6afc
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix_neg1.cc
@@ -0,0 +1,13 @@
+// { dg-do run { target c++26 xfail *-*-* } }
+// { dg-options "-D_GLIBCXX_ASSERTIONS" }
+
+#include <bitset>
+#include <testsuite_hooks.h>
+
+int main()
+{
+  std::bitset<13> bs{"1010101010101"};
+  for (int i = 0; i < 13; ++i)
+    VERIFY(bs[i] != (i & 1));
+  bs[13];  // aborts, 13 > 12, non-const
+}
diff --git a/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix_neg2.cc 
b/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix_neg2.cc
new file mode 100644
index 00000000000..273fbb7f592
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/bitset/118341_asrt_ix_neg2.cc
@@ -0,0 +1,13 @@
+// { dg-do run { target c++26 xfail *-*-* } }
+// { dg-options "-D_GLIBCXX_ASSERTIONS" }
+
+#include <bitset>
+#include <testsuite_hooks.h>
+
+int main()
+{
+  const std::bitset<13> bs{"1010101010101"};
+  for (int i = 0; i < 13; ++i)
+    VERIFY(bs[i] != (i & 1));
+  bs[13];  // aborts, 13 > 12, const
+}
-- 
2.52.0

Reply via email to