]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Fix debug containers for C++98 mode
authorJonathan Wakely <jwakely@redhat.com>
Thu, 11 Nov 2021 20:23:48 +0000 (20:23 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 11 Nov 2021 21:55:11 +0000 (21:55 +0000)
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.

libstdc++-v3/include/debug/deque
libstdc++-v3/include/debug/list
libstdc++-v3/include/debug/map.h
libstdc++-v3/include/debug/multimap.h
libstdc++-v3/include/debug/multiset.h
libstdc++-v3/include/debug/set.h
libstdc++-v3/include/debug/string
libstdc++-v3/include/debug/vector

index 8e4811149d2d36082c20cf88ffe251d91fca059b..52778ba16174342e42f91e97e6ebaf695549def0 100644 (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;
 
index de30edb19c2406cdaec152403c74a76544c7db53..f40ebc8521e7bb0836b1b73f0b9fe414e069631e 100644 (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;
 
index 9e142cf70239a0c9fee379ce7213958e3f72dbcd..3883c54687170f416c6ea87db3de3bfeea4f125f 100644 (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;
 
index a05b8a8493e67e2912a5777efd833154c6d7a06a..073c1c392409406fd1a3274dbe464ca4f4f4ee87 100644 (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;
 
index a312ccf6f5066732706dc6141765d8254122ff06..479411d9d063d987622528dac9298e0f06dcb5e1 100644 (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;
 
index 01da942eb78056d8476132bf22c774669e0f11e4..e35e5c1faae2adfc52c0860550021e62d924e728 100644 (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;
 
index a8389528001c498d04f82b0b238cb84ebaccc24a..2209f88fd54873d2c534ef498dba8694a5c30f4d 100644 (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;
 
index 03fd9405cc91ddee77788fb2bf9e7dc4225f96df..b532a168e0ef33f1245d2b7434f33eb7cf3af9a2 100644 (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;