From: Jonathan Wakely <jwakely@redhat.com>
To: "François Dumont" <frs.dumont@gmail.com>
Cc: "libstdc++" <libstdc++@gcc.gnu.org>,
gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATH][_GLIBCXX_DEBUG] Fix unordered container merge
Date: Thu, 11 Nov 2021 20:41:48 +0000 [thread overview]
Message-ID: <CACb0b4kRFecQM1Sd20zXWf8vGkG3y6f3SFtDDbXSM+zeS+OQCQ@mail.gmail.com> (raw)
In-Reply-To: <CACb0b4k9bdZbJn49xhBHx-euFk2ZrisPMT-SJ=fTCSc5MgFWDw@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 1725 bytes --]
On Wed, 10 Nov 2021 at 11:55, Jonathan Wakely <jwakely@redhat.com> wrote:
>
>
> On Tue, 9 Nov 2021 at 16:25, Jonathan Wakely <jwakely@redhat.com> wrote:
>
>>
>>
>> On Mon, 8 Nov 2021 at 21:36, François Dumont <frs.dumont@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.
[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 7062 bytes --]
commit 7075abd518364b8d9767079e044baba86145cc08
Author: Jonathan Wakely <jwakely@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;
next prev parent reply other threads:[~2021-11-11 20:42 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-13 17:10 François Dumont
2021-10-14 8:23 ` Jonathan Wakely
2021-10-16 13:47 ` François Dumont
2021-10-16 14:52 ` Jonathan Wakely
2021-10-21 16:51 ` François Dumont
2021-10-21 16:55 ` Jonathan Wakely
2021-10-22 5:22 ` François Dumont
2021-10-25 18:08 ` François Dumont
2021-11-06 13:51 ` François Dumont
2021-11-08 21:36 ` François Dumont
2021-11-09 16:25 ` Jonathan Wakely
2021-11-10 5:47 ` François Dumont
2021-11-10 9:38 ` Jonathan Wakely
2021-11-15 18:16 ` François Dumont
2021-11-10 11:55 ` Jonathan Wakely
2021-11-11 20:41 ` Jonathan Wakely [this message]
2021-11-11 21:33 ` François Dumont
2021-11-11 22:01 ` Jonathan Wakely
2021-11-10 0:05 ` H.J. Lu
2021-11-10 5:44 ` François Dumont
2021-11-10 7:26 ` Jonathan Wakely
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CACb0b4kRFecQM1Sd20zXWf8vGkG3y6f3SFtDDbXSM+zeS+OQCQ@mail.gmail.com \
--to=jwakely@redhat.com \
--cc=frs.dumont@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=libstdc++@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).