diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-10-07 20:33:45 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-10-08 12:20:25 +0100 |
commit | 82e3a826871effc7093852a9181f641c693ae94f (patch) | |
tree | 59fad51566da7e89bf11f80a2622546f5b5de2eb | |
parent | fcc13d6fc31441b5672b68a5e3b247687724218f (diff) | |
download | gcc-82e3a826871effc7093852a9181f641c693ae94f.zip gcc-82e3a826871effc7093852a9181f641c693ae94f.tar.gz gcc-82e3a826871effc7093852a9181f641c693ae94f.tar.bz2 |
libstdc++: Restore debug checks in uniform container erasure functions
This partially reverts commit 561078480ffb5adb68577276c6b23e4ee7b39272.
If we avoid all debug mode checks when erasing elements then we fail to
invalidate safe iterators to the removed elements. This reverts the
recent changes in r12-4083 and r12-4233, restoring the debug checking.
libstdc++-v3/ChangeLog:
* include/experimental/deque (erase, erase_if): Revert changes
to avoid debug mode overhead.
* include/experimental/map (erase, erase_if): Likewise.
* include/experimental/set (erase, erase_if): Likewise.
* include/experimental/unordered_map (erase, erase_if):
Likewise.
* include/experimental/unordered_set (erase, erase_if):
Likewise.
* include/experimental/vector (erase, erase_if): Likewise.
* include/std/deque (erase, erase_if): Likewise.
* include/std/map (erase, erase_if): Likewise.
* include/std/set (erase, erase_if): Likewise.
* include/std/unordered_map (erase, erase_if): Likewise.
* include/std/unordered_set (erase, erase_if): Likewise.
* include/std/vector (erase, erase_if): Likewise.
-rw-r--r-- | libstdc++-v3/include/experimental/deque | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/map | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/set | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/unordered_map | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/unordered_set | 11 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/vector | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/std/deque | 22 | ||||
-rw-r--r-- | libstdc++-v3/include/std/map | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/std/set | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/std/unordered_map | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/std/unordered_set | 11 | ||||
-rw-r--r-- | libstdc++-v3/include/std/vector | 24 |
12 files changed, 45 insertions, 103 deletions
diff --git a/libstdc++-v3/include/experimental/deque b/libstdc++-v3/include/experimental/deque index 710833e..a76fb65 100644 --- a/libstdc++-v3/include/experimental/deque +++ b/libstdc++-v3/include/experimental/deque @@ -50,16 +50,16 @@ inline namespace fundamentals_v2 inline void erase_if(deque<_Tp, _Alloc>& __cont, _Predicate __pred) { - _GLIBCXX_STD_C::deque<_Tp, _Alloc>& __c = __cont; - __c.erase(std::remove_if(__c.begin(), __c.end(), __pred), __c.end()); + __cont.erase(std::remove_if(__cont.begin(), __cont.end(), __pred), + __cont.end()); } template<typename _Tp, typename _Alloc, typename _Up> inline void erase(deque<_Tp, _Alloc>& __cont, const _Up& __value) { - _GLIBCXX_STD_C::deque<_Tp, _Alloc>& __c = __cont; - __c.erase(std::remove(__c.begin(), __c.end(), __value), __c.end()); + __cont.erase(std::remove(__cont.begin(), __cont.end(), __value), + __cont.end()); } namespace pmr { diff --git a/libstdc++-v3/include/experimental/map b/libstdc++-v3/include/experimental/map index ef69fad..0c0f422 100644 --- a/libstdc++-v3/include/experimental/map +++ b/libstdc++-v3/include/experimental/map @@ -50,19 +50,13 @@ inline namespace fundamentals_v2 typename _Predicate> inline void erase_if(map<_Key, _Tp, _Compare, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Alloc>& __c = __cont; - std::__detail::__erase_nodes_if(__c, __pred); - } + { std::__detail::__erase_nodes_if(__cont, __pred); } template<typename _Key, typename _Tp, typename _Compare, typename _Alloc, typename _Predicate> inline void erase_if(multimap<_Key, _Tp, _Compare, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::multimap<_Key, _Tp, _Compare, _Alloc>& __c = __cont; - std::__detail::__erase_nodes_if(__c, __pred); - } + { std::__detail::__erase_nodes_if(__cont, __pred); } namespace pmr { template<typename _Key, typename _Tp, typename _Compare = less<_Key>> diff --git a/libstdc++-v3/include/experimental/set b/libstdc++-v3/include/experimental/set index 7a5986a..c3f5433 100644 --- a/libstdc++-v3/include/experimental/set +++ b/libstdc++-v3/include/experimental/set @@ -50,19 +50,13 @@ inline namespace fundamentals_v2 typename _Predicate> inline void erase_if(set<_Key, _Compare, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::set<_Key, _Compare, _Alloc>& __c = __cont; - std::__detail::__erase_nodes_if(__c, __pred); - } + { std::__detail::__erase_nodes_if(__cont, __pred); } template<typename _Key, typename _Compare, typename _Alloc, typename _Predicate> inline void erase_if(multiset<_Key, _Compare, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::multiset<_Key, _Compare, _Alloc>& __c = __cont; - std::__detail::__erase_nodes_if(__c, __pred); - } + { std::__detail::__erase_nodes_if(__cont, __pred); } namespace pmr { template<typename _Key, typename _Compare = less<_Key>> diff --git a/libstdc++-v3/include/experimental/unordered_map b/libstdc++-v3/include/experimental/unordered_map index eba9897..0b915ab 100644 --- a/libstdc++-v3/include/experimental/unordered_map +++ b/libstdc++-v3/include/experimental/unordered_map @@ -51,22 +51,14 @@ inline namespace fundamentals_v2 inline void erase_if(unordered_map<_Key, _Tp, _Hash, _CPred, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, _CPred, _Alloc>& __c - = __cont; - std::__detail::__erase_nodes_if(__c, __pred); - } + { std::__detail::__erase_nodes_if(__cont, __pred); } template<typename _Key, typename _Tp, typename _Hash, typename _CPred, typename _Alloc, typename _Predicate> inline void erase_if(unordered_multimap<_Key, _Tp, _Hash, _CPred, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, _Hash, _CPred, _Alloc>& __c - = __cont; - std::__detail::__erase_nodes_if(__c, __pred); - } + { std::__detail::__erase_nodes_if(__cont, __pred); } namespace pmr { template<typename _Key, typename _Tp, typename _Hash = hash<_Key>, diff --git a/libstdc++-v3/include/experimental/unordered_set b/libstdc++-v3/include/experimental/unordered_set index bc5cc11..87db446 100644 --- a/libstdc++-v3/include/experimental/unordered_set +++ b/libstdc++-v3/include/experimental/unordered_set @@ -51,21 +51,14 @@ inline namespace fundamentals_v2 inline void erase_if(unordered_set<_Key, _Hash, _CPred, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::unordered_set<_Key, _Hash, _CPred, _Alloc>& __c = __cont; - std::__detail::__erase_nodes_if(__c, __pred); - } + { std::__detail::__erase_nodes_if(__cont, __pred); } template<typename _Key, typename _Hash, typename _CPred, typename _Alloc, typename _Predicate> inline void erase_if(unordered_multiset<_Key, _Hash, _CPred, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::unordered_multiset<_Key, _Hash, _CPred, _Alloc>& __c - = __cont; - std::__detail::__erase_nodes_if(__c, __pred); - } + { std::__detail::__erase_nodes_if(__cont, __pred); } namespace pmr { template<typename _Key, typename _Hash = hash<_Key>, diff --git a/libstdc++-v3/include/experimental/vector b/libstdc++-v3/include/experimental/vector index c45a500..a14aedf 100644 --- a/libstdc++-v3/include/experimental/vector +++ b/libstdc++-v3/include/experimental/vector @@ -52,16 +52,16 @@ inline namespace fundamentals_v2 inline void erase_if(vector<_Tp, _Alloc>& __cont, _Predicate __pred) { - _GLIBCXX_STD_C::vector<_Tp, _Alloc>& __c = __cont; - __c.erase(std::remove_if(__c.begin(), __c.end(), __pred), __c.end()); + __cont.erase(std::remove_if(__cont.begin(), __cont.end(), __pred), + __cont.end()); } template<typename _Tp, typename _Alloc, typename _Up> inline void erase(vector<_Tp, _Alloc>& __cont, const _Up& __value) { - _GLIBCXX_STD_C::vector<_Tp, _Alloc>& __c = __cont; - __c.erase(std::remove(__c.begin(), __c.end(), __value), __c.end()); + __cont.erase(std::remove(__cont.begin(), __cont.end(), __value), + __cont.end()); } namespace pmr { diff --git a/libstdc++-v3/include/std/deque b/libstdc++-v3/include/std/deque index 71993e7..473479c 100644 --- a/libstdc++-v3/include/std/deque +++ b/libstdc++-v3/include/std/deque @@ -95,28 +95,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline typename deque<_Tp, _Alloc>::size_type erase_if(deque<_Tp, _Alloc>& __cont, _Predicate __pred) { - _GLIBCXX_STD_C::deque<_Tp, _Alloc>& __c = __cont; using namespace __gnu_cxx; - const auto __osz = __c.size(); - const auto __end = __c.end(); - auto __removed = std::__remove_if(__c.begin(), __end, + const auto __osz = __cont.size(); + const auto __end = __cont.end(); + auto __removed = std::__remove_if(__cont.begin(), __end, __ops::__pred_iter(std::ref(__pred))); - __c.erase(__removed, __end); - return __osz - __c.size(); + __cont.erase(__removed, __end); + return __osz - __cont.size(); } template<typename _Tp, typename _Alloc, typename _Up> inline typename deque<_Tp, _Alloc>::size_type erase(deque<_Tp, _Alloc>& __cont, const _Up& __value) { - _GLIBCXX_STD_C::deque<_Tp, _Alloc>& __c = __cont; using namespace __gnu_cxx; - const auto __osz = __c.size(); - const auto __end = __c.end(); - auto __removed = std::__remove_if(__c.begin(), __end, + const auto __osz = __cont.size(); + const auto __end = __cont.end(); + auto __removed = std::__remove_if(__cont.begin(), __end, __ops::__iter_equals_val(__value)); - __c.erase(__removed, __end); - return __osz - __c.size(); + __cont.erase(__removed, __end); + return __osz - __cont.size(); } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/std/map b/libstdc++-v3/include/std/map index 2926558..44bd44b 100644 --- a/libstdc++-v3/include/std/map +++ b/libstdc++-v3/include/std/map @@ -95,19 +95,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typename _Predicate> inline typename map<_Key, _Tp, _Compare, _Alloc>::size_type erase_if(map<_Key, _Tp, _Compare, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::map<_Key, _Tp, _Compare, _Alloc>& __c = __cont; - return __detail::__erase_nodes_if(__c, __pred); - } + { return __detail::__erase_nodes_if(__cont, __pred); } template<typename _Key, typename _Tp, typename _Compare, typename _Alloc, typename _Predicate> inline typename multimap<_Key, _Tp, _Compare, _Alloc>::size_type erase_if(multimap<_Key, _Tp, _Compare, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::multimap<_Key, _Tp, _Compare, _Alloc>& __c = __cont; - return __detail::__erase_nodes_if(__c, __pred); - } + { return __detail::__erase_nodes_if(__cont, __pred); } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // C++20 diff --git a/libstdc++-v3/include/std/set b/libstdc++-v3/include/std/set index 24e6e63..f1e1864 100644 --- a/libstdc++-v3/include/std/set +++ b/libstdc++-v3/include/std/set @@ -91,19 +91,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION typename _Predicate> inline typename set<_Key, _Compare, _Alloc>::size_type erase_if(set<_Key, _Compare, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::set<_Key, _Compare, _Alloc>& __c = __cont; - return __detail::__erase_nodes_if(__c, __pred); - } + { return __detail::__erase_nodes_if(__cont, __pred); } template<typename _Key, typename _Compare, typename _Alloc, typename _Predicate> inline typename multiset<_Key, _Compare, _Alloc>::size_type erase_if(multiset<_Key, _Compare, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::multiset<_Key, _Compare, _Alloc>& __c = __cont; - return __detail::__erase_nodes_if(__c, __pred); - } + { return __detail::__erase_nodes_if(__cont, __pred); } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // C++20 diff --git a/libstdc++-v3/include/std/unordered_map b/libstdc++-v3/include/std/unordered_map index 774c21f..e671506 100644 --- a/libstdc++-v3/include/std/unordered_map +++ b/libstdc++-v3/include/std/unordered_map @@ -83,11 +83,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline typename unordered_map<_Key, _Tp, _Hash, _CPred, _Alloc>::size_type erase_if(unordered_map<_Key, _Tp, _Hash, _CPred, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::unordered_map<_Key, _Tp, _Hash, _CPred, _Alloc>& __c - = __cont; - return __detail::__erase_nodes_if(__c, __pred); - } + { return __detail::__erase_nodes_if(__cont, __pred); } template<typename _Key, typename _Tp, typename _Hash, typename _CPred, typename _Alloc, typename _Predicate> @@ -95,11 +91,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION size_type erase_if(unordered_multimap<_Key, _Tp, _Hash, _CPred, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::unordered_multimap<_Key, _Tp, _Hash, _CPred, _Alloc>& __c - = __cont; - return __detail::__erase_nodes_if(__c, __pred); - } + { return __detail::__erase_nodes_if(__cont, __pred); } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // C++20 diff --git a/libstdc++-v3/include/std/unordered_set b/libstdc++-v3/include/std/unordered_set index 3859eea..1ad93d0 100644 --- a/libstdc++-v3/include/std/unordered_set +++ b/libstdc++-v3/include/std/unordered_set @@ -83,21 +83,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline typename unordered_set<_Key, _Hash, _CPred, _Alloc>::size_type erase_if(unordered_set<_Key, _Hash, _CPred, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::unordered_set<_Key, _Hash, _CPred, _Alloc>& __c = __cont; - return __detail::__erase_nodes_if(__c, __pred); - } + { return __detail::__erase_nodes_if(__cont, __pred); } template<typename _Key, typename _Hash, typename _CPred, typename _Alloc, typename _Predicate> inline typename unordered_multiset<_Key, _Hash, _CPred, _Alloc>::size_type erase_if(unordered_multiset<_Key, _Hash, _CPred, _Alloc>& __cont, _Predicate __pred) - { - _GLIBCXX_STD_C::unordered_multiset<_Key, _Hash, _CPred, _Alloc>& __c - = __cont; - return __detail::__erase_nodes_if(__c, __pred); - } + { return __detail::__erase_nodes_if(__cont, __pred); } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif // C++20 diff --git a/libstdc++-v3/include/std/vector b/libstdc++-v3/include/std/vector index 835fa8a..096511c 100644 --- a/libstdc++-v3/include/std/vector +++ b/libstdc++-v3/include/std/vector @@ -105,28 +105,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION inline typename vector<_Tp, _Alloc>::size_type erase_if(vector<_Tp, _Alloc>& __cont, _Predicate __pred) { - _GLIBCXX_STD_C::vector<_Tp, _Alloc>& __c = __cont; using namespace __gnu_cxx; - const auto __osz = __c.size(); - const auto __end = __c.end(); - auto __removed(std::__remove_if(__c.begin(), __end, - __ops::__pred_iter(std::ref(__pred)))); - __c.erase(__removed, __end); - return __osz - __c.size(); + const auto __osz = __cont.size(); + const auto __end = __cont.end(); + auto __removed = std::__remove_if(__cont.begin(), __end, + __ops::__pred_iter(std::ref(__pred))); + __cont.erase(__removed, __end); + return __osz - __cont.size(); } template<typename _Tp, typename _Alloc, typename _Up> inline typename vector<_Tp, _Alloc>::size_type erase(vector<_Tp, _Alloc>& __cont, const _Up& __value) { - _GLIBCXX_STD_C::vector<_Tp, _Alloc>& __c = __cont; using namespace __gnu_cxx; - const auto __osz = __c.size(); - const auto __end = __c.end(); - auto __removed = std::__remove_if(__c.begin(), __end, + const auto __osz = __cont.size(); + const auto __end = __cont.end(); + auto __removed = std::__remove_if(__cont.begin(), __end, __ops::__iter_equals_val(__value)); - __c.erase(__removed, __end); - return __osz - __c.size(); + __cont.erase(__removed, __end); + return __osz - __cont.size(); } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std |