aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.linespec/ls-errs.exp
blob: 86056c51b028d9fec044f4ef291365911eca002a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
# Copyright 2012-2014 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 error conditions

standard_testfile
set exefile $testfile

if {[prepare_for_testing $testfile $exefile $srcfile \
	 {debug nowarnings}]} {
    return -1
}

# Turn off the pending breakpoint queries.
gdb_test_no_output "set breakpoint pending off"

# 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]]
}

# 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_offset "No line %d in the current file."
    invalid_offset_f "No line %d in file \"%s\"."
    unexpected "malformed linespec error: unexpected %s"
    unexpected_opt "malformed linespec error: unexpected %s, \"%s\""
    unmatched_quote "unmatched quote"
}

# Some commonly used whitespace tests around ':'.
set spaces [list ":" ": " " :" " : " "\t:  " "  :\t" "\t:\t" " \t:\t " \
		"\t  \t:\t  \t  \t"]

# 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 line 16.  Adjust
    # expected offset from error message accordingly.
    if {[string index $x 0] == "+" ||
	[string index $x 0] == "-"} {
	incr offset 16
    }
    test_break $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 "+10 $x" unexpected_opt "number" $x
    test_break "-10 $x" unexpected_opt "number" $x
}

test_break "3 foo" unexpected_opt "string" "foo"
test_break "+10 foo" unexpected_opt "string" "foo"
test_break "-10 foo" unexpected_opt "string" "foo"

# Test invalid linespecs starting with filename.
foreach x [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'"] {
    # Remove any quoting from FILENAME for the error message.
    test_break "$x:3" invalid_file [string trim $x \"']
}

# 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 "$srcfile:main:$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 "$srcfile:3 +100" unexpected_opt "number" "+100"
test_break "$srcfile:3 -100" unexpected_opt "number" "-100"
test_break "$srcfile:3 foo" unexpected_opt "string" "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 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
}

foreach x $spaces {
    test_break "main${x}there" invalid_label "there" "main"
    if {[test_compiler_info {clang-*-*}]} {  setup_xfail clang/14500 *-*-* }
    test_break "main:here${x}" unexpected "end of input"
}

test_break "main 3" invalid_function "main 3"
test_break "main +100" invalid_function "main +100"
test_break "main -100" invalid_function "main -100"
test_break "main foo" invalid_function "main foo"

foreach x {"3" "+100" "-100" "foo"} {
    test_break "main: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