libstdc++: Fix debug containers for C++98 mode

Since r12-5072 made _Safe_container::operator=(const _Safe_container&)
protected, the debug containers no longer compile in C++98 mode. They
have user-provided copy assignment operators in C++98 mode, and they
assign each base class in turn. The 'this->_M_safe() = __x' expressions
fail, because calling a protected member function is only allowed via
'this'. They could be fixed by using this->_Safe::operator=(__x) but a
simpler solution is to just remove the user-provided assignment
operators and let the compiler define them (as we do for C++11 and
later, by defining them as defaulted).

The only change needed for that to work is to define the _Safe_vector
copy assignment operator in C++98 mode, so that the implicit
__gnu_debug::vector::operator= definition will call it, instead of
needing to call _M_update_guaranteed_capacity() manually.

libstdc++-v3/ChangeLog:

	* include/debug/deque (deque::operator=(const deque&)): Remove
	definition.
	* include/debug/list (list::operator=(const list&)): Likewise.
	* include/debug/map.h (map::operator=(const map&)): Likewise.
	* include/debug/multimap.h (multimap::operator=(const multimap&)):
	Likewise.
	* include/debug/multiset.h (multiset::operator=(const multiset&)):
	Likewise.
	* include/debug/set.h (set::operator=(const set&)): Likewise.
	* include/debug/string (basic_string::operator=(const basic_string&)):
	Likewise.
	* include/debug/vector (vector::operator=(const vector&)):
	Likewise.
	(_Safe_vector::operator=(const _Safe_vector&)): Define for
	C++98 as well.
This commit is contained in:
Jonathan Wakely 2021-11-11 20:23:48 +00:00
parent 53b3edceab
commit 4a407d358e
8 changed files with 14 additions and 79 deletions

View File

@ -156,15 +156,7 @@ namespace __debug
deque(_Base_ref __x)
: _Base(__x._M_ref) { }
#if __cplusplus < 201103L
deque&
operator=(const deque& __x)
{
this->_M_safe() = __x;
_M_base() = __x;
return *this;
}
#else
#if __cplusplus >= 201103L
deque&
operator=(const deque&) = default;

View File

@ -161,15 +161,7 @@ namespace __debug
list(_Base_ref __x)
: _Base(__x._M_ref) { }
#if __cplusplus < 201103L
list&
operator=(const list& __x)
{
this->_M_safe() = __x;
_M_base() = __x;
return *this;
}
#else
#if __cplusplus >= 201103L
list&
operator=(const list&) = default;

View File

@ -152,15 +152,7 @@ namespace __debug
__gnu_debug::__base(__last),
__comp, __a) { }
#if __cplusplus < 201103L
map&
operator=(const map& __x)
{
this->_M_safe() = __x;
_M_base() = __x;
return *this;
}
#else
#if __cplusplus >= 201103L
map&
operator=(const map&) = default;

View File

@ -152,15 +152,7 @@ namespace __debug
multimap(_Base_ref __x)
: _Base(__x._M_ref) { }
#if __cplusplus < 201103L
multimap&
operator=(const multimap& __x)
{
this->_M_safe() = __x;
_M_base() = __x;
return *this;
}
#else
#if __cplusplus >= 201103L
multimap&
operator=(const multimap&) = default;

View File

@ -152,15 +152,7 @@ namespace __debug
multiset(_Base_ref __x)
: _Base(__x._M_ref) { }
#if __cplusplus < 201103L
multiset&
operator=(const multiset& __x)
{
this->_M_safe() = __x;
_M_base() = __x;
return *this;
}
#else
#if __cplusplus >= 201103L
multiset&
operator=(const multiset&) = default;

View File

@ -150,15 +150,7 @@ namespace __debug
set(_Base_ref __x)
: _Base(__x._M_ref) { }
#if __cplusplus < 201103L
set&
operator=(const set& __x)
{
this->_M_safe() = __x;
_M_base() = __x;
return *this;
}
#else
#if __cplusplus >= 201103L
set&
operator=(const set&) = default;

View File

@ -201,15 +201,7 @@ namespace __gnu_debug
__glibcxx_check_valid_constructor_range(__begin, __end)),
__gnu_debug::__base(__end), __a) { }
#if __cplusplus < 201103L
basic_string&
operator=(const basic_string& __str)
{
this->_M_safe() = __str;
_M_base() = __str;
return *this;
}
#else
#if __cplusplus >= 201103L
basic_string&
operator=(const basic_string&) = default;

View File

@ -71,18 +71,18 @@ namespace __gnu_debug
: _M_guaranteed_capacity(__n)
{ }
#if __cplusplus >= 201103L
_Safe_vector(_Safe_vector&& __x) noexcept
: _Safe_vector()
{ __x._M_guaranteed_capacity = 0; }
_Safe_vector&
operator=(const _Safe_vector&) noexcept
operator=(const _Safe_vector&) _GLIBCXX_NOEXCEPT
{
_M_update_guaranteed_capacity();
return *this;
}
#if __cplusplus >= 201103L
_Safe_vector(_Safe_vector&& __x) noexcept
: _Safe_vector()
{ __x._M_guaranteed_capacity = 0; }
_Safe_vector&
operator=(_Safe_vector&& __x) noexcept
{
@ -234,16 +234,7 @@ namespace __debug
vector(_Base_ref __x)
: _Base(__x._M_ref) { }
#if __cplusplus < 201103L
vector&
operator=(const vector& __x)
{
this->_M_safe() = __x;
_M_base() = __x;
this->_M_update_guaranteed_capacity();
return *this;
}
#else
#if __cplusplus >= 201103L
vector&
operator=(const vector&) = default;