diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2022-08-26 11:57:54 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2022-08-30 14:43:26 -0400 |
commit | c95dd24e796615b9f41e8821137fc088049eef92 (patch) | |
tree | 64a89c800ae0827da9bb7e696d6df8c84d7ffbe3 /gdbsupport | |
parent | 2d83dd693901cb2588517d7296f1360d902c89f7 (diff) | |
download | gdb-c95dd24e796615b9f41e8821137fc088049eef92.zip gdb-c95dd24e796615b9f41e8821137fc088049eef92.tar.gz gdb-c95dd24e796615b9f41e8821137fc088049eef92.tar.bz2 |
gdbsupport: add wrapper around result_of and invoke_result
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
Diffstat (limited to 'gdbsupport')
-rw-r--r-- | gdbsupport/function-view.h | 3 | ||||
-rw-r--r-- | gdbsupport/invoke-result.h | 37 | ||||
-rw-r--r-- | 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 9f8a868..cc2cdc3 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 0000000..5d5ffa0 --- /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 4cd1dbf..acd9137 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 @@ private: 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); |