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:
Simon Marchi
2022-08-26 11:57:54 -04:00
parent 2d83dd6939
commit c95dd24e79
3 changed files with 44 additions and 6 deletions

View File

@ -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);