aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-08-21 21:19:46 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2024-08-23 13:18:19 +0100
commitb25b101bc380004b82e25d2b1ef306856c75d864 (patch)
tree67bd8259b5a03d109f17a6557fe5f687b323b38d
parentf9f599a44e3156a5f5679adc048ec6ff2f44cc0e (diff)
downloadgcc-b25b101bc380004b82e25d2b1ef306856c75d864.zip
gcc-b25b101bc380004b82e25d2b1ef306856c75d864.tar.gz
gcc-b25b101bc380004b82e25d2b1ef306856c75d864.tar.bz2
libstdc++: Make std::vector<bool>::reference constructor private [PR115098]
The standard says this constructor should be private. LWG 4141 proposes to remove it entirely. We still need it, but it doesn't need to be public. For std::bitset the default constructor is already private (and never even defined) but there's a non-standard constructor that's public, but doesn't need to be. libstdc++-v3/ChangeLog: PR libstdc++/115098 * include/bits/stl_bvector.h (_Bit_reference): Make default constructor private. Declare vector and bit iterators as friends. * include/std/bitset (bitset::reference): Make constructor and data members private. * testsuite/20_util/bitset/115098.cc: New test. * testsuite/23_containers/vector/bool/115098.cc: New test.
-rw-r--r--libstdc++-v3/include/bits/stl_bvector.h12
-rw-r--r--libstdc++-v3/include/std/bitset5
-rw-r--r--libstdc++-v3/testsuite/20_util/bitset/115098.cc11
-rw-r--r--libstdc++-v3/testsuite/23_containers/vector/bool/115098.cc8
4 files changed, 29 insertions, 7 deletions
diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index c45b7ff..42261ac 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -81,6 +81,14 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
struct _Bit_reference
{
+ private:
+ template<typename, typename> friend class vector;
+ friend struct _Bit_iterator;
+ friend struct _Bit_const_iterator;
+
+ _GLIBCXX20_CONSTEXPR
+ _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }
+
_Bit_type * _M_p;
_Bit_type _M_mask;
@@ -88,9 +96,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_Bit_reference(_Bit_type * __x, _Bit_type __y)
: _M_p(__x), _M_mask(__y) { }
- _GLIBCXX20_CONSTEXPR
- _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }
-
+ public:
#if __cplusplus >= 201103L
_Bit_reference(const _Bit_reference&) = default;
#endif
diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset
index e5d677f..2e82a0e 100644
--- a/libstdc++-v3/include/std/bitset
+++ b/libstdc++-v3/include/std/bitset
@@ -870,10 +870,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_WordT* _M_wp;
size_t _M_bpos;
- // left undefined
- reference();
-
- public:
_GLIBCXX23_CONSTEXPR
reference(bitset& __b, size_t __pos) _GLIBCXX_NOEXCEPT
{
@@ -881,6 +877,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
_M_bpos = _Base::_S_whichbit(__pos);
}
+ public:
#if __cplusplus >= 201103L
reference(const reference&) = default;
#endif
diff --git a/libstdc++-v3/testsuite/20_util/bitset/115098.cc b/libstdc++-v3/testsuite/20_util/bitset/115098.cc
new file mode 100644
index 0000000..52d6a0e
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/bitset/115098.cc
@@ -0,0 +1,11 @@
+// { dg-do compile { target c++11 } }
+
+#include <bitset>
+
+using namespace std;
+
+static_assert( ! is_default_constructible<bitset<10>::reference>::value,
+ "std::bitset<N>::reference is not default constructible");
+
+static_assert( ! is_constructible<bitset<10>::reference, bitset<10>&, size_t>::value,
+ "std::bitset<N>::reference is not default constructible");
diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/115098.cc b/libstdc++-v3/testsuite/23_containers/vector/bool/115098.cc
new file mode 100644
index 0000000..3df8b80
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/bool/115098.cc
@@ -0,0 +1,8 @@
+// { dg-do compile { target c++11 } }
+
+#include <vector>
+
+static_assert(
+ !std::is_default_constructible<std::vector<bool>::reference>::value,
+ "std::vector<bool>::reference is not default constructible"
+ );