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