]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Make std::vector<bool>::reference constructor private [PR115098]
authorJonathan Wakely <jwakely@redhat.com>
Wed, 21 Aug 2024 20:19:46 +0000 (21:19 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Fri, 23 Aug 2024 12:18:19 +0000 (13:18 +0100)
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.

libstdc++-v3/include/bits/stl_bvector.h
libstdc++-v3/include/std/bitset
libstdc++-v3/testsuite/20_util/bitset/115098.cc [new file with mode: 0644]
libstdc++-v3/testsuite/23_containers/vector/bool/115098.cc [new file with mode: 0644]

index c45b7ff3320d48ad9519d91fd1e466fdfb812232..42261ac5915f22146789321c761606f287f515cc 100644 (file)
@@ -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
index e5d677ff059c5d4e50225da0aa7167ad360e6f15..2e82a0e289d51739f449116e94e351564aabd930 100644 (file)
@@ -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 (file)
index 0000000..52d6a0e
--- /dev/null
@@ -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 (file)
index 0000000..3df8b80
--- /dev/null
@@ -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"
+    );