mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-16 06:28:03 +08:00
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
This commit is contained in:
@ -192,6 +192,7 @@
|
|||||||
You can find unit tests covering the whole API in
|
You can find unit tests covering the whole API in
|
||||||
unittests/function-view-selftests.c. */
|
unittests/function-view-selftests.c. */
|
||||||
|
|
||||||
|
#include "invoke-result.h"
|
||||||
namespace gdb {
|
namespace gdb {
|
||||||
|
|
||||||
namespace fv_detail {
|
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
|
/* True if Func can be called with Args, and either the result is
|
||||||
Res, convertible to Res or Res is void. */
|
Res, convertible to Res or Res is void. */
|
||||||
template<typename Callable,
|
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>
|
struct IsCompatibleCallable : CompatibleReturnType<Res2, Res>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
37
gdbsupport/invoke-result.h
Normal file
37
gdbsupport/invoke-result.h
Normal file
@ -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 */
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include "gdbsupport/invoke-result.h"
|
||||||
#include "gdbsupport/thread-pool.h"
|
#include "gdbsupport/thread-pool.h"
|
||||||
#include "gdbsupport/function-view.h"
|
#include "gdbsupport/function-view.h"
|
||||||
|
|
||||||
@ -132,14 +133,14 @@ private:
|
|||||||
|
|
||||||
template<class RandomIt, class RangeFunction>
|
template<class RandomIt, class RangeFunction>
|
||||||
typename gdb::detail::par_for_accumulator<
|
typename gdb::detail::par_for_accumulator<
|
||||||
typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type
|
typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type
|
||||||
>::result_type
|
>::result_type
|
||||||
parallel_for_each (unsigned n, RandomIt first, RandomIt last,
|
parallel_for_each (unsigned n, RandomIt first, RandomIt last,
|
||||||
RangeFunction callback,
|
RangeFunction callback,
|
||||||
gdb::function_view<size_t(RandomIt)> task_size = nullptr)
|
gdb::function_view<size_t(RandomIt)> task_size = nullptr)
|
||||||
{
|
{
|
||||||
using result_type
|
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
|
/* If enabled, print debug info about how the work is distributed across
|
||||||
the threads. */
|
the threads. */
|
||||||
@ -276,14 +277,13 @@ parallel_for_each (unsigned n, RandomIt first, RandomIt last,
|
|||||||
|
|
||||||
template<class RandomIt, class RangeFunction>
|
template<class RandomIt, class RangeFunction>
|
||||||
typename gdb::detail::par_for_accumulator<
|
typename gdb::detail::par_for_accumulator<
|
||||||
typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type
|
typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type
|
||||||
>::result_type
|
>::result_type
|
||||||
sequential_for_each (unsigned n, RandomIt first, RandomIt last,
|
sequential_for_each (unsigned n, RandomIt first, RandomIt last,
|
||||||
RangeFunction callback,
|
RangeFunction callback,
|
||||||
gdb::function_view<size_t(RandomIt)> task_size = nullptr)
|
gdb::function_view<size_t(RandomIt)> task_size = nullptr)
|
||||||
{
|
{
|
||||||
using result_type
|
using result_type = typename gdb::invoke_result<RangeFunction, RandomIt, RandomIt>::type;
|
||||||
= typename std::result_of<RangeFunction (RandomIt, RandomIt)>::type;
|
|
||||||
|
|
||||||
gdb::detail::par_for_accumulator<result_type> results (0);
|
gdb::detail::par_for_accumulator<result_type> results (0);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user