[binutils-gdb] gdb: make interps_notify work with references

Simon Marchi simark@sourceware.org
Thu Oct 19 15:18:25 GMT 2023


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

commit c1d21880e981f3f890a74cd9d133e82b26c32818
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Fri Sep 29 22:36:23 2023 -0400

    gdb: make interps_notify work with references
    
    A subsequent patch changes the interp::on_solib_loaded and
    interp::on_solib_unloaded methods to take references.  This highlighted
    that interps_notify did not work with reference parameters.
    
    Fix that by changing interps_notify's `args` arg to be a universal
    reference (&&).  Change the type of the method to be auto-deduced as an
    additional template parameter, otherwise the signature of the callback
    function would never match:
    
          CXX    interps.o
        /home/simark/src/binutils-gdb/gdb/interps.c: In function ‘void interps_notify_signal_received(gdb_signal)’:
        /home/simark/src/binutils-gdb/gdb/interps.c:378:18: error: no matching function for call to ‘interps_notify(void (interp::*)(gdb_signal), gdb_signal&)’
          378 |   interps_notify (&interp::on_signal_received, sig);
              |   ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        /home/simark/src/binutils-gdb/gdb/interps.c:363:1: note: candidate: ‘template<class ... Args> void interps_notify(void (interp::*)(Args ...), Args&& ...)’
          363 | interps_notify (void (interp::*method) (Args...), Args&&... args)
              | ^~~~~~~~~~~~~~
        /home/simark/src/binutils-gdb/gdb/interps.c:363:1: note:   template argument deduction/substitution failed:
        /home/simark/src/binutils-gdb/gdb/interps.c:378:18: note:   inconsistent parameter pack deduction with ‘gdb_signal’ and ‘gdb_signal&’
          378 |   interps_notify (&interp::on_signal_received, sig);
              |   ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    Change-Id: I0cd9378e24ef039f30f8e14f054f8d7fb539c838
    Approved-By: Pedro Alves <pedro@palves.net>
    Reviewed-By: Reviewed-By: Lancelot Six <lancelot.six@amd.com>

Diff:
---
 gdb/interps.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/gdb/interps.c b/gdb/interps.c
index f91b2b62c1b..d7d87309536 100644
--- a/gdb/interps.c
+++ b/gdb/interps.c
@@ -358,15 +358,15 @@ current_interpreter (void)
 /* Helper interps_notify_* functions.  Call METHOD on the top-level interpreter
    of all UIs.  */
 
-template <typename ...Args>
+template <typename MethodType, typename ...Args>
 void
-interps_notify (void (interp::*method) (Args...), Args... args)
+interps_notify (MethodType method, Args&&... args)
 {
   SWITCH_THRU_ALL_UIS ()
     {
       interp *tli = top_level_interpreter ();
       if (tli != nullptr)
-	(tli->*method) (args...);
+	(tli->*method) (std::forward<Args> (args)...);
     }
 }


More information about the Gdb-cvs mailing list