82d049abf1
GDB treats the identifiers 'if', 'thread', and 'task' unconditionally as expression delimiters in Ada mode, which is correct for 'if' and 'task', but wrong for 'thread' in cases such as print thread Borrowing from c-exp.y, we observe that 'thread' must be followed by numerals, whereas identifiers never are and treat them as delimiters only in that case. In the process, the current also refactors and incidentally fixes the code for rewinding the input to before the delimiting tokens. For example, the code watch expr if i > 2 fails because the input is only rewound to just before the 'i', leaving the 'if' as part of the expression (and thus making the rest look like trailing junk rather than a conditional clause). gdb/ChangeLog: * ada-lex.l (rules): Only recognize 'thread' as a delimiter when followed by numerals, as for c-exp.y. Use new rewind_to_char function to rewind the input for expression-delimiting tokens. (rewind_to_char): New function. gdb/testsuite/ChangeLog: * gdb.ada/expr_delims.exp: New file. * gdb.ada/expr_delims/foo.adb: New file. * gdb.ada/expr_delims/pck.ads: New file. * gdb.ada/expr_delims/pck.adb: New file.
64 lines
2.1 KiB
Text
64 lines
2.1 KiB
Text
# Copyright 2013 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/>.
|
|
|
|
load_lib "ada.exp"
|
|
|
|
standard_ada_testfile foo
|
|
|
|
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
|
|
return -1
|
|
}
|
|
|
|
clean_restart ${testfile}
|
|
|
|
set ws "\[ \t\r\n\]+"
|
|
|
|
# Start the program in order to have some tasks running...
|
|
set bp_location [gdb_get_line_number "STOP_HERE" ${testdir}/foo.adb]
|
|
gdb_test "break foo.adb:$bp_location" \
|
|
"Breakpoint $decimal.*" \
|
|
|
|
gdb_run_cmd
|
|
gdb_test "" "Breakpoint $decimal, foo \\(\\).*"
|
|
gdb_test "continue" \
|
|
"Continuing\\..*Breakpoint $decimal, foo \\(\\).*"
|
|
|
|
# Make sure that "thread" may be used as a variable without being mistaken
|
|
# for an expression delimiter.
|
|
gdb_test "print thread" \
|
|
"= 1" \
|
|
"Print variable 'thread'"
|
|
|
|
gdb_test_no_output "delete 1"
|
|
|
|
gdb_test "watch thread" \
|
|
".*atchpoint \[0-9\]+: thread" \
|
|
"Set plain watchpoint on variable 'thread'"
|
|
|
|
# Make sure that 'if' when followed by an expression beginning
|
|
# with 'i' works.
|
|
gdb_test "watch thread if i = 2" \
|
|
".*atchpoint \[0-9\]+: thread" \
|
|
"Set conditional watchpoint."
|
|
|
|
gdb_test "info break" \
|
|
".*${ws}.*atchpoint${ws}keep${ws}y${ws}thread${ws}.*atchpoint${ws}keep${ws}y${ws}thread${ws}stop only if i = 2" \
|
|
"Check that watchpoint is set correctly."
|
|
|
|
# Check for right error when using both 'if' and 'thread' clauses.
|
|
|
|
gdb_test "break foo.adb:$bp_location if thread = 10 thread 999" \
|
|
".*Unknown thread 999\\." \
|
|
"Combination of 'if' and 'thread' delimiters."
|