aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/whatis.c
diff options
context:
space:
mode:
authorAndrew Burgess <andrew.burgess@embecosm.com>2016-05-24 16:17:52 +0100
committerAndrew Burgess <andrew.burgess@embecosm.com>2016-05-27 13:06:25 +0100
commitac775bf4d35b7a2d5715e0ccf3d648d4670213fd (patch)
tree2a194c3e19f7e27d8fd9fb9ae6a3c130f9eb0dca /gdb/testsuite/gdb.base/whatis.c
parent9d07ebe108f4e11508e350eaf2ba10d7480636fa (diff)
downloadgdb-ac775bf4d35b7a2d5715e0ccf3d648d4670213fd.zip
gdb-ac775bf4d35b7a2d5715e0ccf3d648d4670213fd.tar.gz
gdb-ac775bf4d35b7a2d5715e0ccf3d648d4670213fd.tar.bz2
gdb: Forward VALUE_LVAL when avoiding side effects for STRUCTOP_PTR
Assume that we have a C program like this: struct foo_type { int var; } foo; struct foo_type *foo_ptr = &foo; int main () { return foo_ptr->var; } Then GDB should be able to evaluate the following, however, it currently does not: (gdb) start ... (gdb) whatis &(foo_ptr->var) Attempt to take address of value not located in memory. The problem is that in EVAL_AVOID_SIDE_EFFECTS mode, eval.c:evaluate_subexp_standard always returns a not_lval value as the result for a STRUCTOP_PTR operation. As a consequence, the rest of the code believes that one cannot take the address of the returned value. This patch fixes STRUCTOP_PTR handling so that the VALUE_LVAL attribute for the returned value is properly initialized. After this change, the above session becomes: (gdb) start ... (gdb) whatis &(foo_ptr->var) type = int * This commit is largely the same as commit 2520f728b710 (Forward VALUE_LVAL when avoiding side effects for STRUCTOP_STRUCT) but applied to STRUCTOP_PTR rather than STRUCTOP_STRUCT. Both of these commits are building on top of commit ac1ca910d74d (Fixes for PR exp/15364). gdb/ChangeLog: * eval.c (evaluate_subexp_standard): If EVAL_AVOID_SIDE_EFFECTS mode, forward the VALUE_LVAL attribute to the returned value in the STRUCTOP_PTR case. gdb/testsuite/ChangeLog: * gdb.base/whatis.c: Extend the test case. * gdb.base/whatis.exp: Add additional tests.
Diffstat (limited to 'gdb/testsuite/gdb.base/whatis.c')
-rw-r--r--gdb/testsuite/gdb.base/whatis.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/gdb/testsuite/gdb.base/whatis.c b/gdb/testsuite/gdb.base/whatis.c
index d60afa2..e5cfa51 100644
--- a/gdb/testsuite/gdb.base/whatis.c
+++ b/gdb/testsuite/gdb.base/whatis.c
@@ -135,7 +135,7 @@ struct t_struct {
#endif
float v_float_member;
double v_double_member;
-} v_struct1;
+} v_struct1, *v_struct_ptr1;
struct {
char v_char_member;
@@ -147,7 +147,7 @@ struct {
#endif
float v_float_member;
double v_double_member;
-} v_struct2;
+} v_struct2, *v_struct_ptr2;
/**** unions *******/
@@ -161,7 +161,7 @@ union t_union {
#endif
float v_float_member;
double v_double_member;
-} v_union;
+} v_union, *v_union_ptr;
union {
char v_char_member;
@@ -173,7 +173,7 @@ union {
#endif
float v_float_member;
double v_double_member;
-} v_union2;
+} v_union2, *v_union_ptr2;
/*** Functions returning type ********/