gdb: fix invalid arg coercion when calling static member functions
In this commit:
commit 7022349d5c
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.
This commit is contained in:
parent
158cc4feb7
commit
d038ce48f1
5 changed files with 28 additions and 2 deletions
|
@ -1,3 +1,8 @@
|
|||
2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* infcall.c (call_function_by_hand_dummy): Add missing 'else' when
|
||||
setting prototyped flag.
|
||||
|
||||
2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* ada-lang.c (desc_bounds): Use '{}' instead of NULL to indicate
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2021-06-25 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
PR gdb/27994
|
||||
|
|
|
@ -35,9 +35,16 @@ struct foo_type
|
|||
return *this;
|
||||
}
|
||||
|
||||
static int static_method (float f, baz_type b)
|
||||
{
|
||||
return b.a + b.b + b.c + (int) f;
|
||||
}
|
||||
|
||||
int var = 120;
|
||||
};
|
||||
|
||||
volatile int global_var;
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
|
@ -48,5 +55,7 @@ main (void)
|
|||
|
||||
foo += b;
|
||||
|
||||
global_var = foo.static_method (f, b);
|
||||
|
||||
return foo.func (b, f); /* Break here. */
|
||||
}
|
||||
|
|
|
@ -43,5 +43,8 @@ foreach_with_prefix lang { c++ c } {
|
|||
set result [expr $result + 3]
|
||||
gdb_test "print foo += b" \
|
||||
" = \\((?:struct )?foo_type &\\) @${hex}: \\\{var = ${result}\\\}"
|
||||
|
||||
gdb_test "print foo.static_method (f, b)" " = 4"
|
||||
gdb_test "print foo_type::static_method (f, b)" " = 4"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue