mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-10 10:12:21 +08:00

Many test cases had a few lines in the beginning that look like: if { condition } { continue } Where conditions varied, but were mostly in the form of ![runto_main] or [skip_*_tests], making it quite clear that this code block was supposed to finish the test if it entered the code block. This generates TCL errors, as most of these tests are not inside loops. All cases on which this was an obvious mistake are changed in this patch.
140 lines
5.2 KiB
Plaintext
140 lines
5.2 KiB
Plaintext
# Copyright 2018-2022 Free Software Foundation, Inc.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/> .
|
|
|
|
# Test evaluating logical expressions that contain array references, function
|
|
# calls and substring operations that are to be skipped due to short
|
|
# circuiting.
|
|
|
|
if {[skip_fortran_tests]} { return -1 }
|
|
|
|
standard_testfile ".f90"
|
|
|
|
if {[prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug f90}]} {
|
|
return -1
|
|
}
|
|
|
|
if {![runto [gdb_get_line_number "post_truth_table_init"]]} then {
|
|
perror "couldn't run to breakpoint post_truth_table_init"
|
|
return
|
|
}
|
|
|
|
# Non-zero value to use as the function call count base. Using zero is avoided
|
|
# as this is a common value in memory.
|
|
set prime 17
|
|
|
|
# Reset all call counts to the initial value ($prime).
|
|
proc reset_called_flags { } {
|
|
global prime
|
|
foreach counter {no_arg no_arg_false one_arg two_arg array} {
|
|
gdb_test_no_output "set var calls%function_${counter}_called=$prime"
|
|
}
|
|
}
|
|
|
|
reset_called_flags
|
|
|
|
# Vary conditional and input over the standard truth table.
|
|
# Test that the debugger can evaluate expressions of the form
|
|
# a(x,y) .OR./.AND. a(a,b) correctly.
|
|
foreach_with_prefix truth_table_index {1 2 3 4} {
|
|
gdb_test "p truth_table($truth_table_index, 1) .OR. truth_table($truth_table_index, 2)" \
|
|
"[expr $truth_table_index > 1 ? \".TRUE.\" : \".FALSE.\"]"
|
|
}
|
|
|
|
foreach_with_prefix truth_table_index {1 2 3 4} {
|
|
gdb_test "p truth_table($truth_table_index, 1) .AND. truth_table($truth_table_index, 2)" \
|
|
"[expr $truth_table_index > 3 ? \".TRUE.\" : \".FALSE.\"]"
|
|
}
|
|
|
|
# Vary number of function arguments to skip.
|
|
set argument_list ""
|
|
foreach_with_prefix arg {"No" "One" "Two"} {
|
|
set trimmed_args [string trimright $argument_list ,]
|
|
set arg_lower [string tolower $arg]
|
|
gdb_test "p function_no_arg_false() .OR. function_${arg_lower}_arg($trimmed_args)" \
|
|
" = .TRUE."
|
|
reset_called_flags
|
|
gdb_test "p .TRUE. .OR. function_${arg_lower}_arg($trimmed_args)" \
|
|
" = .TRUE."
|
|
# Check that none of the short-circuited functions have been called.
|
|
gdb_test "p calls" \
|
|
" = \\\( function_no_arg_called = $prime, function_no_arg_false_called = $prime, function_one_arg_called = $prime, function_two_arg_called = $prime, function_array_called = $prime \\\)"
|
|
append argument_list " .TRUE.,"
|
|
}
|
|
|
|
with_test_prefix "nested call not skipped" {
|
|
reset_called_flags
|
|
# Check nested calls
|
|
gdb_test "p function_one_arg(.FALSE. .OR. function_no_arg())" \
|
|
" = .TRUE."
|
|
gdb_test "p calls" \
|
|
" = \\\( function_no_arg_called = [expr $prime + 1], function_no_arg_false_called = $prime, function_one_arg_called = [expr $prime + 1], function_two_arg_called = $prime, function_array_called = $prime \\\)"
|
|
}
|
|
|
|
with_test_prefix "nested call skipped" {
|
|
gdb_test "p function_one_arg(.TRUE. .OR. function_no_arg())" \
|
|
" = .TRUE."
|
|
gdb_test "p calls" \
|
|
" = \\\( function_no_arg_called = [expr $prime + 1], function_no_arg_false_called = $prime, function_one_arg_called = [expr $prime + 2], function_two_arg_called = $prime, function_array_called = $prime \\\)"
|
|
}
|
|
|
|
# Vary number of components in the expression to skip.
|
|
set expression "p .TRUE."
|
|
foreach_with_prefix expression_components {1 2 3 4} {
|
|
set expression "$expression .OR. function_one_arg(.TRUE.)"
|
|
gdb_test "$expression" \
|
|
" = .TRUE."
|
|
}
|
|
|
|
# Check parsing skipped substring operations.
|
|
gdb_test "p .TRUE. .OR. binary_string(1)" " = .TRUE."
|
|
|
|
# Check parsing skipped substring operations with ranges. These should all
|
|
# return true as the result is > 0.
|
|
# The second binary_string access is important as an incorrect pos update
|
|
# will not be picked up by a single access.
|
|
foreach_with_prefix range1 {"1:2" ":" ":2" "1:"} {
|
|
foreach_with_prefix range2 {"1:2" ":" ":2" "1:"} {
|
|
gdb_test "p .TRUE. .OR. binary_string($range1) .OR. binary_string($range2)" \
|
|
" = .TRUE."
|
|
}
|
|
}
|
|
|
|
# Skip multi-dimensional arrays with ranges.
|
|
foreach_with_prefix range1 {"1:2" ":" ":2" "1:"} {
|
|
foreach_with_prefix range2 {"1:2" ":" ":2" "1:"} {
|
|
gdb_test "p .TRUE. .OR. binary_string($range1) .OR. truth_table($range2, 1)" \
|
|
" = .TRUE."
|
|
}
|
|
}
|
|
|
|
# Check evaluation of substring operations in logical expressions.
|
|
gdb_test "p .FALSE. .OR. binary_string(1)" " = .FALSE."
|
|
|
|
with_test_prefix "binary string skip" {
|
|
reset_called_flags
|
|
# Function call and substring skip.
|
|
gdb_test "p .TRUE. .OR. function_one_arg(binary_string(1))" \
|
|
" = .TRUE."
|
|
gdb_test "p calls%function_one_arg_called" " = $prime"
|
|
}
|
|
|
|
with_test_prefix "array skip" {
|
|
# Function call and array skip.
|
|
reset_called_flags
|
|
gdb_test "p .TRUE. .OR. function_array(binary_string)" \
|
|
" = .TRUE."
|
|
gdb_test "p calls%function_array_called" " = $prime"
|
|
}
|