Commit | Line | Data |
---|---|---|
618f726f | 1 | # Copyright 2012-2016 Free Software Foundation, Inc. |
40e084e1 KS |
2 | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
5 | # the Free Software Foundation; either version 3 of the License, or | |
6 | # (at your option) any later version. | |
7 | # | |
8 | # This program is distributed in the hope that it will be useful, | |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
12 | # | |
13 | # You should have received a copy of the GNU General Public License | |
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
15 | ||
1cafadb4 | 16 | # Tests for linespec errors with C and C++. |
40e084e1 | 17 | |
1cafadb4 | 18 | # The test proper. LANG is either C or C++. |
40e084e1 | 19 | |
1cafadb4 DB |
20 | proc do_test {lang} { |
21 | global testfile srcfile error_messages compiler_info | |
40e084e1 | 22 | |
1cafadb4 DB |
23 | standard_testfile |
24 | set exefile $testfile | |
25 | if [info exists compiler_info] { | |
26 | # Unsetting compiler_info allows us to switch compilers | |
27 | # used by prepare_for_testing. | |
28 | unset compiler_info | |
29 | } | |
30 | set options {debug} | |
31 | ||
32 | if {$lang == "C++"} { | |
33 | if {[skip_cplus_tests]} { | |
34 | return 0 | |
35 | } | |
36 | # Build ".c" source file with g++. | |
37 | lappend options "c++" | |
38 | } | |
40e084e1 | 39 | |
5b362f04 | 40 | if {[prepare_for_testing "failed to prepare" $exefile $srcfile $options]} { |
1cafadb4 DB |
41 | return -1 |
42 | } | |
ef0b411a | 43 | |
1cafadb4 DB |
44 | # Turn off the pending breakpoint queries. |
45 | gdb_test_no_output "set breakpoint pending off" | |
40e084e1 | 46 | |
1cafadb4 DB |
47 | # Turn off completion limiting |
48 | gdb_test_no_output "set max-completions unlimited" | |
40e084e1 | 49 | |
1cafadb4 | 50 | if {![runto_main]} { |
bc6c7af4 | 51 | fail "can't run to main" |
1cafadb4 DB |
52 | return 0 |
53 | } | |
40e084e1 | 54 | |
1cafadb4 DB |
55 | # Run to a location in the file. |
56 | set bp_location [gdb_get_line_number "set breakpoint here"] | |
57 | ||
58 | gdb_test "break $srcfile:$bp_location" \ | |
59 | "Breakpoint.*at.* file .*$srcfile, line $bp_location\\." \ | |
60 | "breakpoint line number in file" | |
61 | ||
62 | gdb_continue_to_breakpoint "$bp_location" | |
63 | ||
64 | # Common error message format strings. | |
65 | array set error_messages { | |
66 | invalid_file "No source file named %s." | |
67 | invalid_function "Function \"%s\" not defined." | |
68 | invalid_var_or_func | |
69 | "Undefined convenience variable or function \"%s\" not defined." | |
70 | invalid_function_f "Function \"%s\" not defined in \"%s\"." | |
71 | invalid_var_or_func_f \ | |
72 | "Undefined convenience variable or function \"%s\" not defined in \"%s\"." | |
73 | invalid_label "No label \"%s\" defined in function \"%s\"." | |
74 | invalid_parm "invalid linespec argument, \"%s\"" | |
75 | invalid_offset "No line %d in the current file." | |
76 | invalid_offset_f "No line %d in file \"%s\"." | |
77 | malformed_line_offset "malformed line offset: \"%s\"" | |
78 | source_incomplete \ | |
79 | "Source filename requires function, label, or line offset." | |
80 | unexpected "malformed linespec error: unexpected %s" | |
81 | unexpected_opt "malformed linespec error: unexpected %s, \"%s\"" | |
82 | unmatched_quote "unmatched quote" | |
83 | garbage "Garbage '%s' at end of command" | |
84 | } | |
40e084e1 | 85 | |
1cafadb4 | 86 | # We intentionally do not use gdb_breakpoint for these tests. |
40e084e1 | 87 | |
1cafadb4 DB |
88 | # Break at 'linespec' and expect the message in ::error_messages |
89 | # indexed by msg_id with the associated args. | |
90 | proc test_break {linespec msg_id args} { | |
91 | global error_messages | |
40e084e1 | 92 | |
1cafadb4 DB |
93 | gdb_test "break $linespec" [string_to_regexp \ |
94 | [eval format \$error_messages($msg_id) \ | |
95 | $args]] | |
96 | } | |
40e084e1 | 97 | |
1cafadb4 DB |
98 | # Some commonly used whitespace tests around ':'. |
99 | set spaces [list ":" ": " " :" " : " "\t: " " :\t" "\t:\t" \ | |
100 | " \t:\t " "\t \t:\t \t \t"] | |
40e084e1 | 101 | |
1cafadb4 DB |
102 | # A list of invalid offsets. |
103 | set invalid_offsets [list -100 +500 1000] | |
40e084e1 | 104 | |
1cafadb4 DB |
105 | # Try some simple, invalid linespecs involving spaces. |
106 | foreach x $spaces { | |
107 | test_break $x unexpected "colon" | |
108 | } | |
40e084e1 | 109 | |
1cafadb4 DB |
110 | # Test invalid filespecs starting with offset. This is done |
111 | # first so that default offsets are tested. | |
112 | foreach x $invalid_offsets { | |
113 | set offset $x | |
114 | ||
115 | # Relative offsets are relative to line 16. Adjust | |
116 | # expected offset from error message accordingly. | |
117 | if {[string index $x 0] == "+" || [string index $x 0] == "-"} { | |
118 | incr offset 24 | |
119 | } | |
120 | test_break $x invalid_offset $offset | |
121 | test_break "-line $x" invalid_offset $offset | |
122 | } | |
40e084e1 | 123 | |
1cafadb4 DB |
124 | # Test offsets with trailing tokens w/ and w/o spaces. |
125 | foreach x $spaces { | |
126 | test_break "3$x" unexpected "colon" | |
127 | test_break "+10$x" unexpected "colon" | |
128 | test_break "-10$x" unexpected "colon" | |
129 | } | |
40e084e1 | 130 | |
1cafadb4 DB |
131 | foreach x {1 +1 +100 -10} { |
132 | test_break "3 $x" unexpected_opt "number" $x | |
133 | test_break "-line 3 $x" garbage $x | |
134 | test_break "+10 $x" unexpected_opt "number" $x | |
135 | test_break "-line +10 $x" garbage $x | |
136 | test_break "-10 $x" unexpected_opt "number" $x | |
137 | test_break "-line -10 $x" garbage $x | |
138 | } | |
87f0e720 | 139 | |
1cafadb4 DB |
140 | foreach x {3 +10 -10} { |
141 | test_break "$x foo" unexpected_opt "string" "foo" | |
142 | test_break "-line $x foo" garbage "foo" | |
143 | } | |
87f0e720 | 144 | |
1cafadb4 DB |
145 | # Test invalid linespecs starting with filename. |
146 | # It's OK to use the ".c" extension for the C++ test | |
147 | # since the extension doesn't affect GDB's lookup. | |
148 | set invalid_files [list "this_file_doesn't_exist.c" \ | |
149 | "this file has spaces.c" \ | |
150 | "\"file::colons.c\"" \ | |
151 | "'file::colons.c'" \ | |
152 | "\"this \"file\" has quotes.c\"" \ | |
153 | "'this \"file\" has quotes.c'" \ | |
154 | "'this 'file' has quotes.c'" \ | |
155 | "\"this 'file' has quotes.c\"" \ | |
156 | "\"spaces: and :colons.c\"" \ | |
157 | "'more: :spaces: :and colons::.c'" \ | |
158 | "C:/nonexist-with-windrive.c"] | |
159 | ||
160 | foreach x $invalid_files { | |
161 | # Remove any quoting from FILENAME for the error message. | |
162 | test_break "$x:3" invalid_file [string trim $x \"'] | |
163 | } | |
164 | foreach x [list "this_file_doesn't_exist.c" \ | |
165 | "file::colons.c" \ | |
166 | "'file::colons.c'"] { | |
167 | test_break "-source $x -line 3" invalid_file [string trim $x \"'] | |
168 | } | |
87f0e720 | 169 | |
1cafadb4 DB |
170 | # Test that option lexing stops at whitespace boundaries |
171 | test_break "-source this file has spaces.c -line 3" invalid_file "this" | |
172 | test_break "-function function whitespace" invalid_function "function" | |
173 | test_break "-source $srcfile -function function whitespace" \ | |
174 | invalid_function_f "function" $srcfile | |
87f0e720 | 175 | |
1cafadb4 DB |
176 | test_break "-function main -label label whitespace" \ |
177 | invalid_label "label" "main" | |
40e084e1 | 178 | |
1cafadb4 DB |
179 | # Test unmatched quotes. |
180 | foreach x {"\"src-file.c'" "'src-file.c"} { | |
181 | test_break "$x:3" unmatched_quote | |
182 | } | |
40e084e1 | 183 | |
1cafadb4 DB |
184 | test_break $srcfile invalid_function $srcfile |
185 | foreach x {"foo" " foo" " foo "} { | |
186 | # Trim any leading/trailing whitespace for error messages. | |
187 | test_break "$srcfile:$x" invalid_function_f [string trim $x] $srcfile | |
188 | test_break "-source $srcfile -function $x" \ | |
189 | invalid_function_f [string trim $x] $srcfile | |
190 | test_break "$srcfile:main:$x" invalid_label [string trim $x] "main" | |
191 | test_break "-source $srcfile -function main -label $x" \ | |
192 | invalid_label [string trim $x] "main" | |
193 | } | |
40e084e1 | 194 | |
1cafadb4 DB |
195 | foreach x $spaces { |
196 | test_break "$srcfile$x" unexpected "end of input" | |
197 | test_break "$srcfile:main$x" unexpected "end of input" | |
198 | } | |
40e084e1 | 199 | |
1cafadb4 DB |
200 | test_break "${srcfile}::" invalid_function "${srcfile}::" |
201 | test_break "$srcfile:3 1" unexpected_opt "number" "1" | |
202 | test_break "-source $srcfile -line 3 1" garbage "1" | |
203 | test_break "$srcfile:3 +100" unexpected_opt "number" "+100" | |
204 | test_break "-source $srcfile -line 3 +100" garbage "+100" | |
205 | test_break "$srcfile:3 -100" unexpected_opt "number" "-100" | |
206 | test_break "$srcfile:3 foo" unexpected_opt "string" "foo" | |
207 | test_break "-source $srcfile -line 3 foo" garbage "foo" | |
208 | ||
209 | foreach x $invalid_offsets { | |
210 | test_break "$srcfile:$x" invalid_offset_f $x $srcfile | |
211 | test_break "\"$srcfile:$x\"" invalid_offset_f $x $srcfile | |
212 | test_break "'$srcfile:$x'" invalid_offset_f $x $srcfile | |
213 | test_break "-source $srcfile -line $x" invalid_offset_f $x $srcfile | |
214 | } | |
215 | test_break "-source $srcfile -line -x" malformed_line_offset "-x" | |
40e084e1 | 216 | |
1cafadb4 DB |
217 | # Test invalid filespecs starting with function. |
218 | foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \ | |
40e084e1 | 219 | "foo 0" "foo +10" "foo -10" "foo +100" "foo -100"} { |
1cafadb4 DB |
220 | test_break $x invalid_function $x |
221 | test_break "-function \"$x\"" invalid_function $x | |
222 | } | |
40e084e1 | 223 | |
1cafadb4 DB |
224 | foreach x $spaces { |
225 | test_break "main${x}there" invalid_label "there" "main" | |
226 | if {[test_compiler_info {clang-*-*}]} { | |
227 | setup_xfail clang/14500 *-*-* | |
228 | } | |
229 | test_break "main:here${x}" unexpected "end of input" | |
230 | } | |
40e084e1 | 231 | |
1cafadb4 DB |
232 | foreach x {"3" "+100" "-100" "foo"} { |
233 | test_break "main 3" invalid_function "main 3" | |
234 | test_break "-function \"main $x\"" invalid_function "main $x" | |
235 | test_break "main:here $x" invalid_label "here $x" "main" | |
236 | test_break "-function main -label \"here $x\"" \ | |
237 | invalid_label "here $x" "main" | |
238 | } | |
40e084e1 | 239 | |
1cafadb4 DB |
240 | foreach x {"if" "task" "thread"} { |
241 | test_break $x invalid_function $x | |
242 | } | |
40e084e1 | 243 | |
1cafadb4 DB |
244 | test_break "'main.c'flubber" unexpected_opt "string" "flubber" |
245 | test_break "'main.c',21" invalid_function "main.c" | |
246 | test_break "'main.c' " invalid_function "main.c" | |
247 | test_break "'main.c'3" unexpected_opt "number" "3" | |
248 | test_break "'main.c'+3" unexpected_opt "number" "+3" | |
40e084e1 | 249 | |
1cafadb4 DB |
250 | # Test undefined convenience variables. |
251 | set x {$zippo} | |
252 | test_break $x invalid_var_or_func $x | |
253 | test_break "$srcfile:$x" invalid_var_or_func_f $x $srcfile | |
87f0e720 | 254 | |
1cafadb4 DB |
255 | # Explicit linespec-specific tests |
256 | test_break "-source $srcfile" source_incomplete | |
257 | } | |
258 | ||
259 | foreach_with_prefix lang {"C" "C++"} { | |
260 | do_test ${lang} | |
261 | } |