Tested x86_64-linux. Pushed to trunk.

-- >8 --

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              | 12 +++++++++---
 libstdc++-v3/include/std/bitset                      |  5 +----
 libstdc++-v3/testsuite/20_util/bitset/115098.cc      | 11 +++++++++++
 .../testsuite/23_containers/vector/bool/115098.cc    |  8 ++++++++
 4 files changed, 29 insertions(+), 7 deletions(-)
 create mode 100644 libstdc++-v3/testsuite/20_util/bitset/115098.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/vector/bool/115098.cc

diff --git a/libstdc++-v3/include/bits/stl_bvector.h 
b/libstdc++-v3/include/bits/stl_bvector.h
index c45b7ff3320..42261ac5915 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 e5d677ff059..2e82a0e289d 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 00000000000..52d6a0ec378
--- /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 00000000000..3df8b801795
--- /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"
+    );
-- 
2.46.0

Reply via email to