mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
4dfef5be68
As follow-up to this discussion: https://sourceware.org/pipermail/gdb-patches/2020-August/171385.html ... make runto_main not pass no-message to runto. This means that if we fail to run to main, for some reason, we'll emit a FAIL. This is the behavior we want the majority of (if not all) the time. Without this, we rely on tests logging a failure if runto_main fails, otherwise. They do so in a very inconsisteny mannet, sometimes using "fail", "unsupported" or "untested". The messages also vary widly. This patch removes all these messages as well. Also, remove a few "fail" where we call runto (and not runto_main). by default (without an explicit no-message argument), runto prints a failure already. In two places, gdb.multi/multi-re-run.exp and gdb.python/py-pp-registration.exp, remove "message" passed to runto. This removes a few PASSes that we don't care about (but FAILs will still be printed if we fail to run to where we want to). This aligns their behavior with the rest of the testsuite. Change-Id: Ib763c98c5f4fb6898886b635210d7c34bd4b9023
273 lines
9.1 KiB
Plaintext
273 lines
9.1 KiB
Plaintext
# Copyright 2012-2021 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/>.
|
|
|
|
# Tests for linespec errors with C and C++.
|
|
|
|
# The test proper. LANG is either C or C++.
|
|
|
|
proc do_test {lang} {
|
|
global testfile srcfile error_messages compiler_info
|
|
|
|
standard_testfile
|
|
set exefile $testfile
|
|
if [info exists compiler_info] {
|
|
# Unsetting compiler_info allows us to switch compilers
|
|
# used by prepare_for_testing.
|
|
unset compiler_info
|
|
}
|
|
set options {debug}
|
|
|
|
if {$lang == "C++"} {
|
|
if {[skip_cplus_tests]} {
|
|
return 0
|
|
}
|
|
# Build ".c" source file with g++.
|
|
lappend options "c++"
|
|
}
|
|
|
|
if {[prepare_for_testing "failed to prepare" $exefile $srcfile $options]} {
|
|
return -1
|
|
}
|
|
|
|
# Turn off the pending breakpoint queries.
|
|
gdb_test_no_output "set breakpoint pending off"
|
|
|
|
# Turn off completion limiting
|
|
gdb_test_no_output "set max-completions unlimited"
|
|
|
|
if {![runto_main]} {
|
|
return 0
|
|
}
|
|
|
|
# Run to a location in the file.
|
|
set bp_location [gdb_get_line_number "set breakpoint here"]
|
|
|
|
gdb_test "break $srcfile:$bp_location" \
|
|
"Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \
|
|
"breakpoint line number in file"
|
|
|
|
gdb_continue_to_breakpoint "$bp_location"
|
|
|
|
# Common error message format strings.
|
|
array set error_messages {
|
|
invalid_file "No source file named %s."
|
|
invalid_function "Function \"%s\" not defined."
|
|
invalid_var_or_func
|
|
"Undefined convenience variable or function \"%s\" not defined."
|
|
invalid_function_f "Function \"%s\" not defined in \"%s\"."
|
|
invalid_var_or_func_f \
|
|
"Undefined convenience variable or function \"%s\" not defined in \"%s\"."
|
|
invalid_label "No label \"%s\" defined in function \"%s\"."
|
|
invalid_parm "invalid linespec argument, \"%s\""
|
|
invalid_offset "No line %d in the current file."
|
|
invalid_offset_f "No line %d in file \"%s\"."
|
|
malformed_line_offset "malformed line offset: \"%s\""
|
|
source_incomplete \
|
|
"Source filename requires function, label, or line offset."
|
|
unexpected "malformed linespec error: unexpected %s"
|
|
unexpected_opt "malformed linespec error: unexpected %s, \"%s\""
|
|
unmatched_quote "unmatched quote"
|
|
garbage "Garbage '%s' at end of command"
|
|
}
|
|
|
|
# We intentionally do not use gdb_breakpoint for these tests.
|
|
|
|
# Break at 'linespec' and expect the message in ::error_messages
|
|
# indexed by msg_id with the associated args.
|
|
proc test_break {linespec msg_id args} {
|
|
global error_messages
|
|
|
|
gdb_test "break $linespec" [string_to_regexp \
|
|
[eval format \$error_messages($msg_id) \
|
|
$args]] \
|
|
"'break $linespec'"
|
|
}
|
|
|
|
# Some commonly used whitespace tests around ':'.
|
|
set spaces [list \
|
|
":" \
|
|
": " \
|
|
" :" \
|
|
" : " \
|
|
" : " \
|
|
]
|
|
|
|
# A list of invalid offsets.
|
|
set invalid_offsets [list -100 +500 1000]
|
|
|
|
# Try some simple, invalid linespecs involving spaces.
|
|
foreach x $spaces {
|
|
test_break $x unexpected "colon"
|
|
}
|
|
|
|
# Test invalid filespecs starting with offset. This is done
|
|
# first so that default offsets are tested.
|
|
foreach x $invalid_offsets {
|
|
set offset $x
|
|
|
|
# Relative offsets are relative to the current line. Adjust
|
|
# expected offset from error message accordingly.
|
|
if {[string index $x 0] == "+" || [string index $x 0] == "-"} {
|
|
incr offset $bp_location
|
|
}
|
|
test_break $x invalid_offset $offset
|
|
test_break "-line $x" invalid_offset $offset
|
|
}
|
|
|
|
# Test offsets with trailing tokens w/ and w/o spaces.
|
|
foreach x $spaces {
|
|
test_break "3$x" unexpected "colon"
|
|
test_break "+10$x" unexpected "colon"
|
|
test_break "-10$x" unexpected "colon"
|
|
}
|
|
|
|
foreach x {1 +1 +100 -10} {
|
|
test_break "3 $x" unexpected_opt "number" $x
|
|
test_break "-line 3 $x" garbage $x
|
|
test_break "+10 $x" unexpected_opt "number" $x
|
|
test_break "-line +10 $x" garbage $x
|
|
test_break "-10 $x" unexpected_opt "number" $x
|
|
test_break "-line -10 $x" garbage $x
|
|
}
|
|
|
|
foreach x {3 +10 -10} {
|
|
test_break "$x foo" unexpected_opt "string" "foo"
|
|
test_break "-line $x foo" garbage "foo"
|
|
}
|
|
|
|
# Test invalid linespecs starting with filename.
|
|
# It's OK to use the ".c" extension for the C++ test
|
|
# since the extension doesn't affect GDB's lookup.
|
|
set invalid_files [list "this_file_doesn't_exist.c" \
|
|
"this file has spaces.c" \
|
|
"\"file::colons.c\"" \
|
|
"'file::colons.c'" \
|
|
"\"this \"file\" has quotes.c\"" \
|
|
"'this \"file\" has quotes.c'" \
|
|
"'this 'file' has quotes.c'" \
|
|
"\"this 'file' has quotes.c\"" \
|
|
"\"spaces: and :colons.c\"" \
|
|
"'more: :spaces: :and colons::.c'" \
|
|
"C:/nonexist-with-windrive.c"]
|
|
|
|
foreach x $invalid_files {
|
|
# Remove any quoting from FILENAME for the error message.
|
|
test_break "$x:3" invalid_file [string trim $x \"']
|
|
}
|
|
foreach x [list "this_file_doesn't_exist.c" \
|
|
"file::colons.c" \
|
|
"'file::colons.c'"] {
|
|
test_break "-source $x -line 3" invalid_file [string trim $x \"']
|
|
}
|
|
|
|
# Test that option lexing stops at whitespace boundaries, except
|
|
# when lexing function names, where we want to handle setting
|
|
# breakpoints on e.g., "int template_function<int>()".
|
|
test_break "-source this file has spaces.c -line 3" source_incomplete
|
|
test_break "-function ret_type tmpl_function" \
|
|
invalid_function "ret_type tmpl_function"
|
|
test_break "-source $srcfile -function ret_type tmpl_function" \
|
|
invalid_function_f "ret_type tmpl_function" $srcfile
|
|
|
|
test_break "-function main -label label whitespace" \
|
|
invalid_label "label" "main"
|
|
|
|
# Test unmatched quotes.
|
|
foreach x {"\"src-file.c'" "'src-file.c"} {
|
|
test_break "$x:3" unmatched_quote
|
|
}
|
|
|
|
test_break $srcfile invalid_function $srcfile
|
|
foreach x {"foo" " foo" " foo "} {
|
|
# Trim any leading/trailing whitespace for error messages.
|
|
test_break "$srcfile:$x" invalid_function_f [string trim $x] $srcfile
|
|
test_break "-source $srcfile -function $x" \
|
|
invalid_function_f [string trim $x] $srcfile
|
|
test_break "$srcfile:main:$x" invalid_label [string trim $x] "main"
|
|
test_break "-source $srcfile -function main -label $x" \
|
|
invalid_label [string trim $x] "main"
|
|
}
|
|
|
|
foreach x $spaces {
|
|
test_break "$srcfile$x" unexpected "end of input"
|
|
test_break "$srcfile:main$x" unexpected "end of input"
|
|
}
|
|
|
|
test_break "${srcfile}::" invalid_function "${srcfile}::"
|
|
test_break "$srcfile:3 1" unexpected_opt "number" "1"
|
|
test_break "-source $srcfile -line 3 1" garbage "1"
|
|
test_break "$srcfile:3 +100" unexpected_opt "number" "+100"
|
|
test_break "-source $srcfile -line 3 +100" garbage "+100"
|
|
test_break "$srcfile:3 -100" unexpected_opt "number" "-100"
|
|
test_break "$srcfile:3 foo" unexpected_opt "string" "foo"
|
|
test_break "-source $srcfile -line 3 foo" garbage "foo"
|
|
|
|
foreach x $invalid_offsets {
|
|
test_break "$srcfile:$x" invalid_offset_f $x $srcfile
|
|
test_break "\"$srcfile:$x\"" invalid_offset_f $x $srcfile
|
|
test_break "'$srcfile:$x'" invalid_offset_f $x $srcfile
|
|
test_break "-source $srcfile -line $x" invalid_offset_f $x $srcfile
|
|
}
|
|
test_break "-source $srcfile -line -x" malformed_line_offset "-x"
|
|
|
|
# Test invalid filespecs starting with function.
|
|
foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \
|
|
"foo 0" "foo +10" "foo -10" "foo +100" "foo -100"} {
|
|
test_break $x invalid_function $x
|
|
test_break "-function \"$x\"" invalid_function $x
|
|
}
|
|
|
|
foreach x $spaces {
|
|
test_break "main${x}there" invalid_label "there" "main"
|
|
test_break "main:here${x}" unexpected "end of input"
|
|
}
|
|
|
|
foreach_with_prefix x {"3" "+100" "-100" "foo"} {
|
|
test_break "main 3" invalid_function "main 3"
|
|
test_break "-function \"main $x\"" invalid_function "main $x"
|
|
if {$x == "foo"} {
|
|
test_break "main:here $x" unexpected_opt "string" $x
|
|
} else {
|
|
test_break "main:here $x" unexpected_opt "number" $x
|
|
}
|
|
|
|
test_break "-function main -label \"here $x\"" \
|
|
invalid_label "here $x" "main"
|
|
}
|
|
|
|
foreach x {"if" "task" "thread"} {
|
|
test_break $x invalid_function $x
|
|
}
|
|
|
|
test_break "'main.c'flubber" unexpected_opt "string" "flubber"
|
|
test_break "'main.c',21" invalid_function "main.c"
|
|
test_break "'main.c' " invalid_function "main.c"
|
|
test_break "'main.c'3" unexpected_opt "number" "3"
|
|
test_break "'main.c'+3" unexpected_opt "number" "+3"
|
|
|
|
# Test undefined convenience variables.
|
|
set x {$zippo}
|
|
test_break $x invalid_var_or_func $x
|
|
test_break "$srcfile:$x" invalid_var_or_func_f $x $srcfile
|
|
|
|
# Explicit linespec-specific tests
|
|
test_break "-source $srcfile" source_incomplete
|
|
test_break "-source $srcfile main" source_incomplete
|
|
}
|
|
|
|
foreach_with_prefix lang {"C" "C++"} {
|
|
do_test ${lang}
|
|
}
|