completion.exp revision 1.9
1# Copyright 1998-2020 Free Software Foundation, Inc.
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
16# This file was written by Elena Zannoni (ezannoni@cygnus.com)
17
18# This file is part of the gdb testsuite.
19
20#
21# tests for command completion
22#
23# Here are some useful test cases for completion.
24# They should be tested with both M-? and TAB.
25#
26#   "show output-" "radix"
27#   "show output" "-radix"
28#   "p" ambiguous (commands starting with p--path, print, printf, etc.)
29#   "p "  ambiguous (all symbols)
30#   "info t foo" no completions
31#   "info t " no completions
32#   "info t" ambiguous ("info target", "info terminal", etc.)
33#   "info ajksdlfk" no completions
34#   "info ajksdlfk " no completions
35#   "info" " "
36#   "info " ambiguous (all info commands)
37#   "p \"break1" unambiguous (completes to filename "break1.c")
38#   "p \"break1." unambiguous (should complete to "break1.c" but does not,
39#	due to readline limitations)
40#   "p 'arg" ambiguous (all symbols starting with arg)
41#   "p b-arg" ambiguous (all symbols starting with arg)
42#   "p b-" ambiguous (all symbols)
43#   "file Make" "file" (word break hard to screw up here)
44#   "file ../gdb.stabs/we" "ird" (needs to not break word at slash)
45#
46
47
48
49#
50# test running programs
51#
52
53standard_testfile break.c break1.c
54
55if [get_compiler_info] {
56    return -1
57}
58
59if {[prepare_for_testing "failed to prepare" $testfile \
60	 [list $srcfile $srcfile2] {debug nowarnings}]} {
61    return -1
62}
63
64if ![runto_main] then {
65        perror "tests suppressed"
66}
67
68set timeout 30
69gdb_test_no_output "set max-completions unlimited"
70
71gdb_test_no_output "complete print values\[0\].x." \
72    "field completion with invalid field"
73
74# If there is a non-deprecated completion, it should be returned.
75gdb_test "complete sav" "save" "test non-deprecated completion"
76# If there is only a deprecated completion, then it should be returned.
77gdb_test "complete save-t" "save-tracepoints" "test deprecated completion"
78
79
80#
81# Tag name completion.
82#
83
84gdb_test "complete ptype struct some_" "ptype struct some_struct"
85gdb_test "complete ptype enum some_" "ptype enum some_enum"
86gdb_test "complete ptype union some_" "ptype union some_union"
87
88
89gdb_test "complete set gnutarget aut" "set gnutarget auto"
90
91
92gdb_test "complete set cp-abi aut" "set cp-abi auto"
93
94# Test that completion of commands 'target FOO' works well.
95set targets [list "core" "tfile" "exec"]
96
97# Test that completion of command 'target ctf' if GDB supports ctf
98# target.
99gdb_test_multiple "target ctf" "" {
100    -re "Undefined target command: \"ctf\"\.  Try \"help target\"\.\r\n$gdb_prompt $" {
101    }
102    -re "No CTF directory specified.*\r\n$gdb_prompt $" {
103	lappend targets "ctf"
104    }
105}
106
107# Test artifacts are put in different locations depending on test
108# is a parallel run or not.  Firstly check file exists, and then
109# do the test on file completion.
110
111foreach dir1 [ list "./gdb.base" "./outputs/gdb.base/completion" ] {
112    if { [remote_file host exists ${dir1}/completion]
113	 && [remote_file host exists ${dir1}/completion0.o]
114	 && [remote_file host exists ${dir1}/completion1.o] } {
115	foreach target_name ${targets} {
116	    gdb_test "complete target ${target_name} ${dir1}/completion" \
117		"target ${target_name} ${dir1}/completion.*${dir1}/completion0\\.o.*${dir1}/completion1\\.o.*" \
118		"complete target ${target_name}"
119	}
120	break
121    }
122}
123
124#
125# "set foo unlimited" completion.
126#
127
128# A var_uinteger command.
129gdb_test "complete set height " "set height unlimited"
130gdb_test "complete set height u" "set height unlimited"
131
132# A var_integer command.
133gdb_test "complete set listsize " "set listsize unlimited"
134gdb_test "complete set listsize unl" "set listsize unlimited"
135
136# A var_zuinteger_unlimited command.
137gdb_test "complete set trace-buffer-size " "set trace-buffer-size unlimited"
138gdb_test "complete set trace-buffer-size unl" "set trace-buffer-size unlimited"
139
140# Test "info registers" completion: First determine this
141# architecture's registers and reggroups...
142
143set regs_output [capture_command_output "mt print registers" \
144		     ".*Name.*Nr.*Rel.*Offset.*Size.*Type.\[^\n\]*\n"]
145append regs_output "\n"
146append regs_output [capture_command_output "mt print reggroups" \
147			".*Group.*Type\[^\n]*\n"]
148append regs_output "\n"
149append regs_output [capture_command_output "mt print user-registers" \
150		     ".*Name.*Nr\[^\n]*\n"]
151set all_regs {}
152foreach {- reg} [regexp -all -inline -line {^\s+(\w+)} $regs_output] {
153    lappend all_regs $reg
154}
155
156set all_regs [join [lsort -unique $all_regs]]
157
158# ... and then compare them to the completion of "info registers".
159
160set regs_output [capture_command_output "complete info registers " ""]
161set completed_regs {}
162foreach {-> reg} [regexp -all -inline -line {^info registers (\w+\S*)} $regs_output] {
163    lappend completed_regs $reg
164}
165set completed_regs [join [lsort $completed_regs]]
166gdb_assert {{$all_regs eq $completed_regs}} "complete 'info registers '"
167
168# Tests below are about tab-completion, which doesn't work if readline
169# library isn't used.  Check it first.
170
171if { ![readline_is_used] } {
172    return -1
173}
174
175set test "complete 'hfgfh'"
176send_gdb "hfgfh\t"
177gdb_test_multiple "" "$test" {
178    -re "^hfgfh\\\x07$" {
179	send_gdb "\n"
180	gdb_test_multiple "" $test {
181	    -re "Undefined command: \"hfgfh\"\\.  Try \"help\"\\..*$gdb_prompt $" {
182		pass "$test"
183	    }
184	}
185    }
186}
187
188#exp_internal 0
189
190set test "complete 'show output'"
191send_gdb "show output\t"
192gdb_test_multiple "" "$test" {
193    -re "^show output-radix $" {
194	send_gdb "\n"
195	gdb_test_multiple "" "$test" {
196	    -re "Default output radix for printing of values is 10\\..*$gdb_prompt $" {
197		pass "$test"
198	    }
199	}
200    }
201}
202
203set test "complete 'show output-'"
204send_gdb "show output-\t"
205gdb_test_multiple "" "$test" {
206    -re "^show output-radix $" {
207	send_gdb "\n"
208	gdb_test_multiple "" "$test" {
209	    -re "Default output radix for printing of values is 10\\..*$gdb_prompt $" {
210		pass "$test"
211	    }
212        }
213    }
214}
215
216set test "complete 'p'"
217send_gdb "p\t"
218gdb_test_multiple "" "$test" {
219    -re "^p\\\x07$" {
220	send_gdb "\n"
221	gdb_test_multiple "" "$test" {
222	    -re "The history is empty\\..*$gdb_prompt $" {
223		pass "$test"
224	    }
225        }
226    }
227}
228
229set test "complete 'p '"
230send_gdb "p \t"
231gdb_test_multiple "" "$test" {
232    -re "^p \\\x07$" {
233	send_gdb "\n"
234	gdb_test_multiple "" "$test" {
235	    -re "The history is empty\\..*$gdb_prompt $" {
236		pass "$test"
237	    }
238	}
239    }
240}
241
242set test "complete 'info t foo'"
243send_gdb "info t foo\t"
244gdb_test_multiple "" "$test" {
245    -re "^info t foo\\\x07$" {
246	send_gdb "\n"
247	gdb_test_multiple "" "$test" {
248	    -re "Ambiguous info command \"t foo\": target, tasks, terminal, threads, tp, tracepoints, tvariables, (type-printers, )?types\\..*$gdb_prompt $" {
249		pass "$test"
250	    }
251	}
252    }
253}
254
255set test "complete 'info t'"
256send_gdb "info t\t"
257gdb_test_multiple "" "$test" {
258    -re "^info t\\\x07$" {
259	send_gdb "\n"
260	gdb_test_multiple "" "$test" {
261	    -re "Ambiguous info command \"t\": target, tasks, terminal, threads, tp, tracepoints, tvariables, (type-printers, )?types\\..*$gdb_prompt $" {
262		pass "$test"
263	    }
264	}
265    }
266}
267
268set test "complete 'info t '"
269send_gdb "info t \t"
270gdb_test_multiple "" "$test" {
271    -re "^info t \\\x07$" {
272	send_gdb "\n"
273	gdb_test_multiple "" "$test" {
274	    -re "Ambiguous info command \"t \": target, tasks, terminal, threads, tp, tracepoints, tvariables, (type-printers, )?types\\..*$gdb_prompt $" {
275		pass "$test"
276	    }
277	}
278    }
279}
280
281set test "complete 'info asdfgh'"
282send_gdb "info asdfgh\t"
283gdb_test_multiple "" "$test" {
284    -re "^info asdfgh\\\x07$" {
285	send_gdb "\n"
286	gdb_test_multiple "" "$test" {
287	    -re "Undefined info command: \"asdfgh\".  Try \"help info\"\\..*$gdb_prompt $" {
288		pass "$test"
289	    }
290	}
291    }
292}
293
294set test "complete 'info asdfgh '"
295send_gdb "info asdfgh \t"
296gdb_test_multiple "" "$test" {
297    -re "^info asdfgh \\\x07$" {
298	send_gdb "\n"
299	gdb_test_multiple "" "$test" {
300	    -re "Undefined info command: \"asdfgh \".  Try \"help info\"\\..*$gdb_prompt $" {
301		pass "$test"
302	    }
303	}
304    }
305}
306
307set test "complete 'info'"
308send_gdb "info\t"
309gdb_test_multiple "" "$test" {
310    -re "^info $" {
311	send_gdb "\n"
312	gdb_test_multiple "" "$test" {
313	    -re "List of info subcommands.*$gdb_prompt $" {
314		pass "$test"
315	    }
316	}
317    }
318}
319
320set test "complete 'info '"
321send_gdb "info \t"
322gdb_test_multiple "" "$test" {
323    -re "^info \\\x07$" {
324	send_gdb "\n"
325	gdb_test_multiple "" "$test" {
326	    -re "List of info subcommands:\r\n\r\n.*$gdb_prompt $" {
327		pass "$test"
328	    }
329	}
330    }
331}
332
333set test "complete (2) 'info '"
334send_gdb "info \t"
335gdb_test_multiple "" "$test" {
336    -re "^info \\\x07$" {
337	send_gdb "\t"
338	gdb_test_multiple "" "$test" {
339	    -re "address.*types.*$gdb_prompt " {
340		send_gdb "\n"
341		gdb_test_multiple "" "$test" {
342		    -re "allowed if unambiguous\\..*$gdb_prompt $" {
343			pass "$test"
344		    }
345		}
346	    }
347	}
348    }
349}
350
351set test "complete 'help info wat'"
352send_gdb "help info wat\t"
353gdb_test_multiple "" "$test" {
354    -re "^help info watchpoints $" {
355	send_gdb "\n"
356	gdb_test_multiple "" "$test" {
357	    -re "Status of specified watchpoints.*\r\n.*$gdb_prompt $" {
358		pass "$test"
359	    }
360	}
361    }
362    -re "^help info wat\\\x07$" {
363	fail "$test"
364    }
365}
366
367set test "complete 'p \"break1'"
368send_gdb "p \"break1\t"
369gdb_test_multiple "" "$test" {
370    -re "^p \"break1\\\x07$" {
371	send_gdb "\n"
372	gdb_test_multiple "" "$test" {}
373    }
374    -re "^p \"break1\\.c\"$" {
375	send_gdb "\n"
376	gdb_test_multiple "" "$test" {
377	    -re "$gdb_prompt $" {
378		pass "$test"
379	    }
380	}
381    }
382}
383
384setup_xfail "*-*-*"
385set test "complete 'p \"break1.'"
386send_gdb "p \"break1.\t"
387gdb_test_multiple "" "$test" {
388    -re "^p \"break1\\.\\\x07$" {
389	send_gdb "\n"
390	gdb_test_multiple "" "$test" {}
391    }
392    -re "^p \"break1\\.c\"$" {
393	send_gdb "\n"
394	gdb_test_multiple "" "$test" {
395	    -re "$gdb_prompt $" {
396		pass "$test"
397	    }
398	}
399    }
400    -re "^p \"break1\\..*$" {
401	send_gdb "\n"
402	gdb_test_multiple "" "$test" {}
403    }
404}
405
406set test "complete 'p 'arg'"
407send_gdb "p 'arg\t"
408gdb_test_multiple "" "$test" {
409    -re "^p 'arg\\\x07$" {
410	send_gdb "\n"
411	gdb_test_multiple "" "$test" {
412	    -re "(Invalid character constant\\.|Unmatched single quote\\.).*$gdb_prompt $" {
413		pass "$test"
414	    }
415	}
416    }
417}
418
419set test "complete (2) 'p 'arg'"
420send_gdb "p 'arg\t"
421gdb_test_multiple "" "$test" {
422    -re "^p 'arg\\\x07$" {
423	send_gdb "\t"
424	gdb_test_multiple "" "$test" {
425	    -re "argv.*$gdb_prompt " {
426		send_gdb "\n"
427		gdb_test_multiple "" "$test" {
428		    -re "(Invalid character constant\\.|Unmatched single quote\\.).*$gdb_prompt $" {
429			pass "$test"
430		    }
431		}
432	    }
433	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
434		send_gdb "n"
435		gdb_test_multiple "" "$test" {
436		    -re "\\(gdb\\) p 'arg$" {
437			send_gdb "\n"
438			gdb_test_multiple "" "$test" {
439			    -re "(Invalid character constant\\.|Unmatched single quote\\.).*$gdb_prompt $" {
440				pass "$test"
441			    }
442			}
443		    }
444		}
445	    }
446	}
447    }
448}
449
450set test "complete 'handle signal'"
451send_gdb "handle sigq\t"
452gdb_test_multiple "" "$test" {
453    -re "^handle sigqSIGQUIT $" {
454	send_gdb "\n"
455	gdb_test_multiple "" "$test" {
456	    -re "SIGQUIT.*Quit.*$gdb_prompt $" {
457		pass "$test"
458	    }
459	}
460    }
461}
462
463set test "complete 'handle keyword'"
464send_gdb "handle nos\t"
465gdb_test_multiple "" "$test" {
466    -re "^handle nostop $" {
467	send_gdb "\n"
468	gdb_test_multiple "" "$test" {
469	    -re "$gdb_prompt $" {
470		pass "$test"
471	    }
472	}
473    }
474}
475
476set test "complete help aliases"
477send_gdb "help user-define\t"
478gdb_test_multiple "" "$test" {
479    -re "^help user-defined $" {
480	send_gdb "\n"
481	gdb_test_multiple "" "$test" {
482	    -re "$gdb_prompt $" {
483		pass "$test"
484	    }
485	}
486    }
487}
488
489
490# These tests used to try completing the shorter "p b-a".
491# Unfortunately, on some systems, there are .o files in system
492# libraries which declare static variables named `b'.  Of course,
493# those variables aren't really in scope, as far as the compiler is
494# concerned.  But GDB deliberately tries to be more liberal: if you
495# enter an identifier that doesn't have any binding in scope, GDB will
496# search all the program's compilation units for a static variable of
497# the given name.
498#
499# This behavior can help avoid a lot of pedantry, so it's usually a
500# good thing.  But in this test case, it causes GDB to print the value
501# of some random variable, instead of giving us the "No symbol..."
502# error we were expecting.
503#
504# For example, on S/390 linux, the file s_atan.c in libm.a declares a
505# `b', which is a structure containing an int and a float, so GDB says
506# ``Argument to arithmetic operation not a number or boolean'' instead
507# of ``No symbol ...''.
508#
509# So, I'm hoping that there is no system with a static library variable named
510# `no_var_by_this_name'.
511
512set test "complete 'p no_var_named_this-arg'"
513send_gdb "p no_var_named_this-arg\t"
514gdb_test_multiple "" "$test" {
515    -re "^p no_var_named_this-arg\\\x07$" {
516        send_gdb "\n"
517	gdb_test_multiple "" "$test" {
518            -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
519		pass "$test"
520            }
521        }
522    }
523}
524
525set test "complete (2) 'p no_var_named_this-arg'"
526send_gdb "p no_var_named_this-arg\t"
527gdb_test_multiple "" "$test" {
528    -re "^p no_var_named_this-arg\\\x07$" {
529	send_gdb "\t"
530	gdb_test_multiple "" "$test" {
531	    -re "argv.*$gdb_prompt " {
532		send_gdb "\n"
533		gdb_test_multiple "" "$test" {
534		    -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
535			pass "$test"
536		    }
537		}
538	    }
539	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
540		send_gdb "n\n"
541
542		# Eat the prompt
543		gdb_expect {
544		    -re "$gdb_prompt " {
545			pass "$test (eat prompt)"
546		    }
547		    timeout {
548			fail "(timeout) $test (eat prompt)"
549		    }
550		}
551
552		gdb_test_multiple "" "$test" {
553		    -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
554			pass "$test"
555		    }
556		}
557	    }
558        }
559    }
560}
561
562set test "complete (2) 'p no_var_named_this-'"
563send_gdb "p no_var_named_this-\t"
564gdb_test_multiple "" "$test" {
565    -re "^p no_var_named_this-\\\x07$" {
566	send_gdb "\t"
567	gdb_test_multiple "" "$test" {
568	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
569		send_gdb "n\n"
570
571		# Eat the prompt
572		gdb_expect {
573		    -re "$gdb_prompt " {
574			pass "$test (eat prompt)"
575		    }
576		    timeout {
577			fail "(timeout) $test (eat prompt)"
578		    }
579		}
580
581		gdb_test_multiple "" "$test" {
582		    -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
583			pass "$test"
584		    }
585		}
586	    }
587	    -re "argv.*$gdb_prompt $" {
588		send_gdb "\n"
589		gdb_test_multiple "" "$test" {
590		    -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
591			pass "$test"
592		    }
593		}
594	    }
595	}
596    }
597}
598
599set test "complete 'p values\[0\].a'"
600send_gdb "p values\[0\].a\t"
601gdb_test_multiple "" "$test" {
602    -re "^p values.0..a_field $" {
603	send_gdb "\n"
604	gdb_test_multiple "" "$test" {
605	    -re " = 0.*$gdb_prompt $" {
606		pass "$test"
607	    }
608	}
609    }
610}
611
612set test "complete 'p values\[0\] . a'"
613send_gdb "p values\[0\] . a\t"
614gdb_test_multiple "" "$test" {
615    -re "^p values.0. . a_field $" {
616	send_gdb "\n"
617	gdb_test_multiple "" "$test" {
618	    -re " = 0.*$gdb_prompt $" {
619		pass "$test"
620	    }
621	}
622    }
623}
624
625set test "complete 'p &values\[0\] -> a'"
626send_gdb "p &values\[0\] -> a\t"
627gdb_test_multiple "" "$test" {
628    -re "^p &values.0. -> a_field $" {
629	send_gdb "\n"
630	gdb_test_multiple "" "$test" {
631	    -re " = .*0x\[0-9a-fA-F\]*.*$gdb_prompt $" {
632		pass "$test"
633	    }
634	}
635    }
636}
637
638gdb_test "complete p &values\[0\]->z" \
639    "p &values.0.->z_field" \
640    "completion of field in anonymous union"
641
642gdb_test "complete ptype &values\[0\]->z" \
643    "ptype &values.0.->z_field" \
644    "ptype completion of field in anonymous union"
645
646gdb_test "complete whatis &values\[0\]->z" \
647    "whatis &values.0.->z_field" \
648    "whatis completion of field in anonymous union"
649
650# The following tests used to simply try to complete `${objdir}/file',
651# and so on.  The problem is that ${objdir} can be very long; the
652# completed filename may be more than eighty characters wide.  When
653# this happens, readline tries to manage things, producing output that
654# may make sense on the screen, but is rather hard for our script to
655# recognize.
656#
657# In the case that motivated this change, the (gdb) prompt occupied
658# the leftmost six columns, and `${objdir}/' was seventy-four
659# characters long --- eighty in all.  After printing the slash,
660# readline emitted a space, a carriage return, and then `Makefile'
661# (the tab character being received as input after `Make'.
662#
663# Basically, you have to let readline do whatever it's going to do to
664# make the screen look right.  If it happens to use a different
665# strategy on Tuesdays to get the cursor in the right place, that's
666# not something the testsuite should care about.
667#
668# So, we avoid long lines.  We `cd' to ${srcdir} first, and then do
669# the completion relative to the current directory.
670
671# ${srcdir} may be a relative path.  We want to make sure we end up
672# in the right directory - so make sure we know where it is.
673set mydir [pwd]
674cd ${srcdir}
675set fullsrcdir [pwd]
676cd ${mydir}
677
678# If the directory name contains a '+' we must escape it, adding a backslash.
679# If not, the test below will fail because it will interpret the '+' as a
680# regexp operator. We use string_to_regexp for this purpose.
681
682gdb_test "cd ${fullsrcdir}" \
683         "Working directory [string_to_regexp ${fullsrcdir}].*" \
684         "cd to \${srcdir}"
685
686
687# GDB used to fail adding / on directories, on the first try only.
688set uniquedir ../testsuite/gdb.base/comp-dir
689set escapeduniquedir [string_to_regexp ${uniquedir}]
690set uniquesu subdi
691set uniquesub ${uniquesu}r
692set escapeuniquesub [string_to_regexp ${uniquesub}]
693send_gdb "dir ${uniquedir}\t"
694gdb_expect {
695	-re "${escapeduniquedir}/" {
696	    pass "directory completion"
697	    send_gdb "${uniquesu}\t"
698	}
699	-re "${escapeduniquedir} $" {
700	    fail "directory completion (old gdb bug)"
701	    send_gdb "\b/${uniquesu}\t"
702	}
703	default {
704	    fail "directory completion (timeout)"
705	    send_gdb "\ndir ${uniquedir}/${uniquesu}\t"
706	}
707}
708
709gdb_expect {
710	-re "${escapeuniquesub}/$" {
711	    pass "directory completion 2"
712	}
713	timeout {
714	    fail "directory completion 2"
715	}
716}
717
718# Empty COMMAND sends no newline while " " sends the newline we need.
719gdb_test " " "Source directories searched: .*" "glob remaining of directory test"
720
721gdb_test "complete file ./gdb.base/compl" \
722    "file ./gdb.base/completion\\.exp.*" \
723    "complete-command 'file ./gdb.base/compl'"
724
725set test "complete 'file ./gdb.base/completi'"
726send_gdb "file ./gdb.base/completi\t"
727gdb_test_multiple "" "$test" {
728    -re "^file ./gdb.base/completion\\.exp $" {
729	send_gdb "\n"
730	# Ignore the exact error message.
731	gdb_test_multiple "" "complete 'file ./gdb.base/completi'" {
732	    -re "\r\nA program is being debugged already\\.\[\r\n\]+Are you sure you want to change the file\\? \\(y or n\\) $" {
733		send_gdb "n\n"
734		exp_continue
735	    }
736	    -re "$gdb_prompt $" {
737		pass "$test"
738	    }
739	}
740    }
741}
742
743set test "complete 'info func marke'"
744send_gdb "info func marke\t"
745gdb_test_multiple "" "$test" {
746    -re "^info func marke.*r$" {
747	send_gdb "\t\t"
748	gdb_test_multiple "" "$test" {
749	    -re "marker1.*$gdb_prompt " {
750		send_gdb "\n"
751		gdb_test_multiple "" "$test" {
752		    -re "All functions matching regular expression \"marker\":.*File.*break1.c:.*\tint marker1\\((void|)\\);\r\n.*:\tint marker2\\(int\\).*marker3\\(char.*char.*\\).*marker4\\(long( int)?\\);.*$gdb_prompt $" {
753			pass "$test"
754		    }
755		}
756	    }
757	}
758    }
759}
760
761
762set test "complete 'set follow-fork-mode'"
763send_gdb "set follow-fork-mode \t\t"
764gdb_test_multiple "" "$test" {
765    -re "child.*parent.*$gdb_prompt " {
766	send_gdb "\n"
767	gdb_test_multiple "" "$test" {
768	    -re "Requires an argument.*child.*parent.*$gdb_prompt $" {
769		pass "$test"
770	    }
771	    -re "Ambiguous item \"\"\\..*$gdb_prompt $" {
772		pass "$test"
773	    }
774	}
775    }
776}
777
778#
779# Tests for the location completer
780#
781
782# Turn off pending breakpoint support so that we don't get queried
783# all the time.
784gdb_test_no_output "set breakpoint pending off"
785
786set subsrc [string range $srcfile 0 [expr {[string length $srcfile] - 3}]]
787set test "tab complete break $subsrc"
788send_gdb "break $subsrc\t\t"
789gdb_test_multiple "" $test {
790    -re "break\.c.*break1\.c.*$gdb_prompt " {
791	send_gdb "1\t\n"
792	gdb_test_multiple "" $test {
793	    -re "malformed linespec error: unexpected end of input\r\n$gdb_prompt " {
794		pass $test
795	    }
796	    -re "$gdb_prompt p$" {
797		fail $test
798	    }
799	}
800    }
801
802    -re "$gdb_prompt p$" {
803	fail $test
804    }
805}
806
807gdb_test "complete break $subsrc" "break\.c.*break1\.c"
808
809set test "tab complete break need"
810send_gdb "break need\t"
811gdb_test_multiple "" $test {
812    -re "break need_malloc " {
813	send_gdb "\n"
814	gdb_test_multiple "" $test {
815	    -re ".*Breakpoint.*at .*/$srcfile, line .*$gdb_prompt " {
816		pass $test
817		gdb_test_no_output "delete breakpoint \$bpnum" \
818		    "delete breakpoint for $test"
819	    }
820	    -re "$gdb_prompt p$" {
821		fail $test
822	    }
823	}
824    }
825    -re "$gdb_prompt p$" {
826	fail $test
827    }
828}
829
830gdb_test "complete break need" "need_malloc"
831
832# gdb/17960
833# Enabling max-completions is necessary to trigger the bug.
834gdb_test_no_output "set max-completions 10"
835set test "tab complete break $srcfile:ma"
836send_gdb "break $srcfile:ma\t"
837gdb_test_multiple "" $test {
838    -re "break $srcfile:main " {
839	send_gdb "\n"
840	gdb_test_multiple "" $test {
841	    -re ".*Breakpoint.*at .*/$srcfile, line .*$gdb_prompt " {
842		pass $test
843		gdb_test_no_output "delete breakpoint \$bpnum" \
844		    "delete breakpoint for $test"
845	    }
846	    -re "$gdb_prompt p$" {
847		fail $test
848	    }
849	}
850    }
851    -re "$gdb_prompt p$" {
852	fail $test
853    }
854}
855
856gdb_test "complete break $srcfile:ma" "break\.c:main"
857
858# End of gdb/17960 testing.
859
860#
861# Completion limiting.
862#
863
864gdb_test_no_output "set max-completions 5"
865
866proc ignore_and_resync {cmd result test} {
867    global gdb_prompt
868
869    gdb_test_multiple "" "$test" {
870	-re "^${cmd}$" {
871	    # Complete the command and ignore the output
872	    # to resync gdb for the next test.
873	    send_gdb "\n"
874	    gdb_test_multiple "" "$test" {
875		-re "$gdb_prompt $" {
876		    $result $test
877		}
878	    }
879	}
880    }
881}
882
883proc test_tab_complete {cmd test} {
884    global gdb_prompt
885
886    send_gdb "${cmd}\t"
887    gdb_test_multiple "" "$test" {
888	-re "^${cmd}\\\x07$" {
889	    send_gdb "\t"
890	    gdb_test_multiple "" "$test" {
891		-re "List may be truncated, max-completions reached.*\r\n$gdb_prompt " {
892		    ignore_and_resync $cmd pass $test
893		}
894		-re "$gdb_prompt " {
895		    ignore_and_resync $cmd fail $test
896		}
897	    }
898	}
899    }
900}
901
902test_tab_complete "p" \
903    "command-name completion limiting using tab character"
904
905set test "command-name completion limiting using complete command"
906send_gdb "complete p\n"
907gdb_test_multiple "" "$test" {
908    -re "List may be truncated, max-completions reached.*\r\n$gdb_prompt $" {
909	pass "$test"
910    }
911}
912
913gdb_test_no_output "set max-completions 3"
914
915test_tab_complete "p marker" \
916    "symbol-name completion limiting using tab character"
917
918set test "symbol-name completion limiting using complete command"
919send_gdb "complete p mark\n"
920gdb_test_multiple "" "$test" {
921    -re "List may be truncated, max-completions reached.*\r\n$gdb_prompt $" {
922	pass "$test"
923    }
924}
925