public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdbsupport: add wrapper around result_of and invoke_result
@ 2022-08-30 18:44 Simon Marchi
  0 siblings, 0 replies; only message in thread
From: Simon Marchi @ 2022-08-30 18:44 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c95dd24e796615b9f41e8821137fc088049eef92

commit c95dd24e796615b9f41e8821137fc088049eef92
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Fri Aug 26 11:57:54 2022 -0400

    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

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.  */
 
+#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 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 <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 4cd1dbf847e..acd9137efbd 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);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-08-30 18:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-30 18:44 [binutils-gdb] gdbsupport: add wrapper around result_of and invoke_result Simon Marchi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).