summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.linespec/ls-errs.exp
blob: 5668397a3b054d12a9a31385513e2fb27e26a46b (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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# Copyright 2012 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.

# Add the (invalid) LINESPEC to the test array named in ARRAY_NAME.
# Use the index into ::error_messages MSG_ID and ARGS to create
# an error message which is the expect result of attempting to
# break on the given LINESPEC.
proc add {array_name linespec msg_id args} {
    global error_messages
    upvar $array_name tests

    lappend tests(linespecs) $linespec
    set tests("$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]

# THE_TESTS will hold all of our test information.  Array index
# "linespecs" will contain the complete list of all linespecs
# to be tested.  An array index of \"$linespec\" will contain
# the expected result.
set the_tests(linespecs) {}

# Try some simple, invalid linespecs involving spaces.
foreach x $spaces {
    add the_tests $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
    }
    add the_tests $x invalid_offset $offset
}

# Test offsets with trailing tokens w/ and w/o spaces.
foreach x $spaces {
    add the_tests "3$x" unexpected "colon"
    add the_tests "+10$x" unexpected "colon"
    add the_tests "-10$x" unexpected "colon"
}

foreach x {1 +1 +100 -10} {
    add the_tests "3 $x" unexpected_opt "number" $x
    add the_tests "+10 $x" unexpected_opt "number" $x
    add the_tests "-10 $x" unexpected_opt "number" $x
}

add the_tests "3 foo" unexpected_opt "string" "foo"
add the_tests "+10 foo" unexpected_opt "string" "foo"
add the_tests "-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.
    add the_tests "$x:3" invalid_file [string trim $x \"']
}

# Test unmatched quotes.
foreach x {"\"src-file.c'" "'src-file.c"} {
    add the_tests "$x:3" unmatched_quote
}

add the_tests $srcfile invalid_function $srcfile
foreach x {"foo" " foo" " foo "} {
    # Trim any leading/trailing whitespace for error messages.
    add the_tests "$srcfile:$x" invalid_function_f [string trim $x] $srcfile
    add the_tests "$srcfile:main:$x" invalid_label [string trim $x] "main" 
}

foreach x $spaces {
    add the_tests "$srcfile$x" unexpected "end of input"
    add the_tests "$srcfile:main$x" unexpected "end of input"
}

add the_tests "${srcfile}::" invalid_function "${srcfile}::"
add the_tests "$srcfile:3 1" unexpected_opt "number" "1"
add the_tests "$srcfile:3 +100" unexpected_opt "number" "+100"
add the_tests "$srcfile:3 -100" unexpected_opt "number" "-100"
add the_tests "$srcfile:3 foo" unexpected_opt "string" "foo"

foreach x $invalid_offsets {
    add the_tests "$srcfile:$x" invalid_offset_f $x $srcfile
    add the_tests "\"$srcfile:$x\"" invalid_offset_f $x $srcfile
    add the_tests "'$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"} {
    add the_tests $x invalid_function $x
}

foreach x $spaces {
    add the_tests "main${x}there" invalid_label "there" "main"
    add the_tests "main:here${x}" unexpected "end of input"
}

add the_tests "main 3" invalid_function "main 3"
add the_tests "main +100" invalid_function "main +100"
add the_tests "main -100" invalid_function "main -100"
add the_tests "main foo" invalid_function "main foo"

foreach x {"3" "+100" "-100" "foo"} {
    add the_tests "main:here $x" invalid_label "here $x" "main"
}

foreach x {"if" "task" "thread"} {
    add the_tests $x unexpected_opt "keyword" $x
}

add the_tests "'main.c'flubber" unexpected_opt "string" "flubber"
add the_tests "'main.c',21" invalid_function "main.c"
add the_tests "'main.c' " invalid_function "main.c"
add the_tests "'main.c'3" unexpected_opt "number" "3"
add the_tests "'main.c'+3" unexpected_opt "number" "+3"

# Test undefined convenience variables.
set x {$zippo}
add the_tests $x invalid_var_or_func $x
add the_tests "$srcfile:$x" invalid_var_or_func_f $x $srcfile

# Run the tests
foreach linespec $the_tests(linespecs) {
    gdb_test "break $linespec" $the_tests("$linespec")
}