]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
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)
committerSanimir Agovic <sanimir.agovic@intel.com>
Fri, 11 Apr 2014 12:43:55 +0000 (13:43 +0100)
commit3bce82377f683870cc89925ff43aefb7dcce4a77
treea085e16104071c342a6678d9d0e1e11cb0b4cfff
parent92b09522dc5a93ba4bda3c1c0b3c58264e357c8a
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/whatsis still do not allow any sideeffects.

This patch was motivated by:

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

* 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/gdb.base/

* vla-sideeffect.c: New file.
* 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]