Logical short circuiting with argument lists
authorRichard Bunt <richard.bunt@arm.com>
Wed, 19 Sep 2018 09:43:56 +0000 (10:43 +0100)
committerRichard Bunt <richard.bunt@arm.com>
Wed, 19 Sep 2018 09:43:56 +0000 (10:43 +0100)
commit23be8da7396ffc4d5492d976e244daaa543eaac9
tree937a4d2e683bceb377afdbf8f97eb525651c380a
parent7307a73aed246eaccec9277b11e045f974322796
Logical short circuiting with argument lists

When evaluating Fortran expressions such as the following:

print truth_table(1,1) .OR. truth_table(2,1)

where truth_table(1,1) evaluates to true, the debugger would report that
it could not perform substring operations on this type. This patch
addresses this issue.

Investigation revealed that EVAL_SKIP was not being handled correctly
for all types serviced by the OP_F77_UNDETERMINED_ARGLIST case in
evaluate_subexp_standard. While skipping an undetermined argument list
the type is resolved to be an integer (as this is what evaluate_subexp
returns when skipping) and so it was not possible to delegate to the
appropriate case (e.g. array, function call).

The solution implemented here updates OP_VAR_VALUE to return correct
type information when skipping. This way OP_F77_UNDETERMINED_ARGLIST
can delegate the skipping to the appropriate case or routine, which
should know how to skip/evaluate the type in question.

koenig.exp was updated to include a testcase which exercises the
modified skip logic in OP_VAR_VALUE, as it falls through from
OP_ADL_FUNC.

This patch has been tested for regressions with GCC 7.3 on aarch64,
ppc64le and x86_64.

gdb/ChangeLog:

* eval.c (skip_undetermined_arglist): Skip argument list helper.
(evaluate_subexp_standard): Return a dummy type when
honoring EVAL_SKIP in OP_VAR_VALUE and handle skipping in the
OP_F77_UNDETERMINED_ARGLIST case.
* expression.h (enum noside): Update comment.

gdb/testsuite/ChangeLog:

* gdb.cp/koenig.exp: Extend to test logical short circuiting.
* gdb.fortran/short-circuit-argument-list.exp: New file.
* gdb.fortran/short-circuit-argument-list.f90: New test.
gdb/ChangeLog
gdb/eval.c
gdb/expression.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/koenig.exp
gdb/testsuite/gdb.fortran/short-circuit-argument-list.exp [new file with mode: 0644]
gdb/testsuite/gdb.fortran/short-circuit-argument-list.f90 [new file with mode: 0644]