https://gcc.gnu.org/g:b25b101bc380004b82e25d2b1ef306856c75d864

commit r15-3124-gb25b101bc380004b82e25d2b1ef306856c75d864
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Wed Aug 21 21:19:46 2024 +0100

    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.

Diff:
---
 libstdc++-v3/include/bits/stl_bvector.h                    | 12 +++++++++---
 libstdc++-v3/include/std/bitset                            |  5 +----
 libstdc++-v3/testsuite/20_util/bitset/115098.cc            | 11 +++++++++++
 libstdc++-v3/testsuite/23_containers/vector/bool/115098.cc |  8 ++++++++
 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 c45b7ff3320d..42261ac5915f 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 e5d677ff059c..2e82a0e289d5 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 000000000000..52d6a0ec3781
--- /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 000000000000..3df8b8017950
--- /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"
+    );

Reply via email to