From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1879) id 895E4385114F; Tue, 30 Aug 2022 18:44:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 895E4385114F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1661885068; bh=hYFuNyIVtv9hxdOGIyi8Kv9eJiNF850V2ciFcSupG94=; h=From:To:Subject:Date:From; b=to1tfcSeN0FREFold0/8Bq2vDQP7Tt1Ml4GmSPsQwS1vmGdVSgdDLxZtSJyGKPpGT kS/23z9bYUEnlniFdDEprEGLnXZ8EbsO5vlVDHEe5iiCHTXkgxdBOmMVz3jozoK5Od pHDgvklZ0/w/QcPpVRVSWbwpyIBrqn1alpODhA+k= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Simon Marchi To: gdb-cvs@sourceware.org Subject: [binutils-gdb] gdbsupport: add wrapper around result_of and invoke_result X-Act-Checkin: binutils-gdb X-Git-Author: Simon Marchi X-Git-Refname: refs/heads/master X-Git-Oldrev: 2d83dd693901cb2588517d7296f1360d902c89f7 X-Git-Newrev: c95dd24e796615b9f41e8821137fc088049eef92 Message-Id: <20220830184428.895E4385114F@sourceware.org> Date: Tue, 30 Aug 2022 18:44:28 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3Dc95dd24e7966= 15b9f41e8821137fc088049eef92 commit c95dd24e796615b9f41e8821137fc088049eef92 Author: Simon Marchi Date: Fri Aug 26 11:57:54 2022 -0400 gdbsupport: add wrapper around result_of and invoke_result =20 When building with Clang 14 (using gcc 12 libstdc++ headers), I get: =20 CXX dwarf2/read.o In file included from /home/simark/src/binutils-gdb/gdb/dwarf2/read= .c:94: /home/simark/src/binutils-gdb/gdb/../gdbsupport/parallel-for.h:142:= 21: error: 'result_of<(lambda at /home/simark/src/binutils-gdb/gdb/dwarf2/r= ead.c:7124:5) (__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator *, std::__cxx1= 998::vector= >>, std::vector>, std::random_access_iterator_tag>, __gnu_debug::_Safe_iterator<__gnu_= cxx::__normal_iterator *, std::__cxx1998::vector>>, std::vector>, std::random_access_iterator_tag>)>' is dep= recated: use 'std::invoke_result' instead [-Werror,-Wdeprecated-declaration= s] =3D typename std::result_of= ::type; ^ /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:7122:14: note: in i= nstantiation of function template specialization 'gdb::parallel_for_each<__= gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator *, std::__cxx1998::vector>>, std::vector>, std::rando= m_access_iterator_tag>, (lambda at /home/simark/src/binutils-gdb/gdb/dwarf2= /read.c:7124:5)>' requested here =3D gdb::parallel_for_each (1, per_bfd->all_comp_units.begin = (), ^ /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.1.1/../../../../includ= e/c++/12.1.1/type_traits:2597:9: note: 'result_of<(lambda at /home/simark/s= rc/binutils-gdb/gdb/dwarf2/read.c:7124:5) (__gnu_debug::_Safe_iterator<__gn= u_cxx::__normal_iterator *, std::__cxx1998::vector>>, std::vector>, std::random_access_iterator_tag>, __gnu_= debug::_Safe_iterator<__gnu_cxx::__normal_iterator *, std::__cxx1998::vector>>, std::vector>, std::random_ac= cess_iterator_tag>)>' has been explicitly marked deprecated here { } _GLIBCXX17_DEPRECATED_SUGGEST("std::invoke_result"); ^ /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.1.1/../../../../includ= e/c++/12.1.1/x86_64-pc-linux-gnu/bits/c++config.h:120:45: note: expanded fr= om macro '_GLIBCXX17_DEPRECATED_SUGGEST' # define _GLIBCXX17_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUG= GEST(ALT) ^ /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.1.1/../../../../includ= e/c++/12.1.1/x86_64-pc-linux-gnu/bits/c++config.h:96:19: note: expanded fro= m macro '_GLIBCXX_DEPRECATED_SUGGEST' __attribute__ ((__deprecated__ ("use '" ALT "' instead"))) ^ =20 It complains about the use of std::result_of, which is deprecated in C++17 and removed in C++20: =20 https://en.cppreference.com/w/cpp/types/result_of =20 Given we'll have to transition to std::invoke_result eventually, make a GDB wrapper to mimimc std::invoke_result, which uses std::invoke_result for C++ >=3D 17 and std::result_of otherwise. This way, it will be easy to remove the wrapper in the future, just replace gdb:: with std::. =20 Tested by building with gcc 12 in -std=3Dc++11 and -std=3Dc++17 mode, a= nd clang in -std=3Dc++17 mode (I did not test fully with clang in -std=3Dc= ++11 mode because there are other unrelated issues). =20 Change-Id: I50debde0a3307a7bc67fcf8fceefda51860efc1d Diff: --- gdbsupport/function-view.h | 3 ++- gdbsupport/invoke-result.h | 37 +++++++++++++++++++++++++++++++++++++ gdbsupport/parallel-for.h | 10 +++++----- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/gdbsupport/function-view.h b/gdbsupport/function-view.h index 9f8a8680cf4..cc2cdc347da 100644 --- a/gdbsupport/function-view.h +++ b/gdbsupport/function-view.h @@ -192,6 +192,7 @@ You can find unit tests covering the whole API in unittests/function-view-selftests.c. */ =20 +#include "invoke-result.h" namespace gdb { =20 namespace fv_detail { @@ -229,7 +230,7 @@ class function_view /* True if Func can be called with Args, and either the result is Res, convertible to Res or Res is void. */ template::type> + typename Res2 =3D typename gdb::invoke_result::ty= pe> struct IsCompatibleCallable : CompatibleReturnType {}; =20 diff --git a/gdbsupport/invoke-result.h b/gdbsupport/invoke-result.h new file mode 100644 index 00000000000..5d5ffa0657c --- /dev/null +++ b/gdbsupport/invoke-result.h @@ -0,0 +1,37 @@ +/* Compatibility wrapper around std::result_of and std::invoke_result. + + Copyright (C) 2022 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . = */ + +#ifndef GDBSUPPORT_INVOKE_RESULT_H +#define GDBSUPPORT_INVOKE_RESULT_H + +#include + +namespace gdb +{ +#if __cplusplus >=3D 201703L +template +using invoke_result =3D std::invoke_result; +#else +template +using invoke_result =3D std::result_of; +#endif + +} /* namespace gdb */ + +#endif /* GDBSUPPORT_INVOKE_RESULT_H */ diff --git a/gdbsupport/parallel-for.h b/gdbsupport/parallel-for.h index 4cd1dbf847e..acd9137efbd 100644 --- a/gdbsupport/parallel-for.h +++ b/gdbsupport/parallel-for.h @@ -22,6 +22,7 @@ =20 #include #include +#include "gdbsupport/invoke-result.h" #include "gdbsupport/thread-pool.h" #include "gdbsupport/function-view.h" =20 @@ -132,14 +133,14 @@ private: =20 template typename gdb::detail::par_for_accumulator< - typename std::result_of::type + typename gdb::invoke_result::type >::result_type parallel_for_each (unsigned n, RandomIt first, RandomIt last, RangeFunction callback, gdb::function_view task_size =3D nullptr) { using result_type - =3D typename std::result_of::type; + =3D typename gdb::invoke_result::ty= pe; =20 /* If enabled, print debug info about how the work is distributed across the threads. */ @@ -276,14 +277,13 @@ parallel_for_each (unsigned n, RandomIt first, Random= It last, =20 template typename gdb::detail::par_for_accumulator< - typename std::result_of::type + typename gdb::invoke_result::type >::result_type sequential_for_each (unsigned n, RandomIt first, RandomIt last, RangeFunction callback, gdb::function_view task_size =3D nullptr) { - using result_type - =3D typename std::result_of::type; + using result_type =3D typename gdb::invoke_result::type; =20 gdb::detail::par_for_accumulator results (0);