On Wed, 10 Nov 2021 at 11:55, Jonathan Wakely <jwak...@redhat.com> wrote:
> > > On Tue, 9 Nov 2021 at 16:25, Jonathan Wakely <jwak...@redhat.com> wrote: > >> >> >> On Mon, 8 Nov 2021 at 21:36, François Dumont <frs.dum...@gmail.com> >> wrote: >> >>> Yet another version this time with only 1 guard implementation. The >>> predicate to invalidate the safe iterators has been externalized. >>> >>> Ok to commit ? >>> >> >> I like this version a lot - thanks for persisting with it. >> >> > > I'm seeing new failures with this: > > make check RUNTESTFLAGS="conformance.exp=23_containers/*/invalidation/* > --target_board=unix/-D_GLIBCXX_DEBUG/-std=gnu++98" > > FAIL: 23_containers/deque/debug/invalidation/1.cc (test for excess errors) > FAIL: 23_containers/list/debug/invalidation/1.cc (test for excess errors) > FAIL: 23_containers/map/debug/invalidation/1.cc (test for excess errors) > FAIL: 23_containers/multimap/debug/invalidation/1.cc (test for excess > errors) > FAIL: 23_containers/multiset/debug/invalidation/1.cc (test for excess > errors) > FAIL: 23_containers/set/debug/invalidation/1.cc (test for excess errors) > FAIL: 23_containers/vector/debug/invalidation/1.cc (test for excess errors) > It's caused by: --- a/libstdc++-v3/include/debug/safe_container.h +++ b/libstdc++-v3/include/debug/safe_container.h @@ -78,7 +78,6 @@ namespace __gnu_debug { } #endif - public: // Copy assignment invalidate all iterators. _Safe_container& operator=(const _Safe_container&) _GLIBCXX_NOEXCEPT For C++98 mode that gets called explicitly by the user-provided copy assignment operators in the derived class. I'm testing the attached fix.
commit 7075abd518364b8d9767079e044baba86145cc08 Author: Jonathan Wakely <jwak...@redhat.com> Date: Thu Nov 11 20:23:48 2021 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 alowed 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 defined them (as in C++11 and later). 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 calling _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. diff --git a/libstdc++-v3/include/debug/deque b/libstdc++-v3/include/debug/deque index 8e4811149d2..52778ba1617 100644 --- a/libstdc++-v3/include/debug/deque +++ b/libstdc++-v3/include/debug/deque @@ -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; diff --git a/libstdc++-v3/include/debug/list b/libstdc++-v3/include/debug/list index de30edb19c2..f40ebc8521e 100644 --- a/libstdc++-v3/include/debug/list +++ b/libstdc++-v3/include/debug/list @@ -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; diff --git a/libstdc++-v3/include/debug/map.h b/libstdc++-v3/include/debug/map.h index 9e142cf7023..3883c546871 100644 --- a/libstdc++-v3/include/debug/map.h +++ b/libstdc++-v3/include/debug/map.h @@ -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; diff --git a/libstdc++-v3/include/debug/multimap.h b/libstdc++-v3/include/debug/multimap.h index a05b8a8493e..073c1c39240 100644 --- a/libstdc++-v3/include/debug/multimap.h +++ b/libstdc++-v3/include/debug/multimap.h @@ -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; diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h index a312ccf6f50..479411d9d06 100644 --- a/libstdc++-v3/include/debug/multiset.h +++ b/libstdc++-v3/include/debug/multiset.h @@ -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; diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index 01da942eb78..e35e5c1faae 100644 --- a/libstdc++-v3/include/debug/set.h +++ b/libstdc++-v3/include/debug/set.h @@ -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; diff --git a/libstdc++-v3/include/debug/string b/libstdc++-v3/include/debug/string index a8389528001..2209f88fd54 100644 --- a/libstdc++-v3/include/debug/string +++ b/libstdc++-v3/include/debug/string @@ -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; diff --git a/libstdc++-v3/include/debug/vector b/libstdc++-v3/include/debug/vector index 03fd9405cc9..b532a168e0e 100644 --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -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;