1# Copyright 1998-2023 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 {[prepare_for_testing "failed to prepare" $testfile \
56	 [list $srcfile $srcfile2] {debug nowarnings}]} {
57    return -1
58}
59
60if {![runto_main]} {
61    return
62}
63
64set timeout 30
65gdb_test_no_output "set max-completions unlimited"
66
67gdb_test_no_output "complete print values\[0\].x." \
68    "field completion with invalid field"
69
70# If there is a non-deprecated completion, it should be returned.
71gdb_test "complete sav" "save" "test non-deprecated completion"
72# If there is only a deprecated completion, then it should be returned.
73gdb_test "complete save-t" "save-tracepoints" "test deprecated completion"
74
75
76#
77# Tag name completion.
78#
79
80gdb_test "complete ptype struct some_" "ptype struct some_struct"
81gdb_test "complete ptype enum some_" "ptype enum some_enum"
82gdb_test "complete ptype union some_" "ptype union some_union"
83
84
85gdb_test "complete set gnutarget aut" "set gnutarget auto"
86
87
88gdb_test "complete set cp-abi aut" "set cp-abi auto"
89
90# Test that completion of commands 'target FOO' works well.
91set targets [list "core" "tfile" "exec"]
92
93# Test that completion of command 'target ctf' if GDB supports ctf
94# target.
95gdb_test_multiple "target ctf" "" {
96    -re "Undefined target command: \"ctf\"\.  Try \"help target\"\.\r\n$gdb_prompt $" {
97    }
98    -re "No CTF directory specified.*\r\n$gdb_prompt $" {
99	lappend targets "ctf"
100    }
101}
102
103# Test artifacts are put in different locations depending on test
104# is a parallel run or not.  Firstly check file exists, and then
105# do the test on file completion.
106
107foreach dir1 [ list "./gdb.base" "./outputs/gdb.base/completion" ] {
108    if { [remote_file host exists ${dir1}/completion]
109	 && [remote_file host exists ${dir1}/completion0.o]
110	 && [remote_file host exists ${dir1}/completion1.o] } {
111	foreach target_name ${targets} {
112	    gdb_test "complete target ${target_name} ${dir1}/completion" \
113		"target ${target_name} ${dir1}/completion.*${dir1}/completion0\\.o.*${dir1}/completion1\\.o.*" \
114		"complete target ${target_name}"
115	}
116	break
117    }
118}
119
120#
121# "set foo unlimited" completion.
122#
123
124# A var_uinteger command.
125gdb_test "complete set height " "set height unlimited"
126gdb_test "complete set height u" "set height unlimited"
127
128# A var_integer command.
129gdb_test "complete set listsize " "set listsize unlimited"
130gdb_test "complete set listsize unl" "set listsize unlimited"
131
132# A var_zuinteger_unlimited command.
133gdb_test "complete set trace-buffer-size " "set trace-buffer-size unlimited"
134gdb_test "complete set trace-buffer-size unl" "set trace-buffer-size unlimited"
135
136# Test "info registers" completion: First determine this
137# architecture's registers and reggroups...
138
139set regs_output [capture_command_output "mt print registers" \
140		     ".*Name.*Nr.*Rel.*Offset.*Size.*Type.\[^\n\]*\n"]
141append regs_output "\n"
142append regs_output [capture_command_output "mt print reggroups" \
143			".*Group.*Type\[^\n]*\n"]
144append regs_output "\n"
145append regs_output [capture_command_output "mt print user-registers" \
146		     ".*Name.*Nr\[^\n]*\n"]
147set all_regs {}
148foreach {- reg} [regexp -all -inline -line {^\s+(\w+)} $regs_output] {
149    lappend all_regs $reg
150}
151
152set all_regs [join [lsort -unique $all_regs]]
153
154# ... and then compare them to the completion of "info registers".
155
156set regs_output [capture_command_output "complete info registers " ""]
157set completed_regs {}
158foreach {-> reg} [regexp -all -inline -line {^info registers (\w+\S*)} $regs_output] {
159    lappend completed_regs $reg
160}
161set completed_regs [join [lsort $completed_regs]]
162gdb_assert {{$all_regs eq $completed_regs}} "complete 'info registers '"
163
164# Tests below are about tab-completion, which doesn't work if readline
165# library isn't used.  Check it first.
166
167if { ![readline_is_used] } {
168    return -1
169}
170
171# The bulk of this test script pre-dates the completion-support
172# library, and should probably (where possible) be converted.
173# However, for now, new tests are being added using this library.
174load_lib completion-support.exp
175
176set test "complete 'hfgfh'"
177send_gdb "hfgfh\t"
178gdb_test_multiple "" "$test" {
179    -re "^hfgfh\\\x07$" {
180	send_gdb "\n"
181	gdb_test_multiple "" $test {
182	    -re "Undefined command: \"hfgfh\"\\.  Try \"help\"\\..*$gdb_prompt $" {
183		pass "$test"
184	    }
185	}
186    }
187}
188
189#exp_internal 0
190
191set test "complete 'show output'"
192send_gdb "show output\t"
193gdb_test_multiple "" "$test" {
194    -re "^show output-radix $" {
195	send_gdb "\n"
196	gdb_test_multiple "" "$test" {
197	    -re "Default output radix for printing of values is 10\\..*$gdb_prompt $" {
198		pass "$test"
199	    }
200	}
201    }
202}
203
204set test "complete 'show output-'"
205send_gdb "show output-\t"
206gdb_test_multiple "" "$test" {
207    -re "^show output-radix $" {
208	send_gdb "\n"
209	gdb_test_multiple "" "$test" {
210	    -re "Default output radix for printing of values is 10\\..*$gdb_prompt $" {
211		pass "$test"
212	    }
213        }
214    }
215}
216
217set test "complete 'p'"
218send_gdb "p\t"
219gdb_test_multiple "" "$test" {
220    -re "^p\\\x07$" {
221	send_gdb "\n"
222	gdb_test_multiple "" "$test" {
223	    -re "The history is empty\\..*$gdb_prompt $" {
224		pass "$test"
225	    }
226        }
227    }
228}
229
230set test "complete 'p '"
231send_gdb "p \t"
232gdb_test_multiple "" "$test" {
233    -re "^p \\\x07$" {
234	send_gdb "\n"
235	gdb_test_multiple "" "$test" {
236	    -re "The history is empty\\..*$gdb_prompt $" {
237		pass "$test"
238	    }
239	}
240    }
241}
242
243set test "complete 'info t foo'"
244send_gdb "info t foo\t"
245gdb_test_multiple "" "$test" {
246    -re "^info t foo\\\x07$" {
247	send_gdb "\n"
248	gdb_test_multiple "" "$test" {
249	    -re "Ambiguous info command \"t foo\": target, tasks, terminal, threads, tp, tracepoints, tvariables, (type-printers, )?types\\..*$gdb_prompt $" {
250		pass "$test"
251	    }
252	}
253    }
254}
255
256set test "complete 'info t'"
257send_gdb "info t\t"
258gdb_test_multiple "" "$test" {
259    -re "^info t\\\x07$" {
260	send_gdb "\n"
261	gdb_test_multiple "" "$test" {
262	    -re "Ambiguous info command \"t\": target, tasks, terminal, threads, tp, tracepoints, tvariables, (type-printers, )?types\\..*$gdb_prompt $" {
263		pass "$test"
264	    }
265	}
266    }
267}
268
269set test "complete 'info t '"
270send_gdb "info t \t"
271gdb_test_multiple "" "$test" {
272    -re "^info t \\\x07$" {
273	send_gdb "\n"
274	gdb_test_multiple "" "$test" {
275	    -re "Ambiguous info command \"t \": target, tasks, terminal, threads, tp, tracepoints, tvariables, (type-printers, )?types\\..*$gdb_prompt $" {
276		pass "$test"
277	    }
278	}
279    }
280}
281
282set test "complete 'info asdfgh'"
283send_gdb "info asdfgh\t"
284gdb_test_multiple "" "$test" {
285    -re "^info asdfgh\\\x07$" {
286	send_gdb "\n"
287	gdb_test_multiple "" "$test" {
288	    -re "Undefined info command: \"asdfgh\".  Try \"help info\"\\..*$gdb_prompt $" {
289		pass "$test"
290	    }
291	}
292    }
293}
294
295set test "complete 'info asdfgh '"
296send_gdb "info asdfgh \t"
297gdb_test_multiple "" "$test" {
298    -re "^info asdfgh \\\x07$" {
299	send_gdb "\n"
300	gdb_test_multiple "" "$test" {
301	    -re "Undefined info command: \"asdfgh \".  Try \"help info\"\\..*$gdb_prompt $" {
302		pass "$test"
303	    }
304	}
305    }
306}
307
308set test "complete 'info'"
309send_gdb "info\t"
310gdb_test_multiple "" "$test" {
311    -re "^info $" {
312	send_gdb "\n"
313	gdb_test_multiple "" "$test" {
314	    -re "List of info subcommands.*$gdb_prompt $" {
315		pass "$test"
316	    }
317	}
318    }
319}
320
321set test "complete 'info '"
322send_gdb "info \t"
323gdb_test_multiple "" "$test" {
324    -re "^info \\\x07$" {
325	send_gdb "\n"
326	gdb_test_multiple "" "$test" {
327	    -re "List of info subcommands:\r\n\r\n.*$gdb_prompt $" {
328		pass "$test"
329	    }
330	}
331    }
332}
333
334set test "complete (2) 'info '"
335send_gdb "info \t"
336gdb_test_multiple "" "$test" {
337    -re "^info \\\x07$" {
338	send_gdb "\t"
339	gdb_test_multiple "" "$test" {
340	    -re "address.*types.*$gdb_prompt " {
341		send_gdb "\n"
342		gdb_test_multiple "" "$test" {
343		    -re "allowed if unambiguous\\..*$gdb_prompt $" {
344			pass "$test"
345		    }
346		}
347	    }
348	}
349    }
350}
351
352set test "complete 'help info wat'"
353send_gdb "help info wat\t"
354gdb_test_multiple "" "$test" {
355    -re "^help info watchpoints $" {
356	send_gdb "\n"
357	gdb_test_multiple "" "$test" {
358	    -re "Status of specified watchpoints.*\r\n.*$gdb_prompt $" {
359		pass "$test"
360	    }
361	}
362    }
363    -re "^help info wat\\\x07$" {
364	fail "$test"
365    }
366}
367
368set test "complete 'p \"break1'"
369send_gdb "p \"break1\t"
370gdb_test_multiple "" "$test" {
371    -re "^p \"break1\\\x07$" {
372	send_gdb "\n"
373	gdb_test_multiple "" "$test" {}
374    }
375    -re "^p \"break1\\.c\"$" {
376	send_gdb "\n"
377	gdb_test_multiple "" "$test" {
378	    -re "$gdb_prompt $" {
379		pass "$test"
380	    }
381	}
382    }
383}
384
385setup_xfail "*-*-*"
386set test "complete 'p \"break1.'"
387send_gdb "p \"break1.\t"
388gdb_test_multiple "" "$test" {
389    -re "^p \"break1\\.\\\x07$" {
390	send_gdb "\n"
391	gdb_test_multiple "" "$test" {}
392    }
393    -re "^p \"break1\\.c\"$" {
394	send_gdb "\n"
395	gdb_test_multiple "" "$test" {
396	    -re "$gdb_prompt $" {
397		pass "$test"
398	    }
399	}
400    }
401    -re "^p \"break1\\..*$" {
402	send_gdb "\n"
403	gdb_test_multiple "" "$test" {}
404    }
405}
406
407set test "complete 'p 'arg'"
408send_gdb "p 'arg\t"
409gdb_test_multiple "" "$test" {
410    -re "^p 'arg\\\x07$" {
411	send_gdb "\n"
412	gdb_test_multiple "" "$test" {
413	    -re "(Invalid character constant\\.|Unmatched single quote\\.).*$gdb_prompt $" {
414		pass "$test"
415	    }
416	}
417    }
418}
419
420set test "complete (2) 'p 'arg'"
421send_gdb "p 'arg\t"
422gdb_test_multiple "" "$test" {
423    -re "^p 'arg\\\x07$" {
424	send_gdb "\t"
425	gdb_test_multiple "" "$test" {
426	    -re "argv.*$gdb_prompt " {
427		send_gdb "\n"
428		gdb_test_multiple "" "$test" {
429		    -re "(Invalid character constant\\.|Unmatched single quote\\.).*$gdb_prompt $" {
430			pass "$test"
431		    }
432		}
433	    }
434	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
435		send_gdb "n"
436		gdb_test_multiple "" "$test" {
437		    -re "\\(gdb\\) p 'arg$" {
438			send_gdb "\n"
439			gdb_test_multiple "" "$test" {
440			    -re "(Invalid character constant\\.|Unmatched single quote\\.).*$gdb_prompt $" {
441				pass "$test"
442			    }
443			}
444		    }
445		}
446	    }
447	}
448    }
449}
450
451set test "complete 'handle signal'"
452send_gdb "handle sigq\t"
453gdb_test_multiple "" "$test" {
454    -re "^handle sigqSIGQUIT $" {
455	send_gdb "\n"
456	gdb_test_multiple "" "$test" {
457	    -re "SIGQUIT.*Quit.*$gdb_prompt $" {
458		pass "$test"
459	    }
460	}
461    }
462}
463
464set test "complete 'handle keyword'"
465send_gdb "handle nos\t"
466gdb_test_multiple "" "$test" {
467    -re "^handle nostop $" {
468	send_gdb "\n"
469	gdb_test_multiple "" "$test" {
470	    -re "$gdb_prompt $" {
471		pass "$test"
472	    }
473	}
474    }
475}
476
477set test "complete help aliases"
478send_gdb "help user-define\t"
479gdb_test_multiple "" "$test" {
480    -re "^help user-defined $" {
481	send_gdb "\n"
482	gdb_test_multiple "" "$test" {
483	    -re "$gdb_prompt $" {
484		pass "$test"
485	    }
486	}
487    }
488}
489
490
491# These tests used to try completing the shorter "p b-a".
492# Unfortunately, on some systems, there are .o files in system
493# libraries which declare static variables named `b'.  Of course,
494# those variables aren't really in scope, as far as the compiler is
495# concerned.  But GDB deliberately tries to be more liberal: if you
496# enter an identifier that doesn't have any binding in scope, GDB will
497# search all the program's compilation units for a static variable of
498# the given name.
499#
500# This behavior can help avoid a lot of pedantry, so it's usually a
501# good thing.  But in this test case, it causes GDB to print the value
502# of some random variable, instead of giving us the "No symbol..."
503# error we were expecting.
504#
505# For example, on S/390 linux, the file s_atan.c in libm.a declares a
506# `b', which is a structure containing an int and a float, so GDB says
507# ``Argument to arithmetic operation not a number or boolean'' instead
508# of ``No symbol ...''.
509#
510# So, I'm hoping that there is no system with a static library variable named
511# `no_var_by_this_name'.
512
513set test "complete 'p no_var_named_this-arg'"
514send_gdb "p no_var_named_this-arg\t"
515gdb_test_multiple "" "$test" {
516    -re "^p no_var_named_this-arg\\\x07$" {
517        send_gdb "\n"
518	gdb_test_multiple "" "$test" {
519            -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
520		pass "$test"
521            }
522        }
523    }
524}
525
526set test "complete (2) 'p no_var_named_this-arg'"
527send_gdb "p no_var_named_this-arg\t"
528gdb_test_multiple "" "$test" {
529    -re "^p no_var_named_this-arg\\\x07$" {
530	send_gdb "\t"
531	gdb_test_multiple "" "$test" {
532	    -re "argv.*$gdb_prompt " {
533		send_gdb "\n"
534		gdb_test_multiple "" "$test" {
535		    -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
536			pass "$test"
537		    }
538		}
539	    }
540	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
541		send_gdb "n\n"
542
543		# Eat the prompt
544		gdb_expect {
545		    -re "$gdb_prompt " {
546			pass "$test (eat prompt)"
547		    }
548		    timeout {
549			fail "(timeout) $test (eat prompt)"
550		    }
551		}
552
553		gdb_test_multiple "" "$test" {
554		    -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
555			pass "$test"
556		    }
557		}
558	    }
559        }
560    }
561}
562
563set test "complete (2) 'p no_var_named_this-'"
564send_gdb "p no_var_named_this-\t"
565gdb_test_multiple "" "$test" {
566    -re "^p no_var_named_this-\\\x07$" {
567	send_gdb "\t"
568	gdb_test_multiple "" "$test" {
569	    -re "(There are $decimal possibilities\\.  Do you really\r\nwish to see them all.|Display all $decimal possibilities.) \\(y or n\\)$" {
570		send_gdb "n\n"
571
572		# Eat the prompt
573		gdb_expect {
574		    -re "$gdb_prompt " {
575			pass "$test (eat prompt)"
576		    }
577		    timeout {
578			fail "(timeout) $test (eat prompt)"
579		    }
580		}
581
582		gdb_test_multiple "" "$test" {
583		    -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
584			pass "$test"
585		    }
586		}
587	    }
588	    -re "argv.*$gdb_prompt $" {
589		send_gdb "\n"
590		gdb_test_multiple "" "$test" {
591		    -re "No symbol \"no_var_named_this\" in current context\\..*$gdb_prompt $" {
592			pass "$test"
593		    }
594		}
595	    }
596	}
597    }
598}
599
600set test "complete 'p values\[0\].a'"
601send_gdb "p values\[0\].a\t"
602gdb_test_multiple "" "$test" {
603    -re "^p values.0..a_field $" {
604	send_gdb "\n"
605	gdb_test_multiple "" "$test" {
606	    -re " = 0.*$gdb_prompt $" {
607		pass "$test"
608	    }
609	}
610    }
611}
612
613set test "complete 'p values\[0\] . a'"
614send_gdb "p values\[0\] . a\t"
615gdb_test_multiple "" "$test" {
616    -re "^p values.0. . a_field $" {
617	send_gdb "\n"
618	gdb_test_multiple "" "$test" {
619	    -re " = 0.*$gdb_prompt $" {
620		pass "$test"
621	    }
622	}
623    }
624}
625
626set test "complete 'p &values\[0\] -> a'"
627send_gdb "p &values\[0\] -> a\t"
628gdb_test_multiple "" "$test" {
629    -re "^p &values.0. -> a_field $" {
630	send_gdb "\n"
631	gdb_test_multiple "" "$test" {
632	    -re " = .*0x\[0-9a-fA-F\]*.*$gdb_prompt $" {
633		pass "$test"
634	    }
635	}
636    }
637}
638
639gdb_test "complete p &values\[0\]->z" \
640    "p &values.0.->z_field" \
641    "completion of field in anonymous union"
642
643gdb_test "complete ptype &values\[0\]->z" \
644    "ptype &values.0.->z_field" \
645    "ptype completion of field in anonymous union"
646
647gdb_test "complete whatis &values\[0\]->z" \
648    "whatis &values.0.->z_field" \
649    "whatis completion of field in anonymous union"
650
651# The following tests used to simply try to complete `${objdir}/file',
652# and so on.  The problem is that ${objdir} can be very long; the
653# completed filename may be more than eighty characters wide.  When
654# this happens, readline tries to manage things, producing output that
655# may make sense on the screen, but is rather hard for our script to
656# recognize.
657#
658# In the case that motivated this change, the (gdb) prompt occupied
659# the leftmost six columns, and `${objdir}/' was seventy-four
660# characters long --- eighty in all.  After printing the slash,
661# readline emitted a space, a carriage return, and then `Makefile'
662# (the tab character being received as input after `Make'.
663#
664# Basically, you have to let readline do whatever it's going to do to
665# make the screen look right.  If it happens to use a different
666# strategy on Tuesdays to get the cursor in the right place, that's
667# not something the testsuite should care about.
668#
669# So, we avoid long lines.  We `cd' to ${srcdir} first, and then do
670# the completion relative to the current directory.
671
672# ${srcdir} may be a relative path.  We want to make sure we end up
673# in the right directory - so make sure we know where it is.
674with_cwd $srcdir {
675    set fullsrcdir [pwd]
676}
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
926# Test completion of 'p', 'x', and 'display' all using a /FMT.
927foreach_with_prefix spc { " " "" } {
928    test_gdb_complete_multiple "p${spc}/d some_union_global." "" "f" {
929	"f1"
930	"f2"
931    }
932
933    test_gdb_complete_none "p${spc}/"
934    test_gdb_complete_unique "p${spc}/d" "p${spc}/d"
935
936    # Try completion on an invalid /FMT string.  GDB doesn't attempt
937    # to validate the /FMT string during completion, the string is
938    # just assumed to be complete when the user hits TAB.
939    test_gdb_complete_unique "p${spc}/@" "p${spc}/@"
940
941    test_gdb_complete_unique "x${spc}/1w values\[0\].b"\
942	"x${spc}/1w values\[0\].b_field"
943
944    test_gdb_complete_unique "display${spc}/x values\[0\].z"\
945	"display${spc}/x values\[0\].z_field"
946}
947
948# Test 'p' using both options and /FMT.
949test_gdb_complete_multiple "p -array on -- /d some_union_global." \
950    "" "f" {
951	"f1"
952	"f2"
953    }
954
955# Check the watch commands can all complete, with and without flags.
956foreach_with_prefix cmd { "watch" "awatch" "rwatch" } {
957    foreach_with_prefix opt { "" "-l" "-location" } {
958	test_gdb_complete_multiple "${cmd} ${opt} some_union_global." \
959	    "" "f" {
960		"f1"
961		"f2"
962	    }
963    }
964}
965
966# Check that tab completion of a deprecated alias does not display the
967# warning about the alias being deprecated during tab completion.
968gdb_test_no_output "alias xxx_yyy_zzz=break"
969gdb_test_no_output "maint deprecate xxx_yyy_zzz"
970test_gdb_complete_unique "xxx_yyy_" "xxx_yyy_zzz"
971
972# Check that tab completion of a deprecated alias with a prefix does
973# not display the warning about the alias being deprecated during tab
974# completion.
975gdb_test_no_output "alias set aaa_bbb_ccc=set debug"
976gdb_test_no_output "maint deprecate set aaa_bbb_ccc"
977test_gdb_complete_unique "set aaa_bbb_" "set aaa_bbb_ccc"
978