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