public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
From: Simon Marchi <simark@sourceware.org>
To: gdb-cvs@sourceware.org
Subject: [binutils-gdb] gdbsupport: add wrapper around result_of and invoke_result
Date: Tue, 30 Aug 2022 18:44:28 +0000 (GMT)	[thread overview]
Message-ID: <20220830184428.895E4385114F@sourceware.org> (raw)

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

                 reply	other threads:[~2022-08-30 18:44 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220830184428.895E4385114F@sourceware.org \
    --to=simark@sourceware.org \
    --cc=gdb-cvs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).