aboutsummaryrefslogtreecommitdiff
path: root/gdb/infcall.c
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2021-06-23 22:55:16 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2021-06-25 20:43:07 +0100
commitd038ce48f1adebd6917a1cfb595efd6f93d613ff (patch)
tree0e6bc55b4a44a03afe3a68531339c41289b823fb /gdb/infcall.c
parent158cc4feb72a471dd4478766e711326b0e97f3b6 (diff)
downloadfsf-binutils-gdb-d038ce48f1adebd6917a1cfb595efd6f93d613ff.zip
fsf-binutils-gdb-d038ce48f1adebd6917a1cfb595efd6f93d613ff.tar.gz
fsf-binutils-gdb-d038ce48f1adebd6917a1cfb595efd6f93d613ff.tar.bz2
gdb: fix invalid arg coercion when calling static member functions
In this commit: commit 7022349d5c86bae74b49225515f42d2e221bd368 Date: Mon Sep 4 20:21:13 2017 +0100 Stop assuming no-debug-info functions return int A new if case was added to call_function_by_hand_dummy to decide if a function should be considered prototyped or not. Previously the code was structured like this: if (COND_1) ACTION_1 else if (COND_2) ACTION_2 else ACTION_3 With the new block the code now looks like this: if (COND_1) ACTION_1 if (NEW_COND) NEW_ACTION else if (COND_2) ACTION_2 else ACTION_3 Notice the new block was added as and 'if' not 'else if'. I'm running into a case where GDB executes ACTION_1 and then ACTION_2. Prior to the above commit GDB would only have executed ACTION_1. The actions in the code in question are trying to figure out if a function should be considered prototyped or not. When a function is not prototyped some arguments will be coerced, e.g. floats to doubles. The COND_1 / ACTION_1 are a very broad, any member function should be considered prototyped, however, after the above patch GDB is now executing the later ACTION_2 which checks to see if the function's type has the 'prototyped' flag set - this is not the case for the member functions I'm testing, and so GDB treats the function as unprototyped and casts the float argument to a double. I believe that adding the new check as 'if' rather than 'else if' was a mistake, and so in this commit I add in the missing 'else'. gdb/ChangeLog: * infcall.c (call_function_by_hand_dummy): Add missing 'else' when setting prototyped flag. gdb/testsuite/ChangeLog: * gdb.cp/method-call-in-c.cc (struct foo_type): Add static member function static_method. (global_var): New global. (main): Use new static_method to ensure it is compiled in. * gdb.cp/method-call-in-c.exp: Test calls to static member function.
Diffstat (limited to 'gdb/infcall.c')
-rw-r--r--gdb/infcall.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/gdb/infcall.c b/gdb/infcall.c
index ca3347f..40298fb 100644
--- a/gdb/infcall.c
+++ b/gdb/infcall.c
@@ -1026,8 +1026,8 @@ call_function_by_hand_dummy (struct value *function,
prototyped. Can we respect TYPE_VARARGS? Probably not. */
if (ftype->code () == TYPE_CODE_METHOD)
prototyped = 1;
- if (TYPE_TARGET_TYPE (ftype) == NULL && ftype->num_fields () == 0
- && default_return_type != NULL)
+ else if (TYPE_TARGET_TYPE (ftype) == NULL && ftype->num_fields () == 0
+ && default_return_type != NULL)
{
/* Calling a no-debug function with the return type
explicitly cast. Assume the function is prototyped,