cpcompletion.exp revision 1.1.1.4 1 1.1.1.4 christos # Copyright 2017-2024 Free Software Foundation, Inc.
2 1.1 christos
3 1.1 christos # This program is free software; you can redistribute it and/or modify
4 1.1 christos # it under the terms of the GNU General Public License as published by
5 1.1 christos # the Free Software Foundation; either version 3 of the License, or
6 1.1 christos # (at your option) any later version.
7 1.1 christos #
8 1.1 christos # This program is distributed in the hope that it will be useful,
9 1.1 christos # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 1.1 christos # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 1.1 christos # GNU General Public License for more details.
12 1.1 christos #
13 1.1 christos # You should have received a copy of the GNU General Public License
14 1.1 christos # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 1.1 christos
16 1.1 christos # This file is part of the gdb testsuite.
17 1.1 christos
18 1.1 christos load_lib completion-support.exp
19 1.1.1.3 christos load_lib data-structures.exp
20 1.1 christos
21 1.1 christos standard_testfile cpls.cc cpls2.cc cpls-hyphen.cc
22 1.1 christos
23 1.1.1.4 christos set opts {}
24 1.1.1.4 christos lappend opts debug
25 1.1.1.4 christos lappend opts additional_flags=-std=c++11
26 1.1.1.4 christos
27 1.1 christos if {[prepare_for_testing "failed to prepare" $testfile \
28 1.1.1.4 christos [list $srcfile $srcfile2 $srcfile3] $opts]} {
29 1.1 christos return -1
30 1.1 christos }
31 1.1 christos
32 1.1 christos # Tests below are about tab-completion, which doesn't work if readline
33 1.1 christos # library isn't used. Check it first.
34 1.1 christos
35 1.1 christos if { ![readline_is_used] } {
36 1.1 christos untested "no tab completion support without readline"
37 1.1 christos return -1
38 1.1 christos }
39 1.1 christos
40 1.1.1.3 christos #
41 1.1.1.3 christos # Some convenience procedures for testing template parameter list
42 1.1.1.3 christos # completion.
43 1.1.1.3 christos #
44 1.1.1.3 christos
45 1.1.1.3 christos # For the variable named ARGLISTVAR, which should be the name of an
46 1.1.1.3 christos # argument list in the calling frame, "consume" the top-most token.
47 1.1.1.3 christos # [See comments for makefoo for description of arglist format.]
48 1.1.1.3 christos
49 1.1.1.3 christos proc consume {arglistvar} {
50 1.1.1.3 christos upvar $arglistvar arglist
51 1.1.1.3 christos
52 1.1.1.3 christos # ARGLIST is a string -- simply strip off the first character.
53 1.1.1.3 christos set arglist [string range $arglist 1 end]
54 1.1.1.3 christos }
55 1.1.1.3 christos
56 1.1.1.3 christos # Create a function template named NAME, using the given stack ID to grab
57 1.1.1.3 christos # NUM template parameters. The result is pushed back onto the
58 1.1.1.3 christos # stack. NUM may be "all," in which case we use the entire stack
59 1.1.1.3 christos # to create the function template, including function arguments.
60 1.1.1.3 christos # The resulting template function's arguments are taken from the test
61 1.1.1.3 christos # source code for the function "foo" and is not generalized.
62 1.1.1.3 christos
63 1.1.1.3 christos proc maket {sid name {num 1}} {
64 1.1.1.3 christos
65 1.1.1.3 christos # Set up a temporary stack of parameters. This will reverse
66 1.1.1.3 christos # the order in SID so that when they are popped again below,
67 1.1.1.3 christos # we get them in the correct order. This also takes into account
68 1.1.1.3 christos # how many levels of the result stack we want to consider.
69 1.1.1.3 christos
70 1.1.1.3 christos set paramstack [::Stack::new]
71 1.1.1.3 christos if {[string equal $num "all"]} {
72 1.1.1.3 christos while {![stack empty $sid]} {
73 1.1.1.3 christos stack push $paramstack [stack pop $sid]
74 1.1.1.3 christos }
75 1.1.1.3 christos } else {
76 1.1.1.3 christos for {set i 0} {$i < $num} {incr i} {
77 1.1.1.3 christos stack push $paramstack [stack pop $sid]
78 1.1.1.3 christos }
79 1.1.1.3 christos }
80 1.1.1.3 christos
81 1.1.1.3 christos # Construct the function template and push it back to the
82 1.1.1.3 christos # top of the stack given by SID.
83 1.1.1.3 christos set result ""
84 1.1.1.3 christos set first true
85 1.1.1.3 christos while {![stack empty $paramstack]} {
86 1.1.1.3 christos set top [stack pop $paramstack]
87 1.1.1.3 christos if {$first} {
88 1.1.1.3 christos set first false
89 1.1.1.3 christos } else {
90 1.1.1.3 christos append result ", "
91 1.1.1.3 christos }
92 1.1.1.3 christos append result $top
93 1.1.1.3 christos }
94 1.1.1.3 christos
95 1.1.1.3 christos # Save argument list.
96 1.1.1.3 christos set args $result
97 1.1.1.3 christos
98 1.1.1.3 christos # GDB outputs "> >" instead of ">>".
99 1.1.1.3 christos if {[string index $top end] == ">"} {
100 1.1.1.3 christos append result " "
101 1.1.1.3 christos }
102 1.1.1.3 christos set result "$name<$result>"
103 1.1.1.3 christos if {[string equal $num "all"]} {
104 1.1.1.3 christos append result "($args)"
105 1.1.1.3 christos }
106 1.1.1.3 christos stack push $sid $result
107 1.1.1.3 christos stack delete $paramstack
108 1.1.1.3 christos }
109 1.1.1.3 christos
110 1.1.1.3 christos # Given the stack SID and the name of a variable of the desired template
111 1.1.1.3 christos # parameters, construct the actual template parameter and push it to the
112 1.1.1.3 christos # top of the stack.
113 1.1.1.3 christos
114 1.1.1.3 christos proc makearg {sid arglistvar} {
115 1.1.1.3 christos upvar $arglistvar arglist
116 1.1.1.3 christos
117 1.1.1.3 christos set c [string index $arglist 0]
118 1.1.1.3 christos consume arglist
119 1.1.1.3 christos switch $c {
120 1.1.1.3 christos A -
121 1.1.1.3 christos B {
122 1.1.1.3 christos makearg $sid arglist
123 1.1.1.3 christos makearg $sid arglist
124 1.1.1.3 christos maket $sid $c 2
125 1.1.1.3 christos }
126 1.1.1.3 christos
127 1.1.1.3 christos a -
128 1.1.1.3 christos b -
129 1.1.1.3 christos c -
130 1.1.1.3 christos d {
131 1.1.1.3 christos makearg $sid arglist
132 1.1.1.3 christos maket $sid $c
133 1.1.1.3 christos }
134 1.1.1.3 christos
135 1.1.1.3 christos i {
136 1.1.1.3 christos stack push $sid "int"
137 1.1.1.3 christos }
138 1.1.1.3 christos
139 1.1.1.3 christos n {
140 1.1.1.3 christos # These are not templates.
141 1.1.1.3 christos set c [string index $arglist 0]
142 1.1.1.3 christos stack push $sid "n::n$c"
143 1.1.1.3 christos consume arglist
144 1.1.1.3 christos }
145 1.1.1.3 christos
146 1.1.1.3 christos N {
147 1.1.1.3 christos set c [string index $arglist 0]
148 1.1.1.3 christos makearg $sid arglist
149 1.1.1.3 christos set top [stack pop $sid]
150 1.1.1.3 christos stack push $sid "n::N$top"
151 1.1.1.3 christos }
152 1.1.1.3 christos
153 1.1.1.3 christos default { error "unhandled arglist identifier: '$c'" }
154 1.1.1.3 christos }
155 1.1.1.3 christos }
156 1.1.1.3 christos
157 1.1.1.3 christos # Given ARGLIST, construct a class template for the type and return
158 1.1.1.3 christos # it as a string.
159 1.1.1.3 christos
160 1.1.1.3 christos proc maketype {arglist} {
161 1.1.1.3 christos set s [Stack::new]
162 1.1.1.3 christos makearg $s arglist
163 1.1.1.3 christos set result [stack pop $s]
164 1.1.1.3 christos stack delete $s
165 1.1.1.3 christos return $result
166 1.1.1.3 christos }
167 1.1.1.3 christos
168 1.1.1.3 christos # Returns a function template declaration for the function "foo" in the
169 1.1.1.3 christos # corresponding test source code. ARGLIST specifies the exact instantiation
170 1.1.1.3 christos # that is desired.
171 1.1.1.3 christos #
172 1.1.1.3 christos # Generically, this procedure returns a string of the form,
173 1.1.1.3 christos # "foo<parameter-list> (arg-list)", where ARGLIST describes the parameter(s).
174 1.1.1.3 christos #
175 1.1.1.3 christos # Valid specifiers for ARGLIST (must be kept in sync with source code):
176 1.1.1.3 christos #
177 1.1.1.3 christos # i: Creates an "int" type.
178 1.1.1.3 christos # a, b, c, d: Creates the struct template of the same name, taking a single
179 1.1.1.3 christos # template parameter.
180 1.1.1.3 christos # A, B: Creates the struct template of the same name, taking two template
181 1.1.1.3 christos # parameters.
182 1.1.1.3 christos # na, nb: Creates the non-template structs n::na and n::nb, respectively.
183 1.1.1.3 christos # NA, NB: Creates the struct templates n::NA and n::NB, respectively, which
184 1.1.1.3 christos # take two template parameters.
185 1.1.1.3 christos #
186 1.1.1.3 christos # Examples:
187 1.1.1.3 christos # makefoo i
188 1.1.1.3 christos # --> foo<int> (int)
189 1.1.1.3 christos # makefoo ii
190 1.1.1.3 christos # --> foo<int, int> (int, int)
191 1.1.1.3 christos # makefoo Aiabi
192 1.1.1.3 christos # --> foo<A<int, a<b<int> > > > (A<int, a<b<int> > >)
193 1.1.1.3 christos # makefoo NANAiaiNBbiabi
194 1.1.1.3 christos # --> foo<n::NA<n::NA<int, a<int> >, n::NB<b<int>, a<b<int> > > > >
195 1.1.1.3 christos # (n::NA<n::NA<int, a<int> >, n::NB<b<int>, a<b<int> > > >)
196 1.1.1.3 christos
197 1.1.1.3 christos proc makefoo {arglist} {
198 1.1.1.3 christos set s [::Stack::new]
199 1.1.1.3 christos while {[string length $arglist] > 0} {
200 1.1.1.3 christos makearg $s arglist
201 1.1.1.3 christos }
202 1.1.1.3 christos
203 1.1.1.3 christos maket $s "foo" all
204 1.1.1.3 christos set result [stack pop $s]
205 1.1.1.3 christos stack delete $s
206 1.1.1.3 christos return $result
207 1.1.1.3 christos }
208 1.1.1.3 christos
209 1.1.1.3 christos # Test wrapper for a single "makefoo" unit test.
210 1.1.1.3 christos
211 1.1.1.3 christos proc test_makefoo_1 {arglist expected} {
212 1.1.1.3 christos set exp "foo<$expected"
213 1.1.1.3 christos if {[string index $exp end] == ">"} {
214 1.1.1.3 christos append exp " "
215 1.1.1.3 christos }
216 1.1.1.3 christos append exp ">"
217 1.1.1.3 christos append exp "($expected)"
218 1.1.1.3 christos
219 1.1.1.3 christos set calc [makefoo $arglist]
220 1.1.1.3 christos send_log "makefoo $arglist = $calc\n"
221 1.1.1.3 christos send_log "expecting: $exp\n"
222 1.1.1.3 christos if {[string equal $exp $calc]} {
223 1.1.1.3 christos pass "makefoo unit test: $arglist"
224 1.1.1.3 christos } else {
225 1.1.1.3 christos fail "makefoo unit test: $arglist"
226 1.1.1.3 christos }
227 1.1.1.3 christos }
228 1.1.1.3 christos
229 1.1.1.3 christos # Test whether the procedure "makefoo" is functioning as expected.
230 1.1.1.3 christos
231 1.1.1.3 christos proc test_makefoo {} {
232 1.1.1.3 christos test_makefoo_1 "i" "int"
233 1.1.1.3 christos test_makefoo_1 "ai" "a<int>"
234 1.1.1.3 christos test_makefoo_1 "aai" "a<a<int> >"
235 1.1.1.3 christos test_makefoo_1 "ii" "int, int"
236 1.1.1.3 christos test_makefoo_1 "aaibi" "a<a<int> >, b<int>"
237 1.1.1.3 christos test_makefoo_1 \
238 1.1.1.3 christos "ababiibababai" "a<b<a<b<int> > > >, int, b<a<b<a<b<a<int> > > > > >"
239 1.1.1.3 christos test_makefoo_1 "Aii" "A<int, int>"
240 1.1.1.3 christos test_makefoo_1 "ABaibibi" "A<B<a<int>, b<int> >, b<int> >"
241 1.1.1.3 christos test_makefoo_1 "na" "n::na"
242 1.1.1.3 christos test_makefoo_1 "nana" "n::na, n::na"
243 1.1.1.3 christos test_makefoo_1 "NAii" "n::NA<int, int>"
244 1.1.1.3 christos test_makefoo_1 "NANAiiNAii" "n::NA<n::NA<int, int>, n::NA<int, int> >"
245 1.1.1.3 christos }
246 1.1.1.3 christos
247 1.1.1.3 christos #
248 1.1.1.3 christos # Tests start here.
249 1.1.1.3 christos #
250 1.1.1.3 christos
251 1.1 christos # Disable the completion limit for the whole testcase.
252 1.1 christos gdb_test_no_output "set max-completions unlimited"
253 1.1 christos
254 1.1 christos # Start of tests.
255 1.1 christos
256 1.1 christos # Test completion of all parameter prefixes, crossing "(" and ")",
257 1.1 christos # with and without whitespace.
258 1.1 christos
259 1.1 christos proc_with_prefix all-param-prefixes {} {
260 1.1 christos
261 1.1 christos # Test both linespecs and explicit locations.
262 1.1 christos foreach cmd_prefix {"b" "b -function"} {
263 1.1 christos set line "$cmd_prefix param_prefixes_test_long(long)"
264 1.1 christos set start [index_after "test_long" $line]
265 1.1 christos test_complete_prefix_range $line $start
266 1.1 christos
267 1.1 christos # Same, but with extra spaces. Note that the original spaces in
268 1.1 christos # the input line are preserved after completion.
269 1.1 christos test_gdb_complete_unique \
270 1.1 christos "$cmd_prefix param_prefixes_test_long(long " \
271 1.1 christos "$cmd_prefix param_prefixes_test_long(long )"
272 1.1 christos test_gdb_complete_unique \
273 1.1 christos "$cmd_prefix param_prefixes_test_long( long " \
274 1.1 christos "$cmd_prefix param_prefixes_test_long( long )"
275 1.1 christos test_gdb_complete_unique \
276 1.1 christos "$cmd_prefix param_prefixes_test_long ( long " \
277 1.1 christos "$cmd_prefix param_prefixes_test_long ( long )"
278 1.1 christos
279 1.1 christos # Complete all parameter prefixes between "(i" and "(int*, int&)".
280 1.1 christos # Note that this exercises completing when the point is at the
281 1.1 christos # space in "param_prefixes_test_intp_intr(int*, ".
282 1.1 christos set line "$cmd_prefix param_prefixes_test_intp_intr(int*, int&)"
283 1.1 christos set start [index_after "intp_intr" $line]
284 1.1 christos test_complete_prefix_range $line $start
285 1.1 christos
286 1.1 christos # Similar, but with extra spaces.
287 1.1 christos test_gdb_complete_unique \
288 1.1 christos "$cmd_prefix param_prefixes_test_intp_intr ( int* " \
289 1.1 christos "$cmd_prefix param_prefixes_test_intp_intr ( int* , int&)"
290 1.1 christos
291 1.1 christos test_gdb_complete_unique \
292 1.1 christos "$cmd_prefix param_prefixes_test_intp_intr ( int *" \
293 1.1 christos "$cmd_prefix param_prefixes_test_intp_intr ( int *, int&)"
294 1.1 christos
295 1.1 christos test_gdb_complete_unique \
296 1.1 christos "$cmd_prefix param_prefixes_test_intp_intr ( int *, int " \
297 1.1 christos "$cmd_prefix param_prefixes_test_intp_intr ( int *, int &)"
298 1.1 christos
299 1.1 christos test_gdb_complete_unique \
300 1.1 christos "$cmd_prefix param_prefixes_test_intp_intr ( int *, int & " \
301 1.1 christos "$cmd_prefix param_prefixes_test_intp_intr ( int *, int & )"
302 1.1 christos }
303 1.1 christos }
304 1.1 christos
305 1.1 christos # Test completion of an overloaded function.
306 1.1 christos
307 1.1 christos proc_with_prefix overload {} {
308 1.1 christos set completion_list {
309 1.1 christos "overload_ambiguous_test(int, int)"
310 1.1 christos "overload_ambiguous_test(int, long)"
311 1.1 christos "overload_ambiguous_test(long)"
312 1.1 christos }
313 1.1 christos
314 1.1 christos foreach cmd_prefix {"b" "b -function"} {
315 1.1 christos test_gdb_complete_multiple \
316 1.1 christos "$cmd_prefix " "overload_ambiguous_" "test(" \
317 1.1 christos $completion_list
318 1.1 christos check_bp_locations_match_list \
319 1.1 christos "$cmd_prefix overload_ambiguous_test" \
320 1.1 christos $completion_list
321 1.1 christos
322 1.1 christos # Test disambiguating by typing enough to pick the "int" as
323 1.1 christos # first parameter type. This then tests handling ambiguity in
324 1.1 christos # the second parameter, which checks that tab completion when
325 1.1 christos # the point is at the whitespace behaves naturally, by showing
326 1.1 christos # the remaining matching overloads to the user.
327 1.1 christos test_gdb_complete_multiple \
328 1.1 christos "$cmd_prefix " "overload_ambiguous_test(i" "nt, " {
329 1.1 christos "overload_ambiguous_test(int, int)"
330 1.1 christos "overload_ambiguous_test(int, long)"
331 1.1 christos }
332 1.1 christos
333 1.1 christos # Add a few more characters to make the completion
334 1.1 christos # unambiguous.
335 1.1 christos test_gdb_complete_unique \
336 1.1 christos "$cmd_prefix overload_ambiguous_test(int, i" \
337 1.1 christos "$cmd_prefix overload_ambiguous_test(int, int)"
338 1.1 christos check_bp_locations_match_list \
339 1.1 christos "$cmd_prefix overload_ambiguous_test(int, int)" {
340 1.1 christos "overload_ambiguous_test(int, int)"
341 1.1 christos }
342 1.1 christos }
343 1.1 christos }
344 1.1 christos
345 1.1 christos # Test completion of a function that is defined in different scopes
346 1.1 christos # with different parameters.
347 1.1 christos
348 1.1 christos proc_with_prefix overload-2 {} {
349 1.1 christos with_test_prefix "all" {
350 1.1 christos set completion_list {
351 1.1 christos "(anonymous namespace)::overload2_function(overload2_arg3)"
352 1.1 christos "(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg4)"
353 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
354 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
355 1.1 christos "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
356 1.1 christos "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
357 1.1 christos "ns_overload2_test::overload2_function(overload2_arg5)"
358 1.1 christos "ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"
359 1.1 christos "overload2_function(overload2_arg1)"
360 1.1 christos "struct_overload2_test::overload2_function(overload2_arg2)"
361 1.1 christos }
362 1.1 christos foreach cmd_prefix {"b" "b -function"} {
363 1.1 christos test_gdb_complete_multiple \
364 1.1 christos "$cmd_prefix " "overload2_func" "tion(overload2_arg" $completion_list
365 1.1 christos check_bp_locations_match_list \
366 1.1 christos "$cmd_prefix overload2_function" $completion_list
367 1.1 christos }
368 1.1 christos }
369 1.1 christos
370 1.1 christos # Same, but restrict to functions/methods in some scope.
371 1.1 christos with_test_prefix "restrict scope" {
372 1.1 christos set completion_list {
373 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
374 1.1 christos "ns_overload2_test::overload2_function(overload2_arg5)"
375 1.1 christos }
376 1.1 christos foreach cmd_prefix {"b" "b -function"} {
377 1.1 christos test_gdb_complete_multiple \
378 1.1 christos "$cmd_prefix " "ns_overload2_test::overload2_func" "tion(overload2_arg" $completion_list
379 1.1 christos check_bp_locations_match_list \
380 1.1 christos "$cmd_prefix ns_overload2_test::overload2_function" $completion_list
381 1.1 christos }
382 1.1 christos }
383 1.1 christos
384 1.1 christos # Restrict to anonymous namespace scopes.
385 1.1 christos with_test_prefix "restrict scope 2" {
386 1.1 christos set completion_list {
387 1.1 christos "(anonymous namespace)::overload2_function(overload2_arg3)"
388 1.1 christos "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
389 1.1 christos }
390 1.1 christos foreach cmd_prefix {"b" "b -function"} {
391 1.1 christos test_gdb_complete_multiple \
392 1.1 christos "$cmd_prefix " "(anonymous namespace)::overload2_func" "tion(overload2_arg" $completion_list
393 1.1 christos check_bp_locations_match_list \
394 1.1 christos "$cmd_prefix (anonymous namespace)::overload2_function" $completion_list
395 1.1 christos }
396 1.1 christos }
397 1.1 christos
398 1.1 christos # Add enough scopes, and we get a unique completion.
399 1.1 christos with_test_prefix "unique completion" {
400 1.1 christos foreach cmd_prefix {"b" "b -function"} {
401 1.1 christos test_gdb_complete_unique \
402 1.1 christos "$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_func" \
403 1.1 christos "$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
404 1.1 christos check_setting_bp_fails "$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_func"
405 1.1 christos check_bp_locations_match_list \
406 1.1 christos "$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_function" \
407 1.1 christos {"ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"}
408 1.1 christos }
409 1.1 christos }
410 1.1 christos }
411 1.1 christos
412 1.1 christos # Test linespecs / locations using fully-qualified names.
413 1.1 christos
414 1.1 christos proc_with_prefix fqn {} {
415 1.1 christos
416 1.1 christos # "-qualified" works with both explicit locations and linespecs.
417 1.1 christos # Also test that combining a source file with a function name
418 1.1 christos # still results in a full match, with both linespecs and explicit
419 1.1 christos # locations.
420 1.1 christos foreach cmd_prefix {
421 1.1 christos "b -qualified "
422 1.1 christos "b -qualified -function "
423 1.1 christos "b -qualified cpls.cc:"
424 1.1 christos "b -qualified -source cpls.cc -function "
425 1.1 christos "b -source cpls.cc -qualified -function "
426 1.1 christos } {
427 1.1 christos test_gdb_complete_unique \
428 1.1 christos "${cmd_prefix}overload2_func" \
429 1.1 christos "${cmd_prefix}overload2_function(overload2_arg1)"
430 1.1 christos
431 1.1 christos # Drill down until we find a unique completion.
432 1.1 christos test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::" "" {
433 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
434 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
435 1.1 christos "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
436 1.1 christos "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
437 1.1 christos "ns_overload2_test::overload2_function(overload2_arg5)"
438 1.1 christos "ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"
439 1.1 christos }
440 1.1 christos
441 1.1 christos test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::(anonymous namespace)::" "" {
442 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
443 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
444 1.1 christos "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
445 1.1 christos "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
446 1.1 christos }
447 1.1 christos
448 1.1 christos test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::(anonymous namespace)::ns_overload2_test::" "" {
449 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
450 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
451 1.1 christos }
452 1.1 christos
453 1.1 christos test_gdb_complete_unique \
454 1.1 christos "${cmd_prefix}ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_func" \
455 1.1 christos "${cmd_prefix}ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
456 1.1 christos
457 1.1 christos }
458 1.1 christos }
459 1.1 christos
460 1.1 christos # Check that a fully-qualified lookup name doesn't match symbols in
461 1.1 christos # nested scopes.
462 1.1 christos
463 1.1 christos proc_with_prefix fqn-2 {} {
464 1.1 christos set linespec "struct_overload2_test::overload2_function(overload2_arg6)"
465 1.1 christos set cmd_prefix "b -qualified"
466 1.1 christos check_setting_bp_fails "$cmd_prefix $linespec"
467 1.1 christos test_gdb_complete_none "$cmd_prefix $linespec"
468 1.1 christos
469 1.1 christos # Check that using the same name, but not fully-qualifying it,
470 1.1 christos # would find something, just to make sure the test above is
471 1.1 christos # testing what we intend to test.
472 1.1 christos set cmd_prefix "b -function"
473 1.1 christos test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
474 1.1 christos check_bp_locations_match_list \
475 1.1 christos "$cmd_prefix $linespec" \
476 1.1 christos {"ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"}
477 1.1 christos }
478 1.1 christos
479 1.1 christos # Test completion of functions in different scopes that have the same
480 1.1 christos # name and parameters. Restricting the scopes should find fewer and
481 1.1 christos # fewer matches.
482 1.1 christos
483 1.1 christos proc_with_prefix overload-3 {} {
484 1.1 christos with_test_prefix "all overloads" {
485 1.1 christos set completion_list {
486 1.1 christos "(anonymous namespace)::overload3_function(int)"
487 1.1 christos "(anonymous namespace)::overload3_function(long)"
488 1.1 christos "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
489 1.1 christos "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
490 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
491 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(long)"
492 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
493 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
494 1.1 christos "ns_overload3_test::(anonymous namespace)::overload3_function(int)"
495 1.1 christos "ns_overload3_test::(anonymous namespace)::overload3_function(long)"
496 1.1 christos "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
497 1.1 christos "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
498 1.1 christos "ns_overload3_test::overload3_function(int)"
499 1.1 christos "ns_overload3_test::overload3_function(long)"
500 1.1 christos "ns_overload3_test::struct_overload3_test::overload3_function(int)"
501 1.1 christos "ns_overload3_test::struct_overload3_test::overload3_function(long)"
502 1.1 christos "overload3_function(int)"
503 1.1 christos "overload3_function(long)"
504 1.1 christos "struct_overload3_test::overload3_function(int)"
505 1.1 christos "struct_overload3_test::overload3_function(long)"
506 1.1 christos }
507 1.1 christos foreach cmd_prefix {"b" "b -function"} {
508 1.1 christos test_gdb_complete_multiple "$cmd_prefix " "overload3_func" "tion(" $completion_list
509 1.1 christos check_bp_locations_match_list "$cmd_prefix overload3_function" $completion_list
510 1.1 christos }
511 1.1 christos }
512 1.1 christos
513 1.1 christos with_test_prefix "restrict overload" {
514 1.1 christos foreach cmd_prefix {"b" "b -function"} {
515 1.1 christos test_gdb_complete_unique \
516 1.1 christos "$cmd_prefix overload3_function(int)" \
517 1.1 christos "$cmd_prefix overload3_function(int)"
518 1.1 christos check_bp_locations_match_list "$cmd_prefix overload3_function(int)" {
519 1.1 christos "(anonymous namespace)::overload3_function(int)"
520 1.1 christos "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
521 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
522 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
523 1.1 christos "ns_overload3_test::(anonymous namespace)::overload3_function(int)"
524 1.1 christos "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
525 1.1 christos "ns_overload3_test::overload3_function(int)"
526 1.1 christos "ns_overload3_test::struct_overload3_test::overload3_function(int)"
527 1.1 christos "overload3_function(int)"
528 1.1 christos "struct_overload3_test::overload3_function(int)"
529 1.1 christos }
530 1.1 christos }
531 1.1 christos }
532 1.1 christos
533 1.1 christos with_test_prefix "restrict scope" {
534 1.1 christos set completion_list {
535 1.1 christos "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
536 1.1 christos "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
537 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
538 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
539 1.1 christos "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
540 1.1 christos "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
541 1.1 christos "ns_overload3_test::struct_overload3_test::overload3_function(int)"
542 1.1 christos "ns_overload3_test::struct_overload3_test::overload3_function(long)"
543 1.1 christos "struct_overload3_test::overload3_function(int)"
544 1.1 christos "struct_overload3_test::overload3_function(long)"
545 1.1 christos }
546 1.1 christos foreach cmd_prefix {"b" "b -function"} {
547 1.1 christos test_gdb_complete_multiple \
548 1.1 christos "$cmd_prefix " "struct_overload3_test::overload3_func" "tion(" \
549 1.1 christos $completion_list
550 1.1 christos check_bp_locations_match_list \
551 1.1 christos "$cmd_prefix struct_overload3_test::overload3_function" \
552 1.1 christos $completion_list
553 1.1 christos }
554 1.1 christos }
555 1.1 christos }
556 1.1 christos
557 1.1 christos # Test completing an overloaded template method.
558 1.1 christos
559 1.1 christos proc_with_prefix template-overload {} {
560 1.1 christos set completion_list {
561 1.1 christos "template_struct<int>::template_overload_fn(int)"
562 1.1 christos "template_struct<long>::template_overload_fn(long)"
563 1.1 christos }
564 1.1 christos foreach cmd_prefix {"b" "b -function"} {
565 1.1 christos test_gdb_complete_multiple "$cmd_prefix " "template_overload_fn" "(" $completion_list
566 1.1 christos check_bp_locations_match_list "$cmd_prefix template_overload_fn" $completion_list
567 1.1 christos check_bp_locations_match_list \
568 1.1 christos "$cmd_prefix template_struct<int>::template_overload_fn" \
569 1.1 christos "template_struct<int>::template_overload_fn(int)"
570 1.1 christos }
571 1.1 christos }
572 1.1 christos
573 1.1 christos # Test completing template methods with non-void return type.
574 1.1 christos
575 1.1 christos proc_with_prefix template-ret-type {} {
576 1.1 christos set method_name "template2_fn<int, int>"
577 1.1 christos set param_list "(template2_ret_type<int>, int, int)"
578 1.1 christos set struct_type "template2_struct<template2_ret_type<int> >"
579 1.1 christos set ret_type "template2_ret_type<int>"
580 1.1 christos
581 1.1 christos # Templates are listed both with and without return type, making
582 1.1 christos # "template2_<tab>" ambiguous.
583 1.1 christos foreach cmd_prefix {"b" "b -function"} {
584 1.1 christos set completion_list \
585 1.1 christos [list \
586 1.1 christos "${ret_type} ${struct_type}::${method_name}${param_list}" \
587 1.1 christos "${struct_type}::${method_name}${param_list}"]
588 1.1 christos test_gdb_complete_multiple "$cmd_prefix " "template2_" "" $completion_list
589 1.1 christos
590 1.1 christos # Add one character more after "2_", and the linespec becomes
591 1.1 christos # unambiguous. Test completing the whole prefix range after that,
592 1.1 christos # thus testing completing either with or without return type.
593 1.1 christos foreach {s t} [list \
594 1.1 christos "template2_r" \
595 1.1 christos "${ret_type} ${struct_type}::${method_name}${param_list}" \
596 1.1 christos "template2_s" \
597 1.1 christos "${struct_type}::${method_name}${param_list}"] {
598 1.1 christos set linespec $t
599 1.1 christos set complete_line "$cmd_prefix $linespec"
600 1.1 christos set start [index_after $s $complete_line]
601 1.1 christos test_complete_prefix_range $complete_line $start
602 1.1 christos }
603 1.1 christos
604 1.1.1.3 christos # Setting a breakpoint with or without template params and without
605 1.1.1.3 christos # the method params works, just like with non-template functions.
606 1.1.1.3 christos # It also works with or without return type.
607 1.1 christos foreach linespec [list \
608 1.1.1.3 christos "template2_fn" \
609 1.1 christos "${method_name}" \
610 1.1 christos "${method_name}${param_list}" \
611 1.1 christos "${struct_type}::${method_name}" \
612 1.1 christos "${struct_type}::${method_name}${param_list}" \
613 1.1 christos "${ret_type} ${struct_type}::${method_name}" \
614 1.1 christos "${ret_type} ${struct_type}::${method_name}${param_list}"] {
615 1.1 christos check_bp_locations_match_list \
616 1.1 christos "$cmd_prefix $linespec" \
617 1.1 christos [list "${struct_type}::${method_name}${param_list}"]
618 1.1 christos }
619 1.1 christos }
620 1.1 christos }
621 1.1 christos
622 1.1.1.3 christos # Test completion of function template foo.
623 1.1.1.3 christos
624 1.1.1.3 christos proc_with_prefix template-function-foo {} {
625 1.1.1.3 christos
626 1.1.1.3 christos foreach cmd_prefix {"b" "b -function"} {
627 1.1.1.3 christos # "foo" is ambiguous, this will set many different breakpoints.
628 1.1.1.3 christos set completion_list \
629 1.1.1.3 christos [list \
630 1.1.1.3 christos [makefoo Aabiaai] \
631 1.1.1.3 christos [makefoo Aabiabi] \
632 1.1.1.3 christos [makefoo Aabicdi] \
633 1.1.1.3 christos [makefoo AabicdiAabiaai] \
634 1.1.1.3 christos [makefoo AabicdiAabiabi] \
635 1.1.1.3 christos [makefoo AabicdiBabicdi] \
636 1.1.1.3 christos [makefoo Babicdi] \
637 1.1.1.3 christos [makefoo aai] \
638 1.1.1.3 christos [makefoo aaiabi] \
639 1.1.1.3 christos [makefoo aaicci] \
640 1.1.1.3 christos [makefoo aaicdi] \
641 1.1.1.3 christos [makefoo abi] \
642 1.1.1.3 christos [makefoo anabnb] \
643 1.1.1.3 christos [makefoo cci] \
644 1.1.1.3 christos [makefoo cdi] \
645 1.1.1.3 christos [makefoo NAnanbNBnanb] \
646 1.1.1.3 christos [makefoo nanb]]
647 1.1.1.3 christos test_gdb_complete_multiple "$cmd_prefix " "foo" "<" $completion_list
648 1.1.1.3 christos check_bp_locations_match_list "$cmd_prefix foo" $completion_list
649 1.1.1.3 christos
650 1.1.1.3 christos # "foo<" should give the same result, but it should not set any
651 1.1.1.3 christos # breakpoints.
652 1.1.1.3 christos test_gdb_complete_multiple "$cmd_prefix " "foo<" "" $completion_list
653 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<"
654 1.1.1.3 christos
655 1.1.1.3 christos # "foo<A" should only give completions in COMPLETION_LIST that
656 1.1.1.3 christos # start with "A" but should set no breakpoints.
657 1.1.1.3 christos set completion_list \
658 1.1.1.3 christos [list \
659 1.1.1.3 christos [makefoo Aabiaai] \
660 1.1.1.3 christos [makefoo Aabiabi] \
661 1.1.1.3 christos [makefoo Aabicdi] \
662 1.1.1.3 christos [makefoo AabicdiAabiaai] \
663 1.1.1.3 christos [makefoo AabicdiAabiabi] \
664 1.1.1.3 christos [makefoo AabicdiBabicdi]]
665 1.1.1.3 christos test_gdb_complete_multiple "$cmd_prefix " "foo<A" "<a<b<int> >, " \
666 1.1.1.3 christos $completion_list
667 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<A"
668 1.1.1.3 christos
669 1.1.1.3 christos # "foo<A>" should give any function with one parameter of any type
670 1.1.1.3 christos # of A. While the parameter list in the template should be ignored,
671 1.1.1.3 christos # the function's argument list should not be ignored.
672 1.1.1.3 christos set completion_list \
673 1.1.1.3 christos [list \
674 1.1.1.3 christos [makefoo Aabiaai] \
675 1.1.1.3 christos [makefoo Aabiabi] \
676 1.1.1.3 christos [makefoo Aabicdi]]
677 1.1.1.3 christos test_gdb_complete_multiple "$cmd_prefix " "foo<A>" \
678 1.1.1.3 christos "(A<a<b<int> >, " $completion_list
679 1.1.1.3 christos check_bp_locations_match_list "$cmd_prefix foo<A>" $completion_list
680 1.1.1.3 christos
681 1.1.1.3 christos # "foo<A," should complete to any function with more than one
682 1.1.1.3 christos # parameter where the first parameter is any type of A. Insufficient
683 1.1.1.3 christos # location to set breakpoints.
684 1.1.1.3 christos set completion_list \
685 1.1.1.3 christos [list \
686 1.1.1.3 christos [makefoo AabicdiAabiaai] \
687 1.1.1.3 christos [makefoo AabicdiAabiabi] \
688 1.1.1.3 christos [makefoo AabicdiBabicdi]]
689 1.1.1.3 christos test_gdb_complete_multiple "$cmd_prefix " "foo<A," " " \
690 1.1.1.3 christos $completion_list
691 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<A,"
692 1.1.1.3 christos
693 1.1.1.3 christos # "foo<A<a<b<int>, a" should give all completions starting with
694 1.1.1.3 christos # "Aabia" but it is insufficient to set breakpoints.
695 1.1.1.3 christos set completion_list \
696 1.1.1.3 christos [list \
697 1.1.1.3 christos [makefoo Aabiaai] \
698 1.1.1.3 christos [makefoo Aabiabi]]
699 1.1.1.3 christos test_gdb_complete_multiple "$cmd_prefix " "foo<A<a<b<int> >, a" \
700 1.1.1.3 christos "<" $completion_list
701 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<A<a<b<int> >, a"
702 1.1.1.3 christos
703 1.1.1.3 christos # "foo<A<a<b<int>, a<" should yield the same results as above.
704 1.1.1.3 christos test_gdb_complete_multiple "$cmd_prefix " "foo<A<a<b<int> >, a<" \
705 1.1.1.3 christos "" $completion_list
706 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<A<a<b<int> >, a<"
707 1.1.1.3 christos
708 1.1.1.3 christos # "foo<A<a<b<int>, a<a" is unique but insufficient to set a
709 1.1.1.3 christos # breakpoint. This has an ignored template parameter list, so
710 1.1.1.3 christos # the completion will contain an ignored list ("a<a>")
711 1.1.1.3 christos test_gdb_complete_unique "$cmd_prefix foo<A<a<b<int> >, a<a" \
712 1.1.1.3 christos "$cmd_prefix [makefoo Aabiaai]"
713 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<A<b<int> >, a<a"
714 1.1.1.3 christos
715 1.1.1.3 christos # "foo<A<a<b<int>, a<b" is also unique. Same parameter ignoring
716 1.1.1.3 christos # happens here, too (except "a<b>").
717 1.1.1.3 christos test_gdb_complete_unique "$cmd_prefix foo<A<a<b<int> >, a<b" \
718 1.1.1.3 christos "$cmd_prefix [makefoo Aabiabi]"
719 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<A<a<b<int> >, a<b"
720 1.1.1.3 christos
721 1.1.1.3 christos # "foo<B" is unique but insufficient to set a breakpoint.
722 1.1.1.3 christos test_gdb_complete_unique "$cmd_prefix foo<B" \
723 1.1.1.3 christos "$cmd_prefix [makefoo Babicdi]"
724 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<B"
725 1.1.1.3 christos
726 1.1.1.3 christos # "foo<B>" yields the same unique result and sets a breakpoint.
727 1.1.1.3 christos # Since the input skips the parameter list, so does the completion.
728 1.1.1.3 christos test_gdb_complete_unique "$cmd_prefix foo<B>" \
729 1.1.1.3 christos "$cmd_prefix foo<B>(B<a<b<int> >, c<d<int> > >)"
730 1.1.1.3 christos check_bp_locations_match_list "$cmd_prefix foo<B>" \
731 1.1.1.3 christos [list [makefoo Babicdi]]
732 1.1.1.3 christos
733 1.1.1.3 christos # "foo<B," should return no completions and no breakpoints.
734 1.1.1.3 christos test_gdb_complete_none "$cmd_prefix foo<B,"
735 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<B,"
736 1.1.1.3 christos
737 1.1.1.3 christos # "foo<n::" should yield only the functions starting with
738 1.1.1.3 christos # "n" and "N" and no breakpoints.
739 1.1.1.3 christos set completion_list \
740 1.1.1.3 christos [list \
741 1.1.1.3 christos [makefoo NAnanbNBnanb] \
742 1.1.1.3 christos [makefoo nanb]]
743 1.1.1.3 christos test_gdb_complete_multiple "$cmd_prefix " "foo<n::" "" \
744 1.1.1.3 christos $completion_list
745 1.1.1.3 christos check_setting_bp_fails "$cmd_prefix foo<n::"
746 1.1.1.3 christos
747 1.1.1.3 christos # "foo<A<a, c> >" is unique and sets a breakpoint.
748 1.1.1.3 christos # Multiple template parameter lists are skipped, so GDB will ignore
749 1.1.1.3 christos # them in the completion.
750 1.1.1.3 christos test_gdb_complete_unique "$cmd_prefix foo<A<a, c> >" \
751 1.1.1.3 christos "$cmd_prefix foo<A<a, c> >(A<a<b<int> >, c<d<int> > >)"
752 1.1.1.3 christos check_bp_locations_match_list "$cmd_prefix foo<A<a, c> >" \
753 1.1.1.3 christos [list [makefoo Aabicdi]]
754 1.1.1.3 christos }
755 1.1.1.3 christos }
756 1.1.1.3 christos
757 1.1.1.3 christos # Helper for template-class-with-method to build completion lists.
758 1.1.1.3 christos
759 1.1.1.3 christos proc makem {arglist_list} {
760 1.1.1.3 christos set completion_list {}
761 1.1.1.3 christos foreach arglist $arglist_list {
762 1.1.1.3 christos lappend completion_list "[maketype $arglist]::method()"
763 1.1.1.3 christos }
764 1.1.1.3 christos return $completion_list
765 1.1.1.3 christos }
766 1.1.1.3 christos
767 1.1.1.3 christos # Returns a list of elements that look like
768 1.1.1.3 christos # void TYPE::method()
769 1.1.1.3 christos # where TYPE is derived from each arglist in ARGLIST_LIST.
770 1.1.1.3 christos
771 1.1.1.3 christos proc test_makem_1 {arglist_list expected_list} {
772 1.1.1.3 christos set result [makem $arglist_list]
773 1.1.1.3 christos send_log "makem $arglist = $result\n"
774 1.1.1.3 christos send_log "expecting $expected_list\n"
775 1.1.1.3 christos
776 1.1.1.3 christos # Do list equality via canonical strings.
777 1.1.1.3 christos if {[expr {[list {*}$expected_list] eq [list {*}$result]}]} {
778 1.1.1.3 christos pass "makem unit test: $arglist"
779 1.1.1.3 christos } else {
780 1.1.1.3 christos fail "makem unit test: $arglist"
781 1.1.1.3 christos }
782 1.1.1.3 christos }
783 1.1.1.3 christos
784 1.1.1.3 christos # Unit tests for makem.
785 1.1.1.3 christos
786 1.1.1.3 christos proc test_makem {} {
787 1.1.1.3 christos test_makem_1 ai {"a<int>::method()"}
788 1.1.1.3 christos test_makem_1 bi {"b<int>::method()"}
789 1.1.1.3 christos test_makem_1 {ai bi} {"a<int>::method()" "b<int>::method()"}
790 1.1.1.3 christos test_makem_1 {Aaiaai Bbibbi abi cdi} {
791 1.1.1.3 christos "A<a<int>, a<a<int> > >::method()"
792 1.1.1.3 christos "B<b<int>, b<b<int> > >::method()"
793 1.1.1.3 christos "a<b<int> >::method()"
794 1.1.1.3 christos "c<d<int> >::method()"
795 1.1.1.3 christos }
796 1.1.1.3 christos }
797 1.1.1.3 christos
798 1.1.1.3 christos # Test class template containing a (non-templated) method called "method."
799 1.1.1.3 christos
800 1.1.1.3 christos proc_with_prefix template-class-with-method {} {
801 1.1.1.3 christos
802 1.1.1.3 christos foreach {type type_list} \
803 1.1.1.3 christos [list \
804 1.1.1.3 christos "" {aai abi cci cdi Aabicdi Aabiaai Aabiabi Babicdi} \
805 1.1.1.3 christos "a" {aai abi} \
806 1.1.1.3 christos "b" {} \
807 1.1.1.3 christos "c" {cci cdi} \
808 1.1.1.3 christos "A" {Aabicdi Aabiaai Aabiabi} \
809 1.1.1.3 christos "B" {Babicdi} \
810 1.1.1.3 christos "A<a, a>" {Aabiaai Aabiabi} \
811 1.1.1.3 christos "A<a<b>, c>" {Aabicdi}\
812 1.1.1.3 christos "A<a, d>" {} \
813 1.1.1.3 christos "B<a, a>" {} \
814 1.1.1.3 christos "B<a, b>" {} \
815 1.1.1.3 christos "B<a, c>" {Babicdi}] \
816 1.1.1.3 christos {
817 1.1.1.3 christos foreach cmd_prefix {"b" "b -function"} {
818 1.1.1.3 christos set c "$cmd_prefix "
819 1.1.1.3 christos if {$type != ""} {
820 1.1.1.3 christos append c "${type}::"
821 1.1.1.3 christos }
822 1.1.1.3 christos append c "method"
823 1.1.1.3 christos
824 1.1.1.3 christos if {[llength $type_list] > 0} {
825 1.1.1.3 christos test_gdb_complete_unique $c "${c}()"
826 1.1.1.3 christos check_bp_locations_match_list $c [makem $type_list]
827 1.1.1.3 christos } else {
828 1.1.1.3 christos test_gdb_complete_none $c
829 1.1.1.3 christos }
830 1.1.1.3 christos }
831 1.1.1.3 christos }
832 1.1.1.3 christos }
833 1.1.1.3 christos
834 1.1 christos # Test completion of a const-overloaded funtion (const-overload).
835 1.1 christos # Note that "const" appears after the function/method parameters.
836 1.1 christos
837 1.1 christos proc_with_prefix const-overload {} {
838 1.1 christos set completion_list {
839 1.1 christos "struct_with_const_overload::const_overload_fn()"
840 1.1 christos "struct_with_const_overload::const_overload_fn() const"
841 1.1 christos }
842 1.1 christos foreach cmd_prefix {"b" "b -function"} {
843 1.1 christos test_gdb_complete_multiple \
844 1.1 christos "$cmd_prefix " "const_overload_fn" "()" \
845 1.1 christos $completion_list
846 1.1 christos test_gdb_complete_multiple \
847 1.1 christos "$cmd_prefix " "const_overload_fn ( " ")" \
848 1.1 christos $completion_list
849 1.1 christos test_gdb_complete_multiple \
850 1.1 christos "$cmd_prefix " "const_overload_fn()" "" \
851 1.1 christos $completion_list
852 1.1 christos
853 1.1 christos check_bp_locations_match_list \
854 1.1 christos "$cmd_prefix const_overload_fn" \
855 1.1 christos {"struct_with_const_overload::const_overload_fn()"
856 1.1 christos "struct_with_const_overload::const_overload_fn() const"}
857 1.1 christos
858 1.1 christos check_setting_bp_fails "$cmd_prefix const_overload_fn("
859 1.1 christos check_bp_locations_match_list \
860 1.1 christos "$cmd_prefix const_overload_fn()" \
861 1.1 christos {"struct_with_const_overload::const_overload_fn()"}
862 1.1 christos check_bp_locations_match_list \
863 1.1 christos "$cmd_prefix const_overload_fn() const" \
864 1.1 christos {"struct_with_const_overload::const_overload_fn() const"}
865 1.1 christos }
866 1.1 christos }
867 1.1 christos
868 1.1 christos # Same but quote-enclose the function name. This makes the overload
869 1.1 christos # no longer be ambiguous.
870 1.1 christos
871 1.1 christos proc_with_prefix const-overload-quoted {} {
872 1.1 christos foreach cmd_prefix {"b" "b -function"} {
873 1.1 christos set linespec "'const_overload_fn()'"
874 1.1 christos test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
875 1.1 christos check_bp_locations_match_list \
876 1.1 christos "$cmd_prefix $linespec" {
877 1.1 christos "struct_with_const_overload::const_overload_fn()"
878 1.1 christos }
879 1.1 christos
880 1.1 christos set linespec "'const_overload_fn() const'"
881 1.1 christos test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
882 1.1 christos check_bp_locations_match_list \
883 1.1 christos "$cmd_prefix $linespec" {
884 1.1 christos "struct_with_const_overload::const_overload_fn() const"
885 1.1 christos }
886 1.1 christos }
887 1.1 christos }
888 1.1 christos
889 1.1 christos # Test that when the function is unambiguous, linespec completion
890 1.1 christos # appends the end quote char automatically, both ' and ".
891 1.1 christos
892 1.1 christos proc_with_prefix append-end-quote-char-when-unambiguous {} {
893 1.1 christos foreach cmd_prefix {"b" "b -function"} {
894 1.1 christos foreach qc $completion::all_quotes_list {
895 1.1 christos set linespec "${qc}not_overloaded_fn()${qc}"
896 1.1 christos foreach cmd [list "$cmd_prefix ${qc}not_overloaded_fn()" \
897 1.1 christos "$cmd_prefix ${qc}not_overloaded_fn" \
898 1.1 christos "$cmd_prefix ${qc}not_overloaded_"] {
899 1.1 christos test_gdb_complete_unique $cmd "$cmd_prefix $linespec"
900 1.1 christos }
901 1.1 christos check_bp_locations_match_list \
902 1.1 christos "$cmd_prefix $linespec" {"not_overloaded_fn()"}
903 1.1 christos }
904 1.1 christos }
905 1.1 christos }
906 1.1 christos
907 1.1 christos # Test completing symbols of source files.
908 1.1 christos
909 1.1 christos proc_with_prefix in-source-file-unconstrained {} {
910 1.1 christos # First test that unconstrained matching picks up functions from
911 1.1 christos # multiple files.
912 1.1 christos test_gdb_complete_multiple "b " "file_constrained_test" "_cpls" {
913 1.1 christos "file_constrained_test_cpls2_function(int)"
914 1.1 christos "file_constrained_test_cpls_function(int)"
915 1.1 christos }
916 1.1 christos check_setting_bp_fails "b file_constrained_test_cpls"
917 1.1 christos }
918 1.1 christos
919 1.1 christos # Test an unambiguous completion that would be ambiguous if it weren't
920 1.1 christos # for the source file component, due to
921 1.1 christos # "file_constrained_test_cpls_function" in cpls.cc. Test with
922 1.1 christos # different components quoted, and with whitespace before the function
923 1.1 christos # name.
924 1.1 christos
925 1.1 christos proc_with_prefix in-source-file-unambiguous {} {
926 1.1 christos foreach sqc $completion::maybe_quoted_list {
927 1.1 christos foreach fqc $completion::maybe_quoted_list {
928 1.1 christos # Linespec.
929 1.1 christos foreach sep {":" ": "} {
930 1.1 christos set linespec \
931 1.1 christos "${sqc}cpls2.cc${sqc}${sep}${fqc}file_constrained_test_cpls2_function(int)${fqc}"
932 1.1 christos set complete_line "b $linespec"
933 1.1 christos set start [index_after "constrained_test" $complete_line]
934 1.1 christos set input_line [string range $complete_line 0 $start]
935 1.1 christos test_gdb_complete_unique $input_line ${complete_line}
936 1.1 christos check_bp_locations_match_list "b $linespec" {
937 1.1 christos "file_constrained_test_cpls2_function(int)"
938 1.1 christos }
939 1.1 christos }
940 1.1 christos
941 1.1 christos # Explicit location.
942 1.1 christos set source_opt "-source ${sqc}cpls2.cc${sqc}"
943 1.1 christos set function_opt "-function ${fqc}file_constrained_test_cpls2_function(int)${fqc}"
944 1.1 christos set complete_line "b $source_opt $function_opt"
945 1.1 christos set start [index_after "cpls2_functio" $complete_line]
946 1.1 christos set input_line [string range $complete_line 0 $start]
947 1.1 christos test_gdb_complete_unique $input_line ${complete_line}
948 1.1 christos check_bp_locations_match_list "$complete_line" {
949 1.1 christos "file_constrained_test_cpls2_function(int)"
950 1.1 christos }
951 1.1 christos }
952 1.1 christos }
953 1.1 christos }
954 1.1 christos
955 1.1 christos # Test an ambiguous completion constrained by a source file. Test
956 1.1 christos # with different components quoted, and with whitespace before the
957 1.1 christos # function name.
958 1.1 christos
959 1.1 christos proc_with_prefix in-source-file-ambiguous {} {
960 1.1 christos foreach sqc $completion::maybe_quoted_list {
961 1.1 christos foreach fqc $completion::maybe_quoted_list {
962 1.1 christos # Linespec.
963 1.1 christos foreach sep {":" ": "} {
964 1.1 christos set cmd_prefix "b ${sqc}cpls2.cc${sqc}${sep}"
965 1.1 christos test_gdb_complete_multiple "${cmd_prefix}" ${fqc} "" {
966 1.1 christos "another_file_constrained_test_cpls2_function(int)"
967 1.1 christos "file_constrained_test_cpls2_function(int)"
968 1.1 christos } ${fqc} ${fqc}
969 1.1 christos }
970 1.1 christos
971 1.1 christos # Explicit location.
972 1.1 christos test_gdb_complete_multiple \
973 1.1 christos "b -source ${sqc}cpls2.cc${sqc} -function " ${fqc} "" {
974 1.1 christos "another_file_constrained_test_cpls2_function(int)"
975 1.1 christos "file_constrained_test_cpls2_function(int)"
976 1.1 christos } ${fqc} ${fqc}
977 1.1 christos }
978 1.1 christos }
979 1.1 christos }
980 1.1 christos
981 1.1 christos # Check that completing a file name in a linespec auto-appends a colon
982 1.1 christos # instead of a whitespace character.
983 1.1 christos
984 1.1 christos proc_with_prefix source-complete-appends-colon {} {
985 1.1 christos # Test with quotes to make sure the end quote char is put at the
986 1.1 christos # right place.
987 1.1 christos foreach qc $completion::maybe_quoted_list {
988 1.1 christos test_gdb_complete_unique \
989 1.1 christos "b ${qc}cpls2." \
990 1.1 christos "b ${qc}cpls2.cc${qc}" ":"
991 1.1 christos test_gdb_complete_unique \
992 1.1 christos "b ${qc}cpls2.c" \
993 1.1 christos "b ${qc}cpls2.cc${qc}" ":"
994 1.1 christos test_gdb_complete_unique \
995 1.1 christos "b ${qc}cpls2.cc" \
996 1.1 christos "b ${qc}cpls2.cc${qc}" ":"
997 1.1 christos
998 1.1 christos # Same, but with a filename with an hyphen (which is normally
999 1.1 christos # a language word break char).
1000 1.1 christos test_gdb_complete_unique \
1001 1.1 christos "b ${qc}cpls-" \
1002 1.1 christos "b ${qc}cpls-hyphen.cc${qc}" ":"
1003 1.1 christos test_gdb_complete_unique \
1004 1.1 christos "b ${qc}cpls-hyphen" \
1005 1.1 christos "b ${qc}cpls-hyphen.cc${qc}" ":"
1006 1.1 christos }
1007 1.1 christos
1008 1.1 christos # Test the same, but with the name of a nonexisting file.
1009 1.1 christos
1010 1.1 christos # Cursor at the end of the string.
1011 1.1 christos test_gdb_complete_none "b nonexistingfilename.cc"
1012 1.1 christos # Cursor past the end of the string.
1013 1.1 christos test_gdb_complete_multiple "b nonexistingfilename.cc " "" "" \
1014 1.1 christos $completion::keyword_list
1015 1.1 christos foreach qc $completion::all_quotes_list {
1016 1.1 christos # Unterminated quote.
1017 1.1 christos test_gdb_complete_none "b ${qc}nonexistingfilename.cc"
1018 1.1 christos test_gdb_complete_none "b ${qc}nonexistingfilename.cc "
1019 1.1 christos # Terminated quote, cursor at the quote.
1020 1.1 christos test_gdb_complete_unique \
1021 1.1 christos "b ${qc}nonexistingfilename.cc${qc}" \
1022 1.1 christos "b ${qc}nonexistingfilename.cc${qc}"
1023 1.1 christos # Terminated quote, cursor past the quote.
1024 1.1 christos test_gdb_complete_multiple \
1025 1.1 christos "b ${qc}nonexistingfilename.cc${qc} " "" "" \
1026 1.1 christos $completion::keyword_list
1027 1.1 christos }
1028 1.1 christos }
1029 1.1 christos
1030 1.1 christos ####################################################################
1031 1.1 christos
1032 1.1 christos # Test that a colon at the end of the linespec is understood as an
1033 1.1 christos # incomplete scope operator (incomplete-scope-colon), instead of a
1034 1.1 christos # source/function separator.
1035 1.1 christos
1036 1.1 christos proc_with_prefix incomplete-scope-colon {} {
1037 1.1 christos
1038 1.1 christos # Helper for the loop below to simplify it. Tests completion of
1039 1.1 christos # the range defined by the RANGE_SS found in the constructed line.
1040 1.1 christos #
1041 1.1 christos # E.g., with:
1042 1.1 christos #
1043 1.1 christos # source="source.cc"
1044 1.1 christos # fqc="'"
1045 1.1 christos # prototype="ns::function()"
1046 1.1 christos # range_ss="s::f"
1047 1.1 christos #
1048 1.1 christos # we'd try completing with the cursor set in each of the
1049 1.1 christos # underlined range's positions of:
1050 1.1 christos #
1051 1.1 christos # b source.cc:'ns::function()'"
1052 1.1 christos # ^^^^
1053 1.1 christos #
1054 1.1 christos # Also test that setting a breakpoint at the constructed line
1055 1.1 christos # finds the same breakpoint location as completion does.
1056 1.1 christos #
1057 1.1 christos proc incomplete_scope_colon_helper {prototype range_ss {skip_check_bp 0}} {
1058 1.1 christos foreach source {"" "cpls.cc"} {
1059 1.1 christos # Test with and without source quoting.
1060 1.1 christos foreach sqc $completion::maybe_quoted_list {
1061 1.1 christos if {$source == "" && $sqc != ""} {
1062 1.1 christos # Invalid combination.
1063 1.1 christos continue
1064 1.1 christos }
1065 1.1 christos
1066 1.1 christos # Test with and without function quoting.
1067 1.1 christos foreach fqc $completion::maybe_quoted_list {
1068 1.1 christos if {$source == ""} {
1069 1.1 christos set linespec_source ""
1070 1.1 christos set explicit_source ""
1071 1.1 christos } else {
1072 1.1 christos set linespec_source "${sqc}${source}${sqc}:"
1073 1.1 christos set explicit_source "-source ${sqc}${source}${sqc}"
1074 1.1 christos }
1075 1.1 christos
1076 1.1 christos # Even though this use case is trickier with
1077 1.1 christos # linespecs due to the ":" as separator, test both
1078 1.1 christos # linespecs and explicit locations for
1079 1.1 christos # completeness.
1080 1.1 christos foreach location [list \
1081 1.1 christos "${linespec_source}${fqc}$prototype${fqc}" \
1082 1.1 christos "${explicit_source} -function ${fqc}$prototype${fqc}"] {
1083 1.1 christos set complete_line "b $location"
1084 1.1 christos set start [string first $range_ss $complete_line]
1085 1.1 christos set end [expr ($start + [string length $range_ss])]
1086 1.1 christos test_complete_prefix_range $complete_line $start $end
1087 1.1 christos if {!$skip_check_bp} {
1088 1.1 christos check_bp_locations_match_list "b $location" [list "$prototype"]
1089 1.1 christos }
1090 1.1 christos }
1091 1.1 christos }
1092 1.1 christos }
1093 1.1 christos }
1094 1.1 christos }
1095 1.1 christos
1096 1.1 christos incomplete_scope_colon_helper \
1097 1.1 christos "struct_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
1098 1.1 christos "t::i"
1099 1.1 christos
1100 1.1 christos incomplete_scope_colon_helper \
1101 1.1 christos "ns_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
1102 1.1 christos "t::i"
1103 1.1 christos
1104 1.1 christos # Test completing around both "::"s.
1105 1.1 christos foreach range_ss {"t::s" "t::i"} skip_check_bp {0 1} {
1106 1.1 christos incomplete_scope_colon_helper \
1107 1.1 christos "ns2_incomplete_scope_colon_test::struct_in_ns2_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
1108 1.1 christos $range_ss $skip_check_bp
1109 1.1 christos }
1110 1.1 christos }
1111 1.1 christos
1112 1.1 christos # Test completing functions/methods in anonymous namespaces.
1113 1.1 christos
1114 1.1 christos proc_with_prefix anon-ns {} {
1115 1.1 christos foreach cmd_prefix {"b" "b -function"} {
1116 1.1 christos foreach qc $completion::maybe_quoted_list {
1117 1.1 christos test_gdb_complete_unique \
1118 1.1 christos "$cmd_prefix ${qc}anon_ns_function" \
1119 1.1 christos "$cmd_prefix ${qc}anon_ns_function()${qc}"
1120 1.1 christos check_bp_locations_match_list "$cmd_prefix ${qc}anon_ns_function()${qc}" {
1121 1.1 christos "(anonymous namespace)::anon_ns_function()"
1122 1.1 christos "(anonymous namespace)::anon_ns_struct::anon_ns_function()"
1123 1.1 christos "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
1124 1.1 christos "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_struct::anon_ns_function()"
1125 1.1 christos }
1126 1.1 christos }
1127 1.1 christos
1128 1.1 christos # A "(" finds all anonymous namespace functions/methods in all
1129 1.1 christos # scopes.
1130 1.1 christos test_gdb_complete_multiple "$cmd_prefix " "(" "anonymous namespace)::" {
1131 1.1 christos "(anonymous namespace)::anon_ns_function()"
1132 1.1 christos "(anonymous namespace)::anon_ns_struct::anon_ns_function()"
1133 1.1 christos "(anonymous namespace)::overload2_function(overload2_arg3)"
1134 1.1 christos "(anonymous namespace)::overload3_function(int)"
1135 1.1 christos "(anonymous namespace)::overload3_function(long)"
1136 1.1 christos "(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg4)"
1137 1.1 christos "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
1138 1.1 christos "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
1139 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
1140 1.1 christos "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
1141 1.1 christos "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
1142 1.1 christos "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
1143 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
1144 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(long)"
1145 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
1146 1.1 christos "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
1147 1.1 christos "ns_overload3_test::(anonymous namespace)::overload3_function(int)"
1148 1.1 christos "ns_overload3_test::(anonymous namespace)::overload3_function(long)"
1149 1.1 christos "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
1150 1.1 christos "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
1151 1.1 christos "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
1152 1.1 christos "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_struct::anon_ns_function()"
1153 1.1 christos }
1154 1.1 christos
1155 1.1 christos set function "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
1156 1.1 christos test_gdb_complete_unique "$cmd_prefix $function" "$cmd_prefix $function"
1157 1.1 christos check_bp_locations_match_list "$cmd_prefix $function" [list $function]
1158 1.1 christos
1159 1.1 christos # Test completing after the "(anonymous namespace)" part.
1160 1.1 christos test_gdb_complete_unique \
1161 1.1 christos "$cmd_prefix the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_fu" \
1162 1.1 christos "$cmd_prefix $function"
1163 1.1 christos
1164 1.1 christos # Test whitespace in the "(anonymous namespace)" component.
1165 1.1 christos
1166 1.1 christos test_gdb_complete_unique \
1167 1.1 christos "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous namespace )::anon_ns_fu" \
1168 1.1 christos "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous namespace )::anon_ns_function()"
1169 1.1 christos check_setting_bp_fails \
1170 1.1 christos "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous namespace )::anon_ns_fu"
1171 1.1 christos
1172 1.1 christos set function_ws \
1173 1.1 christos "the_anon_ns_wrapper_ns::( anonymous namespace )::anon_ns_function ( )"
1174 1.1 christos test_gdb_complete_unique "$cmd_prefix $function_ws" "$cmd_prefix $function_ws"
1175 1.1 christos check_bp_locations_match_list "$cmd_prefix $function_ws" [list $function]
1176 1.1 christos }
1177 1.1 christos }
1178 1.1 christos
1179 1.1 christos # Basic test for completing "operator<". More extensive C++ operator
1180 1.1 christos # tests in cpls-op.exp.
1181 1.1 christos
1182 1.1 christos proc_with_prefix operator< {} {
1183 1.1 christos # Complete all prefixes between "oper" and the whole prototype.
1184 1.1 christos set function "operator<(foo_enum, foo_enum)"
1185 1.1 christos foreach cmd_prefix {"b" "b -function"} {
1186 1.1 christos set line "$cmd_prefix $function"
1187 1.1 christos set start [index_after "oper" $line]
1188 1.1 christos test_complete_prefix_range $line $start
1189 1.1 christos }
1190 1.1 christos
1191 1.1 christos # There's a label in the function; try completing it. (Exhaustive
1192 1.1 christos # label completion tests further below.)
1193 1.1 christos foreach location [list \
1194 1.1 christos "$function:label1" \
1195 1.1 christos "-function $function -label label1"] {
1196 1.1 christos
1197 1.1 christos set cmd "b $location"
1198 1.1 christos set input_line [string range $cmd 0 [expr [string length $cmd] - 3]]
1199 1.1 christos
1200 1.1 christos test_gdb_complete_unique $input_line $cmd
1201 1.1 christos test_gdb_complete_unique $cmd $cmd
1202 1.1 christos check_bp_locations_match_list $cmd [list "$location"]
1203 1.1 christos }
1204 1.1 christos }
1205 1.1 christos
1206 1.1 christos # Test completion of scopes with an ambiguous prefix.
1207 1.1 christos
1208 1.1 christos proc_with_prefix ambiguous-prefix {} {
1209 1.1 christos foreach cmd_prefix {"b" "b -function"} {
1210 1.1 christos test_gdb_complete_multiple "$cmd_prefix " "ambiguous_pre" "fix_" {
1211 1.1 christos "ambiguous_prefix_global_func()"
1212 1.1 christos "the_ambiguous_prefix_ns::ambiguous_prefix_ns_func()"
1213 1.1 christos "the_ambiguous_prefix_struct::ambiguous_prefix_method()"
1214 1.1 christos }
1215 1.1 christos check_setting_bp_fails "$cmd_prefix ambiguous_prefix_"
1216 1.1 christos }
1217 1.1 christos }
1218 1.1 christos
1219 1.1 christos # Test completion of function labels.
1220 1.1 christos
1221 1.1 christos proc_with_prefix function-labels {} {
1222 1.1 christos # Test with and without a source file component.
1223 1.1 christos foreach_location_functions \
1224 1.1 christos { "" "cpls.cc" } \
1225 1.1 christos { "function_with_labels(int)" } \
1226 1.1 christos {
1227 1.1 christos # Linespec version. Test various spacing around the label
1228 1.1 christos # colon separator.
1229 1.1 christos foreach label_sep {":" " :" ": " " : "} {
1230 1.1 christos set linespec "${location}${label_sep}"
1231 1.1 christos test_gdb_complete_multiple "b $linespec" "l" "abel" {
1232 1.1 christos "label1"
1233 1.1 christos "label2"
1234 1.1 christos }
1235 1.1 christos check_setting_bp_fails "b ${linespec}label"
1236 1.1 christos
1237 1.1 christos set tsep [string trim ${source_sep}]
1238 1.1 christos check_bp_locations_match_list \
1239 1.1 christos "b ${linespec}label1" [list "${source}${tsep}${function}:label1"]
1240 1.1 christos check_bp_locations_match_list \
1241 1.1 christos "b ${linespec}label2" [list "${source}${tsep}${function}:label2"]
1242 1.1 christos }
1243 1.1 christos } \
1244 1.1 christos {
1245 1.1 christos # Explicit locations version.
1246 1.1 christos append location " -label"
1247 1.1 christos test_gdb_complete_multiple "b $location " "l" "abel" {
1248 1.1 christos "label1"
1249 1.1 christos "label2"
1250 1.1 christos }
1251 1.1 christos check_setting_bp_fails "b $location label"
1252 1.1 christos
1253 1.1 christos if {$source != ""} {
1254 1.1 christos set bp_loc_src "-source ${source} "
1255 1.1 christos } else {
1256 1.1 christos set bp_loc_src ""
1257 1.1 christos }
1258 1.1 christos check_bp_locations_match_list \
1259 1.1 christos "b ${location} label1" [list "${bp_loc_src}-function $function -label label1"]
1260 1.1 christos check_bp_locations_match_list \
1261 1.1 christos "b ${location} label2" [list "${bp_loc_src}-function $function -label label2"]
1262 1.1 christos }
1263 1.1 christos }
1264 1.1 christos
1265 1.1 christos # Test that completion after a function name offers keyword
1266 1.1.1.4 christos # (if/inferior/task/thread/-force-condition) matches in linespec mode,
1267 1.1.1.4 christos # and also the explicit location options in explicit locations mode.
1268 1.1 christos
1269 1.1 christos proc_with_prefix keywords-after-function {} {
1270 1.1 christos set explicit_list \
1271 1.1.1.3 christos [lsort [concat \
1272 1.1.1.3 christos $completion::explicit_opts_list \
1273 1.1.1.3 christos $completion::keyword_list]]
1274 1.1 christos
1275 1.1 christos # Test without a source file, with a known source file, and with
1276 1.1 christos # and unknown source file.
1277 1.1 christos # Test a known and an unknown function.
1278 1.1 christos foreach_location_functions \
1279 1.1 christos { "" "cpls.cc" "unknown_file.cc" } \
1280 1.1 christos { "function_with_labels(int)" "unknown_function(int)" } \
1281 1.1 christos {
1282 1.1 christos # Linespec version.
1283 1.1 christos test_gdb_complete_multiple "b ${location} " "" "" \
1284 1.1 christos $completion::keyword_list
1285 1.1 christos } \
1286 1.1 christos {
1287 1.1 christos # Explicit locations version.
1288 1.1 christos test_gdb_complete_multiple "b ${location} " "" "" \
1289 1.1 christos $explicit_list
1290 1.1 christos }
1291 1.1 christos }
1292 1.1 christos
1293 1.1 christos # Same, but after a label.
1294 1.1 christos
1295 1.1 christos proc_with_prefix keywords-after-label {} {
1296 1.1 christos set explicit_list \
1297 1.1.1.3 christos [lsort [concat \
1298 1.1.1.3 christos $completion::explicit_opts_list \
1299 1.1.1.3 christos $completion::keyword_list]]
1300 1.1 christos
1301 1.1 christos foreach_location_labels \
1302 1.1 christos { "" "cpls.cc" } \
1303 1.1 christos { "function_with_labels(int)" "unknown_function(int)" } \
1304 1.1 christos { "label1" "non_existing_label" } \
1305 1.1 christos {
1306 1.1 christos # Linespec version.
1307 1.1 christos test_gdb_complete_multiple "b ${location} " "" "" \
1308 1.1 christos $completion::keyword_list
1309 1.1 christos } \
1310 1.1 christos {
1311 1.1 christos # Explicit locations version.
1312 1.1 christos test_gdb_complete_multiple "b ${location} " "" "" \
1313 1.1 christos $explicit_list
1314 1.1 christos }
1315 1.1 christos }
1316 1.1 christos
1317 1.1 christos # Similar, but after an unknown file, and in linespec mode only.
1318 1.1 christos
1319 1.1 christos proc_with_prefix keywords-after-unknown-file {} {
1320 1.1 christos # Test with and without quoting.
1321 1.1 christos foreach qc $completion::maybe_quoted_list {
1322 1.1 christos set line "b ${qc}unknown_file.cc${qc}: "
1323 1.1 christos test_gdb_complete_multiple $line "" "" $completion::keyword_list
1324 1.1 christos }
1325 1.1 christos }
1326 1.1 christos
1327 1.1 christos # Test that linespec / function completion does not match data
1328 1.1 christos # symbols, only functions/methods.
1329 1.1 christos
1330 1.1 christos proc_with_prefix no-data-symbols {} {
1331 1.1 christos foreach cmd_prefix {"b" "b -function"} {
1332 1.1 christos test_gdb_complete_unique "$cmd_prefix code_" "$cmd_prefix code_function()"
1333 1.1 christos }
1334 1.1 christos }
1335 1.1 christos
1336 1.1 christos
1337 1.1 christos # After "if", we expect an expression, which has a different completer
1338 1.1 christos # that matches data symbols as well. Check that that works.
1339 1.1 christos
1340 1.1 christos proc_with_prefix if-expression {} {
1341 1.1 christos foreach cmd_prefix {"b" "b -function"} {
1342 1.1 christos test_gdb_complete_multiple "$cmd_prefix function() if " "code_" "" {
1343 1.1 christos "code_data"
1344 1.1 christos "code_function()"
1345 1.1 christos }
1346 1.1 christos
1347 1.1 christos test_gdb_complete_unique \
1348 1.1 christos "$cmd_prefix function() if code_data + another_da" \
1349 1.1 christos "$cmd_prefix function() if code_data + another_data"
1350 1.1 christos
1351 1.1 christos test_gdb_complete_unique \
1352 1.1 christos "$cmd_prefix non_existing_function() if code_data + another_da" \
1353 1.1 christos "$cmd_prefix non_existing_function() if code_data + another_data"
1354 1.1 christos
1355 1.1 christos # FIXME: For now, thread and task also use the expression
1356 1.1 christos # completer.
1357 1.1 christos test_gdb_complete_unique \
1358 1.1 christos "$cmd_prefix function() thread code_data + another_da" \
1359 1.1 christos "$cmd_prefix function() thread code_data + another_data"
1360 1.1 christos test_gdb_complete_unique \
1361 1.1 christos "$cmd_prefix function() task code_data + another_da" \
1362 1.1 christos "$cmd_prefix function() task code_data + another_data"
1363 1.1 christos }
1364 1.1 christos }
1365 1.1 christos
1366 1.1 christos # The testcase driver. Calls all test procedures.
1367 1.1 christos
1368 1.1 christos proc test_driver {} {
1369 1.1 christos all-param-prefixes
1370 1.1 christos overload
1371 1.1 christos overload-2
1372 1.1 christos fqn
1373 1.1 christos fqn-2
1374 1.1 christos overload-3
1375 1.1 christos template-overload
1376 1.1 christos template-ret-type
1377 1.1.1.3 christos #test_makefoo
1378 1.1.1.3 christos template-function-foo
1379 1.1.1.3 christos #test_makem
1380 1.1.1.3 christos template-class-with-method
1381 1.1 christos const-overload
1382 1.1 christos const-overload-quoted
1383 1.1 christos append-end-quote-char-when-unambiguous
1384 1.1 christos in-source-file-unconstrained
1385 1.1 christos in-source-file-unambiguous
1386 1.1 christos in-source-file-ambiguous
1387 1.1 christos source-complete-appends-colon
1388 1.1 christos incomplete-scope-colon
1389 1.1 christos anon-ns
1390 1.1 christos operator<
1391 1.1 christos ambiguous-prefix
1392 1.1 christos function-labels
1393 1.1 christos keywords-after-function
1394 1.1 christos keywords-after-label
1395 1.1 christos keywords-after-unknown-file
1396 1.1 christos no-data-symbols
1397 1.1 christos if-expression
1398 1.1 christos }
1399 1.1 christos
1400 1.1 christos test_driver
1401