mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-19 00:55:13 +08:00
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:
parent
53b3edceab
commit
4a407d358e
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user