Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2226748/?format=api
{ "id": 2226748, "url": "http://patchwork.ozlabs.org/api/patches/2226748/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhuozlstss.gcc.gcc-TEST.tkaminsk.78.1.5@forge-stage.sourceware.org/", "project": { "id": 17, "url": "http://patchwork.ozlabs.org/api/projects/17/?format=api", "name": "GNU Compiler Collection", "link_name": "gcc", "list_id": "gcc-patches.gcc.gnu.org", "list_email": "gcc-patches@gcc.gnu.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<bmm.hhuozlstss.gcc.gcc-TEST.tkaminsk.78.1.5@forge-stage.sourceware.org>", "list_archive_url": null, "date": "2026-04-22T18:44:03", "name": "[v1,05/12] libstdc++: Eliminate __gnu_cxx::__ops function objects (V)", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "324099842779fdc30361da645a1860988222e5e9", "submitter": { "id": 93223, "url": "http://patchwork.ozlabs.org/api/people/93223/?format=api", "name": "tkaminsk via Sourceware Forge", "email": "forge-bot+tkaminsk@forge-stage.sourceware.org" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/gcc/patch/bmm.hhuozlstss.gcc.gcc-TEST.tkaminsk.78.1.5@forge-stage.sourceware.org/mbox/", "series": [ { "id": 501087, "url": "http://patchwork.ozlabs.org/api/series/501087/?format=api", "web_url": "http://patchwork.ozlabs.org/project/gcc/list/?series=501087", "date": "2026-04-22T18:44:01", "name": "remove-predefined-ops", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/501087/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2226748/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2226748/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "gcc-patches@gcc.gnu.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org\n (client-ip=2620:52:6:3111::32; helo=vm01.sourceware.org;\n envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org;\n receiver=patchwork.ozlabs.org)", "sourceware.org; dmarc=none (p=none dis=none)\n header.from=forge-stage.sourceware.org", "sourceware.org;\n spf=pass smtp.mailfrom=forge-stage.sourceware.org", "server2.sourceware.org;\n arc=none smtp.remote-ip=38.145.34.39" ], "Received": [ "from vm01.sourceware.org (vm01.sourceware.org\n [IPv6:2620:52:6:3111::32])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g18By17yTz1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 05:18:18 +1000 (AEST)", "from vm01.sourceware.org (localhost [127.0.0.1])\n\tby sourceware.org (Postfix) with ESMTP id 2E96841B29F1\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 19:18:16 +0000 (GMT)", "from forge-stage.sourceware.org (vm08.sourceware.org [38.145.34.39])\n by sourceware.org (Postfix) with ESMTPS id 0873540A0876\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 18:45:35 +0000 (GMT)", "from forge-stage.sourceware.org (localhost [IPv6:::1])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256)\n (No client certificate requested)\n by forge-stage.sourceware.org (Postfix) with ESMTPS id 67DB043525\n for <gcc-patches@gcc.gnu.org>; Wed, 22 Apr 2026 18:45:33 +0000 (UTC)" ], "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 sourceware.org 2E96841B29F1", "OpenDKIM Filter v2.11.0 sourceware.org 0873540A0876" ], "DMARC-Filter": "OpenDMARC Filter v1.4.2 sourceware.org 0873540A0876", "ARC-Filter": "OpenARC Filter v1.0.0 sourceware.org 0873540A0876", "ARC-Seal": "i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1776883535; cv=none;\n b=bEiN14rPGwIk3Gpa6ZLQQ3Ys5gj0P1X9UEoy/UCLZTKDXCn/ifEtWfcmoNqgvedV2ivKsIQhGjlc8ihlWsHk6m1CVjFMD0zBJTilIyHFOwiPKsoPcUPJu1WRJXNSgACRFP/V9uN2DhgzSWHCdG7jfoKJE8DpbT7ZA49wkGLO8AQ=", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=sourceware.org; s=key;\n t=1776883535; c=relaxed/simple;\n bh=aoQ92ZEWIyESaryiTascu36eHVVnHwoa3GSTsgZSyJ8=;\n h=From:Date:Subject:To:Message-ID;\n b=GM032g7hrwpsslMqLS3rzNZ9VLuuhAGOJbfptpHKeHgRUsAPbMbANOzOLZYTunCVV4gOay0KW5ldde/lFfKCIhC2fgkpyCBWL/HTE/Hhi8cXAYc4JKJzFeXfYgWmit6epGWK+7xuVv/smjWPKb9r3+Vc+xl3cM1phnqP0SKNTGk=", "ARC-Authentication-Results": "i=1; server2.sourceware.org", "From": "tkaminsk via Sourceware Forge\n <forge-bot+tkaminsk@forge-stage.sourceware.org>", "Date": "Wed, 22 Apr 2026 18:44:03 +0000", "Subject": "[PATCH v1 05/12] libstdc++: Eliminate __gnu_cxx::__ops function\n objects (V)", "To": "gcc-patches mailing list <gcc-patches@gcc.gnu.org>", "Message-ID": "\n <bmm.hhuozlstss.gcc.gcc-TEST.tkaminsk.78.1.5@forge-stage.sourceware.org>", "X-Mailer": "batrachomyomachia", "X-Requested-Reviewer": "fdumont", "X-Pull-Request-Organization": "gcc", "X-Pull-Request-Repository": "gcc-TEST", "X-Pull-Request": "https://forge.sourceware.org/gcc/gcc-TEST/pulls/78", "References": "\n <bmm.hhuozlstss.gcc.gcc-TEST.tkaminsk.78.1.0@forge-stage.sourceware.org>", "In-Reply-To": "\n <bmm.hhuozlstss.gcc.gcc-TEST.tkaminsk.78.1.0@forge-stage.sourceware.org>", "X-Patch-URL": "\n https://forge.sourceware.org/redi/gcc/commit/1989fef0c91198bf2210aa4275394d444dff91e7", "X-BeenThere": "gcc-patches@gcc.gnu.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "Gcc-patches mailing list <gcc-patches.gcc.gnu.org>", "List-Unsubscribe": "<https://gcc.gnu.org/mailman/options/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe>", "List-Archive": "<https://gcc.gnu.org/pipermail/gcc-patches/>", "List-Post": "<mailto:gcc-patches@gcc.gnu.org>", "List-Help": "<mailto:gcc-patches-request@gcc.gnu.org?subject=help>", "List-Subscribe": "<https://gcc.gnu.org/mailman/listinfo/gcc-patches>,\n <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe>", "Reply-To": "gcc-patches mailing list <gcc-patches@gcc.gnu.org>,\n tkaminsk@gcc.gnu.org", "Errors-To": "gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org" }, "content": "From: Jonathan Wakely <jwakely@redhat.com>\n\nfind_if, search, search_n, count, count_if, copy_if, remove_copy_if\n\n\t* include/bits/predefined_ops.h (bind1st, bind2nd, not1)\n\t(__equal_to): New factory functions for predicates.\n\t* include/bits/stl_algo.h (__find_if_not, __search_n_aux)\n\t(__search_n_aux, __remove_copy_if, __replace_copy_if)\n\t(__is_permutation): Dereference iterators when invoking predicate.\n\t(find_end, find_if_not, remove_copy, remove_copy_if, remove)\n\t(remove_if, replace_copy, replace_copy_if, is_permutation, find)\n\t(find_if, count, count_if, search, search_n): Do not use\n\tindirect __ops function objects.\n\t* include/bits/stl_algobase.h (__find_if, __count_if)\n\t(__remove_if, __search, __is_permutation): Dereference iterators\n\twhen invoking predicates.\n\t(is_permutation, search): Do not use indirect __ops function\n\tobjects.\n\t* include/std/deque (erase_if): Remove call to __pred_iter.\n\t(erase): Replace __iter_equals_val with __equal_to.\n\t* include/std/inplace_vector (erase_if, erase): Likewise.\n\t* include/std/string (erase_if, erase): Likewise.\n\t* include/std/vector (erase_if, erase): Likewise.\n---\n libstdc++-v3/include/bits/predefined_ops.h | 171 ++++++++++++++++++++-\n libstdc++-v3/include/bits/stl_algo.h | 72 ++++-----\n libstdc++-v3/include/bits/stl_algobase.h | 27 ++--\n libstdc++-v3/include/std/deque | 4 +-\n libstdc++-v3/include/std/inplace_vector | 4 +-\n libstdc++-v3/include/std/string | 4 +-\n libstdc++-v3/include/std/vector | 4 +-\n 7 files changed, 225 insertions(+), 61 deletions(-)", "diff": "diff --git a/libstdc++-v3/include/bits/predefined_ops.h b/libstdc++-v3/include/bits/predefined_ops.h\nindex cb7a70ffe347..c6c3505a520e 100644\n--- a/libstdc++-v3/include/bits/predefined_ops.h\n+++ b/libstdc++-v3/include/bits/predefined_ops.h\n@@ -30,8 +30,12 @@\n #ifndef _GLIBCXX_PREDEFINED_OPS_H\n #define _GLIBCXX_PREDEFINED_OPS_H\t1\n \n-#include <bits/move.h>\n #include <bits/stl_function.h> // less<void>, equal_to<void>\n+#if __cplusplus >= 201103L\n+# include <type_traits> // is_empty, is_scalar, __conditional_t, __or_\n+#else\n+# include <ext/type_traits.h> // __conditional_type\n+#endif\n \n namespace __gnu_cxx\n {\n@@ -42,6 +46,171 @@ namespace __ops\n typedef std::equal_to<void> equal_to;\n typedef std::less<void> less;\n \n+#if __cplusplus >= 201103L\n+\n+ template<typename _Fn>\n+ using __by_ref_or_value_fn\n+ = std::__conditional_t<std::__or_<std::is_empty<_Fn>,\n+\t\t\t\t\tstd::is_scalar<_Fn>>::value,\n+\t\t\t _Fn, _Fn&>;\n+\n+ // More generic replacements for the deprecated utilities\n+ // std::bind1st, std::bind2nd, and std::not1.\n+ // These aren't fully \"transparent\" like std::less<void> because they\n+ // do not use perfect forwarding, everything is treated as an lvalue.\n+\n+ template<typename _Func, typename _Value, bool _Val_2nd = false>\n+ struct _Comp_with_val\n+ {\n+ using _Fn = __by_ref_or_value_fn<_Func>;\n+\n+ explicit constexpr\n+ _Comp_with_val(_Fn __f, const _Value& __v)\n+ : _M_f(__f), _M_val(__v) { }\n+\n+ [[__no_unique_address__]] _Fn _M_f;\n+ const _Value& _M_val;\n+\n+ template<typename _Tp>\n+\tconstexpr bool\n+\toperator()(_Tp&& __arg) const\n+\t{\n+#pragma GCC diagnostic push\n+#pragma GCC diagnostic ignored \"-Wc++17-extensions\"\n+\t if constexpr (_Val_2nd)\n+\t return _M_f(__arg, _M_val);\n+\t else\n+\t return _M_f(_M_val, __arg);\n+#pragma GCC diagnostic pop\n+\t}\n+ };\n+\n+ template<typename _Func, typename _Value>\n+ constexpr _Comp_with_val<_Func, _Value>\n+ bind1st(_Func&& __f, const _Value& __val)\n+ { return _Comp_with_val<_Func, _Value>(__f, __val); }\n+\n+ template<typename _Func, typename _Value>\n+ constexpr _Comp_with_val<_Func, _Value, true>\n+ bind2nd(_Func&& __f, const _Value& __val)\n+ { return _Comp_with_val<_Func, _Value, true>(__f, __val); }\n+\n+ // Equivalent to bind2nd(equal_to{}, val)\n+ template<typename _Value>\n+ constexpr _Comp_with_val<equal_to, _Value, true>\n+ __equal_to(const _Value& __val)\n+ { return _Comp_with_val<equal_to, _Value, true>(equal_to(), __val); }\n+\n+ template<typename _Func>\n+ struct _Unary_negate\n+ {\n+ using _Fn = __by_ref_or_value_fn<_Func>;\n+\n+ explicit constexpr\n+ _Unary_negate(_Fn __f) : _M_f(__f) { }\n+\n+ [[__no_unique_address__]] _Fn _M_f;\n+\n+ template<typename _Tp>\n+\tconstexpr bool\n+\toperator()(_Tp&& __arg) const { return !_M_f(__arg); }\n+ };\n+\n+ template<typename _Func>\n+ constexpr _Unary_negate<_Func>\n+ not1(_Func&& __f)\n+ { return _Unary_negate<_Func>(__f); }\n+\n+#else // <= C++11\n+\n+ template<typename _Fn>\n+ struct __by_ref_or_value_fn\n+ : __conditional_type<__is_empty(_Fn), _Fn, _Fn&>\n+ { };\n+\n+ template<typename _Fn>\n+ struct __by_ref_or_value_fn<_Fn*>\n+ { typedef _Fn* __type; };\n+\n+ // We don't use std::bind1st, std::bind2nd, or std::not1 here because they\n+ // require adaptable function objects, i.e. with nested result_type and\n+ // either argument_type or first_argument_type and second_argument_type.\n+\n+ template<typename _Func, typename _Value>\n+ struct _Comp_with_val_1st\n+ {\n+ typedef typename __by_ref_or_value_fn<_Func>::__type _Fn;\n+\n+ explicit\n+ _Comp_with_val_1st(_Fn __f, const _Value& __v)\n+ : _M_f(__f), _M_val(__v) { }\n+\n+ _Fn _M_f;\n+ const _Value& _M_val;\n+\n+ template<typename _Tp>\n+\tbool operator()(_Tp& __arg) const { return _M_f(_M_val, __arg); }\n+ template<typename _Tp>\n+\tbool operator()(const _Tp& __arg) const { return _M_f(_M_val, __arg); }\n+ };\n+\n+ template<typename _Func, typename _Value>\n+ struct _Comp_with_val_2nd\n+ {\n+ typedef typename __by_ref_or_value_fn<_Func>::__type _Fn;\n+\n+ explicit\n+ _Comp_with_val_2nd(_Fn __f, const _Value& __v)\n+ : _M_f(__f), _M_val(__v) { }\n+\n+ _Fn _M_f;\n+ const _Value& _M_val;\n+\n+ template<typename _Tp>\n+\tbool operator()(_Tp& __arg) const { return _M_f(__arg, _M_val); }\n+ template<typename _Tp>\n+\tbool operator()(const _Tp& __arg) const { return _M_f(__arg, _M_val); }\n+ };\n+\n+ template<typename _Func, typename _Value>\n+ inline _Comp_with_val_1st<_Func, _Value>\n+ bind1st(_Func& __f, const _Value& __val)\n+ { return _Comp_with_val_1st<_Func, _Value>(__f, __val); }\n+\n+ template<typename _Func, typename _Value>\n+ inline _Comp_with_val_2nd<_Func, _Value>\n+ bind2nd(_Func& __f, const _Value& __val)\n+ { return _Comp_with_val_2nd<_Func, _Value>(__f, __val); }\n+\n+ template<typename _Value>\n+ inline _Comp_with_val_2nd<equal_to, _Value>\n+ __equal_to(const _Value& __val)\n+ { return _Comp_with_val_2nd<equal_to, _Value>(equal_to(), __val); }\n+\n+ template<typename _Func>\n+ struct _Unary_negate_1 // N.B. different name for C++98 to satisfy ODR\n+ {\n+ typedef typename __by_ref_or_value_fn<_Func>::__type _Fn;\n+\n+ explicit _Unary_negate_1(_Fn __f) : _M_f(__f) { }\n+\n+ _Fn _M_f;\n+\n+ template<typename _Tp>\n+\tbool\n+\toperator()(_Tp& __arg) const { return !_M_f(__arg); }\n+ template<typename _Tp>\n+\tbool\n+\toperator()(const _Tp& __arg) const { return !_M_f(__arg); }\n+ };\n+\n+ template<typename _Func>\n+ inline _Unary_negate_1<_Func>\n+ not1(_Func& __f)\n+ { return _Unary_negate_1<_Func>(__f); }\n+#endif\n+\n+\n struct _Iter_less_iter\n {\n template<typename _Iterator1, typename _Iterator2>\ndiff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h\nindex 056488ba6e36..b606e1f0e2a6 100644\n--- a/libstdc++-v3/include/bits/stl_algo.h\n+++ b/libstdc++-v3/include/bits/stl_algo.h\n@@ -113,7 +113,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t\t _Predicate __pred)\n {\n return std::__find_if(__first, __last,\n-\t\t\t __gnu_cxx::__ops::__negate(__pred));\n+\t\t\t __gnu_cxx::__ops::not1(__pred));\n }\n \n /// Like find_if_not(), but uses and updates a count of the\n@@ -162,7 +162,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t __n = __count;\n \t _ForwardIterator __i = __first;\n \t ++__i;\n-\t while (__i != __last && __n != 1 && __unary_pred(__i))\n+\t while (__i != __last && __n != 1 && __unary_pred(*__i))\n \t {\n \t ++__i;\n \t --__n;\n@@ -201,7 +201,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t // __first here is always pointing to one past the last element of\n \t // next possible match.\n \t _RandomAccessIter __backTrack = __first;\n-\t while (__unary_pred(--__backTrack))\n+\t while (__unary_pred(*--__backTrack))\n \t {\n \t if (--__remainder == 0)\n \t\treturn __first - _DistanceType(__count); // Success\n@@ -339,7 +339,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n return std::__find_end(__first1, __last1, __first2, __last2,\n \t\t\t std::__iterator_category(__first1),\n \t\t\t std::__iterator_category(__first2),\n-\t\t\t __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t __gnu_cxx::__ops::equal_to());\n }\n \n /**\n@@ -390,7 +390,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n return std::__find_end(__first1, __last1, __first2, __last2,\n \t\t\t std::__iterator_category(__first1),\n \t\t\t std::__iterator_category(__first2),\n-\t\t\t __gnu_cxx::__ops::__iter_comp_iter(__comp));\n+\t\t\t __comp);\n }\n \n #if __cplusplus >= 201103L\n@@ -470,8 +470,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n __glibcxx_function_requires(_UnaryPredicateConcept<_Predicate,\n \t typename iterator_traits<_InputIterator>::value_type>)\n __glibcxx_requires_valid_range(__first, __last);\n- return std::__find_if_not(__first, __last,\n-\t\t\t\t__gnu_cxx::__ops::__pred_iter(__pred));\n+ return std::__find_if_not(__first, __last, __pred);\n }\n \n /**\n@@ -551,7 +550,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t\t _OutputIterator __result, _Predicate __pred)\n {\n for (; __first != __last; ++__first)\n-\tif (!__pred(__first))\n+\tif (!__pred(*__first))\n \t {\n \t *__result = *__first;\n \t ++__result;\n@@ -588,7 +587,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n __glibcxx_requires_valid_range(__first, __last);\n \n return std::__remove_copy_if(__first, __last, __result,\n-\t__gnu_cxx::__ops::__iter_equals_val(__value));\n+\t\t\t\t __gnu_cxx::__ops::__equal_to(__value));\n }\n \n /**\n@@ -621,8 +620,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t typename iterator_traits<_InputIterator>::value_type>)\n __glibcxx_requires_valid_range(__first, __last);\n \n- return std::__remove_copy_if(__first, __last, __result,\n-\t\t\t\t __gnu_cxx::__ops::__pred_iter(__pred));\n+ return std::__remove_copy_if(__first, __last, __result, __pred);\n }\n \n #if __cplusplus >= 201103L\n@@ -780,7 +778,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n __glibcxx_requires_valid_range(__first, __last);\n \n return std::__remove_if(__first, __last,\n-\t\t__gnu_cxx::__ops::__iter_equals_val(__value));\n+\t\t\t __gnu_cxx::__ops::__equal_to(__value));\n }\n \n /**\n@@ -813,8 +811,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n \t typename iterator_traits<_ForwardIterator>::value_type>)\n __glibcxx_requires_valid_range(__first, __last);\n \n- return std::__remove_if(__first, __last,\n-\t\t\t __gnu_cxx::__ops::__pred_iter(__pred));\n+ return std::__remove_if(__first, __last, __pred);\n }\n \n template<typename _ForwardIterator, typename _BinaryPredicate>\n@@ -3124,7 +3121,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t\t _Predicate __pred, const _Tp& __new_value)\n {\n for (; __first != __last; ++__first, (void)++__result)\n-\tif (__pred(__first))\n+\tif (__pred(*__first))\n \t *__result = __new_value;\n \telse\n \t *__result = *__first;\n@@ -3161,8 +3158,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n __glibcxx_requires_valid_range(__first, __last);\n \n return std::__replace_copy_if(__first, __last, __result,\n-\t\t\t__gnu_cxx::__ops::__iter_equals_val(__old_value),\n-\t\t\t\t\t __new_value);\n+\t\t\t\t __gnu_cxx::__ops::__equal_to(__old_value),\n+\t\t\t\t __new_value);\n }\n \n /**\n@@ -3196,9 +3193,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t typename iterator_traits<_InputIterator>::value_type>)\n __glibcxx_requires_valid_range(__first, __last);\n \n- return std::__replace_copy_if(__first, __last, __result,\n-\t\t\t\t__gnu_cxx::__ops::__pred_iter(__pred),\n-\t\t\t\t\t __new_value);\n+ return std::__replace_copy_if(__first, __last, __result, __pred,\n+\t\t\t\t __new_value);\n }\n \n #if __cplusplus >= 201103L\n@@ -3503,8 +3499,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n \t typename iterator_traits<_ForwardIterator2>::value_type>)\n __glibcxx_requires_valid_range(__first1, __last1);\n \n- return std::__is_permutation(__first1, __last1, __first2,\n-\t\t\t\t __gnu_cxx::__ops::__iter_comp_iter(__pred));\n+ return std::__is_permutation(__first1, __last1, __first2, __pred);\n }\n \n #if __cplusplus > 201103L\n@@ -3535,7 +3530,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n // have the same elements in the same order.\n for (; __first1 != __last1 && __first2 != __last2;\n \t ++__first1, (void)++__first2)\n-\tif (!__pred(__first1, __first2))\n+\tif (!__pred(*__first1, *__first2))\n \t break;\n \n if constexpr (__ra_iters)\n@@ -3556,14 +3551,16 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)\n \t{\n \t if (__scan != std::__find_if(__first1, __scan,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))\n+\t\t\t\t __gnu_cxx::__ops::bind1st(__pred,\n+\t\t\t\t\t\t\t\t *__scan)))\n \t continue; // We've seen this one before.\n \n \t auto __matches = std::__count_if(__first2, __last2,\n-\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));\n+\t\t\t\t\t __gnu_cxx::__ops::bind1st(__pred,\n+\t\t\t\t\t\t\t\t *__scan));\n \t if (0 == __matches\n \t || std::__count_if(__scan, __last1,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))\n+\t\t\t\t __gnu_cxx::__ops::bind1st(__pred, *__scan))\n \t != __matches)\n \t return false;\n \t}\n@@ -3593,9 +3590,8 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n __glibcxx_requires_valid_range(__first1, __last1);\n __glibcxx_requires_valid_range(__first2, __last2);\n \n- return\n-\tstd::__is_permutation(__first1, __last1, __first2, __last2,\n-\t\t\t __gnu_cxx::__ops::__iter_equal_to_iter());\n+ return std::__is_permutation(__first1, __last1, __first2, __last2,\n+\t\t\t\t __gnu_cxx::__ops::equal_to());\n }\n \n /**\n@@ -3624,7 +3620,7 @@ _GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)\n __glibcxx_requires_valid_range(__first2, __last2);\n \n return std::__is_permutation(__first1, __last1, __first2, __last2,\n-\t\t\t\t __gnu_cxx::__ops::__iter_comp_iter(__pred));\n+\t\t\t\t __pred);\n }\n #endif // C++14\n \n@@ -3903,7 +3899,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n #endif\n \n return std::__find_if(__first, __last,\n-\t\t\t __gnu_cxx::__ops::__iter_equals_val(__val));\n+\t\t\t __gnu_cxx::__ops::__equal_to(__val));\n }\n \n /**\n@@ -3928,8 +3924,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \t typename iterator_traits<_InputIterator>::value_type>)\n __glibcxx_requires_valid_range(__first, __last);\n \n- return std::__find_if(__first, __last,\n-\t\t\t __gnu_cxx::__ops::__pred_iter(__pred));\n+ return std::__find_if(__first, __last, __pred);\n }\n \n /**\n@@ -4085,7 +4080,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n __glibcxx_requires_valid_range(__first, __last);\n \n return std::__count_if(__first, __last,\n-\t\t\t __gnu_cxx::__ops::__iter_equals_val(__value));\n+\t\t\t __gnu_cxx::__ops::__equal_to(__value));\n }\n \n /**\n@@ -4108,8 +4103,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n \t typename iterator_traits<_InputIterator>::value_type>)\n __glibcxx_requires_valid_range(__first, __last);\n \n- return std::__count_if(__first, __last,\n-\t\t\t __gnu_cxx::__ops::__pred_iter(__pred));\n+ return std::__count_if(__first, __last, __pred);\n }\n \n /**\n@@ -4154,7 +4148,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n __glibcxx_requires_valid_range(__first2, __last2);\n \n return std::__search(__first1, __last1, __first2, __last2,\n-\t\t\t __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t __gnu_cxx::__ops::equal_to());\n }\n \n /**\n@@ -4185,7 +4179,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n __glibcxx_requires_valid_range(__first, __last);\n \n return std::__search_n(__first, __last, __count,\n-\t\t\t __gnu_cxx::__ops::__iter_equals_val(__val));\n+\t\t\t __gnu_cxx::__ops::__equal_to(__val));\n }\n \n \n@@ -4221,7 +4215,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n __glibcxx_requires_valid_range(__first, __last);\n \n return std::__search_n(__first, __last, __count,\n-\t\t__gnu_cxx::__ops::__iter_comp_val(__binary_pred, __val));\n+\t\t\t __gnu_cxx::__ops::bind2nd(__binary_pred, __val));\n }\n \n #if __cplusplus >= 201703L\ndiff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h\nindex 820091aee2dc..0393d3318ed8 100644\n--- a/libstdc++-v3/include/bits/stl_algobase.h\n+++ b/libstdc++-v3/include/bits/stl_algobase.h\n@@ -2101,7 +2101,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n __find_if(_Iterator __first, _Iterator __last, _Predicate __pred)\n {\n #pragma GCC unroll 4\n- while (__first != __last && !__pred(__first))\n+ while (__first != __last && !__pred(*__first))\n \t++__first;\n return __first;\n }\n@@ -2113,7 +2113,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n {\n typename iterator_traits<_InputIterator>::difference_type __n = 0;\n for (; __first != __last; ++__first)\n-\tif (__pred(__first))\n+\tif (__pred(*__first))\n \t ++__n;\n return __n;\n }\n@@ -2130,7 +2130,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n _ForwardIterator __result = __first;\n ++__first;\n for (; __first != __last; ++__first)\n-\tif (!__pred(__first))\n+\tif (!__pred(*__first))\n \t {\n \t *__result = _GLIBCXX_MOVE(*__first);\n \t ++__result;\n@@ -2154,7 +2154,8 @@ _GLIBCXX_END_NAMESPACE_ALGO\n _ForwardIterator2 __p1(__first2);\n if (++__p1 == __last2)\n \treturn std::__find_if(__first1, __last1,\n-\t\t__gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));\n+\t\t\t __gnu_cxx::__ops::bind2nd(__predicate,\n+\t\t\t\t\t\t\t*__first2));\n \n // General case.\n _ForwardIterator1 __current = __first1;\n@@ -2163,7 +2164,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n \t{\n \t __first1 =\n \t std::__find_if(__first1, __last1,\n-\t\t__gnu_cxx::__ops::__iter_comp_iter(__predicate, __first2));\n+\t\t\t __gnu_cxx::__ops::bind2nd(__predicate, *__first2));\n \n \t if (__first1 == __last1)\n \t return __last1;\n@@ -2173,7 +2174,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n \t if (++__current == __last1)\n \t return __last1;\n \n-\t while (__predicate(__current, __p))\n+\t while (__predicate(*__current, *__p))\n \t {\n \t if (++__p == __last2)\n \t\treturn __first1;\n@@ -2196,7 +2197,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n // Efficiently compare identical prefixes: O(N) if sequences\n // have the same elements in the same order.\n for (; __first1 != __last1; ++__first1, (void)++__first2)\n-\tif (!__pred(__first1, __first2))\n+\tif (!__pred(*__first1, *__first2))\n \t break;\n \n if (__first1 == __last1)\n@@ -2209,15 +2210,16 @@ _GLIBCXX_END_NAMESPACE_ALGO\n for (_ForwardIterator1 __scan = __first1; __scan != __last1; ++__scan)\n \t{\n \t if (__scan != std::__find_if(__first1, __scan,\n-\t\t\t __gnu_cxx::__ops::__iter_comp_iter(__pred, __scan)))\n+\t\t\t\t __gnu_cxx::__ops::bind1st(__pred,\n+\t\t\t\t\t\t\t\t *__scan)))\n \t continue; // We've seen this one before.\n \n \t auto __matches\n \t = std::__count_if(__first2, __last2,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan));\n+\t\t\t __gnu_cxx::__ops::bind1st(__pred, *__scan));\n \t if (0 == __matches ||\n \t std::__count_if(__scan, __last1,\n-\t\t\t__gnu_cxx::__ops::__iter_comp_iter(__pred, __scan))\n+\t\t\t __gnu_cxx::__ops::bind1st(__pred, *__scan))\n \t != __matches)\n \t return false;\n \t}\n@@ -2251,7 +2253,7 @@ _GLIBCXX_END_NAMESPACE_ALGO\n __glibcxx_requires_valid_range(__first1, __last1);\n \n return std::__is_permutation(__first1, __last1, __first2,\n-\t\t\t\t __gnu_cxx::__ops::__iter_equal_to_iter());\n+\t\t\t\t __gnu_cxx::__ops::equal_to());\n }\n #endif // C++11\n \n@@ -2295,8 +2297,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO\n __glibcxx_requires_valid_range(__first1, __last1);\n __glibcxx_requires_valid_range(__first2, __last2);\n \n- return std::__search(__first1, __last1, __first2, __last2,\n-\t\t\t __gnu_cxx::__ops::__iter_comp_iter(__predicate));\n+ return std::__search(__first1, __last1, __first2, __last2, __predicate);\n }\n \n _GLIBCXX_END_NAMESPACE_ALGO\ndiff --git a/libstdc++-v3/include/std/deque b/libstdc++-v3/include/std/deque\nindex 2badab80a6dc..3b1a7dea2b10 100644\n--- a/libstdc++-v3/include/std/deque\n+++ b/libstdc++-v3/include/std/deque\n@@ -109,7 +109,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n const auto __osz = __cont.size();\n const auto __end = __ucont.end();\n auto __removed = std::__remove_if(__ucont.begin(), __end,\n-\t\t\t\t\t__ops::__pred_iter(std::ref(__pred)));\n+\t\t\t\t\tstd::ref(__pred));\n if (__removed != __end)\n \t{\n \t __cont.erase(__niter_wrap(__cont.begin(), __removed),\n@@ -130,7 +130,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n const auto __osz = __cont.size();\n const auto __end = __ucont.end();\n auto __removed = std::__remove_if(__ucont.begin(), __end,\n-\t\t\t\t\t__ops::__iter_equals_val(__value));\n+\t\t\t\t\t__ops::__equal_to(__value));\n if (__removed != __end)\n \t{\n \t __cont.erase(__niter_wrap(__cont.begin(), __removed),\ndiff --git a/libstdc++-v3/include/std/inplace_vector b/libstdc++-v3/include/std/inplace_vector\nindex b5a81bed3c98..b32aa4f3708c 100644\n--- a/libstdc++-v3/include/std/inplace_vector\n+++ b/libstdc++-v3/include/std/inplace_vector\n@@ -1343,7 +1343,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n const auto __osz = __cont.size();\n const auto __end = __cont.end();\n auto __removed = std::__remove_if(__cont.begin(), __end,\n-\t\t\t\t\t__ops::__pred_iter(std::ref(__pred)));\n+\t\t\t\t\tstd::ref(__pred));\n if (__removed != __end)\n \t{\n \t __cont.erase(__niter_wrap(__cont.begin(), __removed),\n@@ -1362,7 +1362,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n const auto __osz = __cont.size();\n const auto __end = __cont.end();\n auto __removed = std::__remove_if(__cont.begin(), __end,\n-\t\t\t\t\t__ops::__iter_equals_val(__value));\n+\t\t\t\t\t__ops::__equal_to(__value));\n if (__removed != __end)\n \t{\n \t __cont.erase(__niter_wrap(__cont.begin(), __removed),\ndiff --git a/libstdc++-v3/include/std/string b/libstdc++-v3/include/std/string\nindex 71864715ff75..74e0c7f2be58 100644\n--- a/libstdc++-v3/include/std/string\n+++ b/libstdc++-v3/include/std/string\n@@ -104,7 +104,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n const auto __osz = __cont.size();\n const auto __end = __cont.end();\n auto __removed = std::__remove_if(__cont.begin(), __end,\n-\t\t\t\t\t__ops::__pred_iter(std::ref(__pred)));\n+\t\t\t\t\tstd::ref(__pred));\n __cont.erase(__removed, __end);\n return __osz - __cont.size();\n }\n@@ -119,7 +119,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n const auto __osz = __cont.size();\n const auto __end = __cont.end();\n auto __removed = std::__remove_if(__cont.begin(), __end,\n-\t\t\t\t\t__ops::__iter_equals_val(__value));\n+\t\t\t\t\t__ops::__equal_to(__value));\n __cont.erase(__removed, __end);\n return __osz - __cont.size();\n }\ndiff --git a/libstdc++-v3/include/std/vector b/libstdc++-v3/include/std/vector\nindex a98ffb179ec0..47105210bc0c 100644\n--- a/libstdc++-v3/include/std/vector\n+++ b/libstdc++-v3/include/std/vector\n@@ -122,7 +122,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n const auto __osz = __cont.size();\n const auto __end = __ucont.end();\n auto __removed = std::__remove_if(__ucont.begin(), __end,\n-\t\t\t\t\t__ops::__pred_iter(std::ref(__pred)));\n+\t\t\t\t\tstd::ref(__pred));\n if (__removed != __end)\n \t{\n \t __cont.erase(__niter_wrap(__cont.begin(), __removed),\n@@ -144,7 +144,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION\n const auto __osz = __cont.size();\n const auto __end = __ucont.end();\n auto __removed = std::__remove_if(__ucont.begin(), __end,\n-\t\t\t\t\t__ops::__iter_equals_val(__value));\n+\t\t\t\t\t__ops::__equal_to(__value));\n if (__removed != __end)\n \t{\n \t __cont.erase(__niter_wrap(__cont.begin(), __removed),\n", "prefixes": [ "v1", "05/12" ] }