aboutsummaryrefslogtreecommitdiff
path: root/gdb/valops.c
diff options
context:
space:
mode:
authorHannes Domani <ssbssa@yahoo.de>2021-11-14 16:19:31 +0100
committerHannes Domani <ssbssa@yahoo.de>2023-12-14 16:18:25 +0100
commit1d2f86b6b74e6caae77951353a4c353ce9816374 (patch)
tree18726cba53da75f6b9d1d4fba100dd7071c5f59a /gdb/valops.c
parent8cb16b68584e14aade8de166c75e1d85e38507bd (diff)
downloadbinutils-1d2f86b6b74e6caae77951353a4c353ce9816374.zip
binutils-1d2f86b6b74e6caae77951353a4c353ce9816374.tar.gz
binutils-1d2f86b6b74e6caae77951353a4c353ce9816374.tar.bz2
Allow calling of variadic C++ functions
Currently, it's not possible to call a variadic C++ function: ``` (gdb) print sum_vararg_int(1, 10) Cannot resolve function sum_vararg_int to any overloaded instance (gdb) print sum_vararg_int(2, 20, 30) Cannot resolve function sum_vararg_int to any overloaded instance ``` It's because all additional arguments get the TOO_FEW_PARAMS_BADNESS rank by rank_function, which disqualifies the function. To fix this, I've created the new VARARG_BADNESS rank, which is used only for additional arguments of variadic functions, allowing them to be called: ``` (gdb) print sum_vararg_int(1, 10) $1 = 10 (gdb) print sum_vararg_int(2, 20, 30) $2 = 50 ``` Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28589 Approved-By: Tom Tromey <tom@tromey.com>
Diffstat (limited to 'gdb/valops.c')
-rw-r--r--gdb/valops.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gdb/valops.c b/gdb/valops.c
index 49ea1fd..a15c92b 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -3226,6 +3226,7 @@ find_oload_champ (gdb::array_view<value *> args,
{
int jj;
int static_offset = 0;
+ bool varargs = false;
std::vector<type *> parm_types;
if (xmethods != NULL)
@@ -3238,9 +3239,13 @@ find_oload_champ (gdb::array_view<value *> args,
{
nparms = TYPE_FN_FIELD_TYPE (methods, ix)->num_fields ();
static_offset = oload_method_static_p (methods, ix);
+ varargs = TYPE_FN_FIELD_TYPE (methods, ix)->has_varargs ();
}
else
- nparms = functions[ix]->type ()->num_fields ();
+ {
+ nparms = functions[ix]->type ()->num_fields ();
+ varargs = functions[ix]->type ()->has_varargs ();
+ }
parm_types.reserve (nparms);
for (jj = 0; jj < nparms; jj++)
@@ -3255,7 +3260,8 @@ find_oload_champ (gdb::array_view<value *> args,
/* Compare parameter types to supplied argument types. Skip
THIS for static methods. */
bv = rank_function (parm_types,
- args.slice (static_offset));
+ args.slice (static_offset),
+ varargs);
if (overload_debug)
{