vla: evaluate operand of sizeof if its type is a vla
authorSanimir Agovic <sanimir.agovic@intel.com>
Wed, 5 Feb 2014 16:22:08 +0000 (16:22 +0000)
committerJoel Brobecker <brobecker@adacore.com>
Mon, 14 Apr 2014 16:21:46 +0000 (09:21 -0700)
commit5ecaaa66e0d056412ca95b3ac2e385b3e470a95c
tree5c326bf1ef95f79a0b643613eab5774a172ee7e8
parent1612e0c0f973f3defdfb2e74b09ec93f3d819c79
vla: evaluate operand of sizeof if its type is a vla

The c99 standard in "6.5.3.4 The sizeof operator" states:

 If the type of the operand is a variable length array type, the operand
 is evaluated;[...]

This patch mirrors the following c99 semantic in gdb:

 1| int vla[n][m];
 2| int i = 1;
 3| sizeof(vla[i++][0]); // No sideffect
 4| assert (i == 1);
 5| sizeof(vla[i++]);    // With sideffect
 6| assert (i == 2);

Note: ptype/whatis still do not allow any sideeffects.

This patch was motivated by:

  https://sourceware.org/ml/gdb-patches/2014-01/msg00732.html

gdb/ChangeLog:

* eval.c (evaluate_subexp_for_sizeof): Add enum noside argument.
(evaluate_subexp_standard): Pass noside argument.
(evaluate_subexp_for_sizeof) <BINOP_SUBSCRIPT>: Handle subscript case
if noside equals EVAL_NORMAL. If the subscript yields a vla type
re-evaluate subscript operation with EVAL_NORMAL to enable sideffects.
* gdbtypes.c (resolve_dynamic_bounds): Mark bound as evaluated.
* gdbtypes.h (enum range_flags): Add RANGE_EVALUATED case.

testsuite/ChangeLog:

* gdb.base/vla-sideeffect.c: New file.
* gdb.base/vla-sideeffect.exp: New file.
gdb/ChangeLog
gdb/eval.c
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/vla-sideeffect.c [new file with mode: 0644]
gdb/testsuite/gdb.base/vla-sideeffect.exp [new file with mode: 0644]