* [PATCH] gdbsupport: add wrapper around result_of and invoke_result
@ 2022-08-26 15:57 Simon Marchi via Gdb-patches
2022-08-26 15:59 ` Simon Marchi via Gdb-patches
2022-08-30 17:42 ` Tom Tromey
0 siblings, 2 replies; 4+ messages in thread
From: Simon Marchi via Gdb-patches @ 2022-08-26 15:57 UTC (permalink / raw)
To: gdb-patches
When building with Clang 14 (using gcc 12 libstdc++ headers), I get:
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/read.c:7124:5) (__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter> *, std::__cxx1998::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>>, std::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>, std::random_access_iterator_tag>, __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter> *, std::__cxx1998::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>>, std::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>, std::random_access_iterator_tag>)>' is deprecated: use 'std::invoke_result' instead [-Werror,-Wdeprecated-declarations]
= typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type;
^
/home/simark/src/binutils-gdb/gdb/dwarf2/read.c:7122:14: note: in instantiation of function template specialization 'gdb::parallel_for_each<__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter> *, std::__cxx1998::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>>, std::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>, std::random_access_iterator_tag>, (lambda at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:7124:5)>' requested here
= gdb::parallel_for_each (1, per_bfd->all_comp_units.begin (),
^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.1.1/../../../../include/c++/12.1.1/type_traits:2597:9: note: 'result_of<(lambda at /home/simark/src/binutils-gdb/gdb/dwarf2/read.c:7124:5) (__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter> *, std::__cxx1998::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>>, std::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>, std::random_access_iterator_tag>, __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter> *, std::__cxx1998::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>>, std::vector<std::unique_ptr<dwarf2_per_cu_data, dwarf2_per_cu_data_deleter>>, std::random_access_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/../../../../include/c++/12.1.1/x86_64-pc-linux-gnu/bits/c++config.h:120:45: note: expanded from macro '_GLIBCXX17_DEPRECATED_SUGGEST'
# define _GLIBCXX17_DEPRECATED_SUGGEST(ALT) _GLIBCXX_DEPRECATED_SUGGEST(ALT)
^
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/12.1.1/../../../../include/c++/12.1.1/x86_64-pc-linux-gnu/bits/c++config.h:96:19: note: expanded from macro '_GLIBCXX_DEPRECATED_SUGGEST'
__attribute__ ((__deprecated__ ("use '" ALT "' instead")))
^
It complains about the use of std::result_of, which is deprecated in
C++17 and removed in C++20:
https://en.cppreference.com/w/cpp/types/result_of
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++ >= 17 and std::result_of otherwise. This way, it will be easy
to remove the wrapper in the future, just replace gdb:: with std::.
Tested by building with gcc 12 in -std=c++11 and -std=c++17 mode, and
clang in -std=c++17 mode (I did not test fully with clang in -std=c++11
mode because there are other unrelated issues).
Change-Id: I50debde0a3307a7bc67fcf8fceefda51860efc1d
---
gdbsupport/function-view.h | 3 ++-
gdbsupport/invoke-result.h | 37 +++++++++++++++++++++++++++++++++++++
gdbsupport/parallel-for.h | 10 +++++-----
3 files changed, 44 insertions(+), 6 deletions(-)
create mode 100644 gdbsupport/invoke-result.h
diff --git a/gdbsupport/function-view.h b/gdbsupport/function-view.h
index 9f8a8680cf40..cc2cdc347dac 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. */
+#include "invoke-result.h"
namespace gdb {
namespace fv_detail {
@@ -229,7 +230,7 @@ class function_view<Res (Args...)>
/* True if Func can be called with Args, and either the result is
Res, convertible to Res or Res is void. */
template<typename Callable,
- typename Res2 = typename std::result_of<Callable &(Args...)>::type>
+ typename Res2 = typename gdb::invoke_result<Callable &, Args...>::type>
struct IsCompatibleCallable : CompatibleReturnType<Res2, Res>
{};
diff --git a/gdbsupport/invoke-result.h b/gdbsupport/invoke-result.h
new file mode 100644
index 000000000000..5d5ffa0657cc
--- /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 <http://www.gnu.org/licenses/>. */
+
+#ifndef GDBSUPPORT_INVOKE_RESULT_H
+#define GDBSUPPORT_INVOKE_RESULT_H
+
+#include <type_traits>
+
+namespace gdb
+{
+#if __cplusplus >= 201703L
+template<typename Callable, class... Args>
+using invoke_result = std::invoke_result<Callable, Args...>;
+#else
+template<typename Callable, typename... Args>
+using invoke_result = std::result_of<Callable (Args...)>;
+#endif
+
+} /* namespace gdb */
+
+#endif /* GDBSUPPORT_INVOKE_RESULT_H */
diff --git a/gdbsupport/parallel-for.h b/gdbsupport/parallel-for.h
index 4cd1dbf847e9..acd9137efbd5 100644
--- a/gdbsupport/parallel-for.h
+++ b/gdbsupport/parallel-for.h
@@ -22,6 +22,7 @@
#include <algorithm>
#include <type_traits>
+#include "gdbsupport/invoke-result.h"
#include "gdbsupport/thread-pool.h"
#include "gdbsupport/function-view.h"
@@ -132,14 +133,14 @@ struct par_for_accumulator<void>
template<class RandomIt, class RangeFunction>
typename gdb::detail::par_for_accumulator<
- typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type
+ typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type
>::result_type
parallel_for_each (unsigned n, RandomIt first, RandomIt last,
RangeFunction callback,
gdb::function_view<size_t(RandomIt)> task_size = nullptr)
{
using result_type
- = typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type;
+ = typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type;
/* 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, RandomIt last,
template<class RandomIt, class RangeFunction>
typename gdb::detail::par_for_accumulator<
- typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type
+ typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type
>::result_type
sequential_for_each (unsigned n, RandomIt first, RandomIt last,
RangeFunction callback,
gdb::function_view<size_t(RandomIt)> task_size = nullptr)
{
- using result_type
- = typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type;
+ using result_type = typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type;
gdb::detail::par_for_accumulator<result_type> results (0);
base-commit: 834113203876a0815fdea45b98b7f52c743f4c0e
--
2.37.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] gdbsupport: add wrapper around result_of and invoke_result
2022-08-26 15:57 [PATCH] gdbsupport: add wrapper around result_of and invoke_result Simon Marchi via Gdb-patches
@ 2022-08-26 15:59 ` Simon Marchi via Gdb-patches
2022-08-30 17:42 ` Tom Tromey
1 sibling, 0 replies; 4+ messages in thread
From: Simon Marchi via Gdb-patches @ 2022-08-26 15:59 UTC (permalink / raw)
To: gdb-patches
> diff --git a/gdbsupport/function-view.h b/gdbsupport/function-view.h
> index 9f8a8680cf40..cc2cdc347dac 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. */
>
> +#include "invoke-result.h"
> namespace gdb {
I am missing an empty line above, I fixed it locally.
Simon
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] gdbsupport: add wrapper around result_of and invoke_result
2022-08-26 15:57 [PATCH] gdbsupport: add wrapper around result_of and invoke_result Simon Marchi via Gdb-patches
2022-08-26 15:59 ` Simon Marchi via Gdb-patches
@ 2022-08-30 17:42 ` Tom Tromey
2022-08-30 18:44 ` Simon Marchi via Gdb-patches
1 sibling, 1 reply; 4+ messages in thread
From: Tom Tromey @ 2022-08-30 17:42 UTC (permalink / raw)
To: Simon Marchi via Gdb-patches
>>>>> "Simon" == Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> writes:
Simon> It complains about the use of std::result_of, which is deprecated in
Simon> C++17 and removed in C++20:
Simon> https://en.cppreference.com/w/cpp/types/result_of
Simon> Given we'll have to transition to std::invoke_result eventually, make a
Simon> GDB wrapper to mimimc std::invoke_result, which uses std::invoke_result
Simon> for C++ >= 17 and std::result_of otherwise. This way, it will be easy
Simon> to remove the wrapper in the future, just replace gdb:: with std::.
This seems fine to me. Thanks.
Tom
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] gdbsupport: add wrapper around result_of and invoke_result
2022-08-30 17:42 ` Tom Tromey
@ 2022-08-30 18:44 ` Simon Marchi via Gdb-patches
0 siblings, 0 replies; 4+ messages in thread
From: Simon Marchi via Gdb-patches @ 2022-08-30 18:44 UTC (permalink / raw)
To: Tom Tromey, Simon Marchi via Gdb-patches
On 2022-08-30 13:42, Tom Tromey wrote:
>>>>>> "Simon" == Simon Marchi via Gdb-patches <gdb-patches@sourceware.org> writes:
>
> Simon> It complains about the use of std::result_of, which is deprecated in
> Simon> C++17 and removed in C++20:
>
> Simon> https://en.cppreference.com/w/cpp/types/result_of
>
> Simon> Given we'll have to transition to std::invoke_result eventually, make a
> Simon> GDB wrapper to mimimc std::invoke_result, which uses std::invoke_result
> Simon> for C++ >= 17 and std::result_of otherwise. This way, it will be easy
> Simon> to remove the wrapper in the future, just replace gdb:: with std::.
>
> This seems fine to me. Thanks.
>
> Tom
Thanks, pushed.
Simon
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-08-30 18:45 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-26 15:57 [PATCH] gdbsupport: add wrapper around result_of and invoke_result Simon Marchi via Gdb-patches
2022-08-26 15:59 ` Simon Marchi via Gdb-patches
2022-08-30 17:42 ` Tom Tromey
2022-08-30 18:44 ` Simon Marchi via Gdb-patches
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox