aboutsummaryrefslogtreecommitdiff
path: root/gdb/eval.c
diff options
context:
space:
mode:
authorSanimir Agovic <sanimir.agovic@intel.com>2013-10-09 15:28:22 +0100
committerJoel Brobecker <brobecker@adacore.com>2014-04-14 09:11:48 -0700
commit4ad88275f81a586e32e86351cc415a97d58ef448 (patch)
tree0dfd1e5cb7622596da1bee79b7148cedcff66fe6 /gdb/eval.c
parent80180f796d366d230822c07a15aa68971abf9d77 (diff)
vla: enable sizeof operator to work with variable length arrays
In C99 the sizeof operator computes the size of a variable length array at runtime (6.5.3.4 The sizeof operator). This patch reflects the semantic change in the debugger. We now are able to get the size of a vla: 1| void foo (size_t n) { 2| int vla[n]; 3| } (gdb) p sizeof(vla) yields N * sizeof(int). gdb/ChangeLog: * eval.c (evaluate_subexp_for_sizeof) <OP_VAR_VALUE>: If the type passed to sizeof is dynamic evaluate the argument to compute the length.
Diffstat (limited to 'gdb/eval.c')
-rw-r--r--gdb/eval.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/gdb/eval.c b/gdb/eval.c
index c1e47e0368..85523cd2fd 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -3040,8 +3040,14 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos)
break;
case OP_VAR_VALUE:
- (*pos) += 4;
type = SYMBOL_TYPE (exp->elts[pc + 2].symbol);
+ if (is_dynamic_type (type))
+ {
+ val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_NORMAL);
+ type = value_type (val);
+ }
+ else
+ (*pos) += 4;
break;
default: