From c1d21880e981f3f890a74cd9d133e82b26c32818 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 29 Sep 2023 22:36:23 -0400 Subject: [PATCH] gdb: make interps_notify work with references MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 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 Reviewed-By: Reviewed-By: Lancelot Six --- 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 +template 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)...); } } -- 2.30.2