}
/* Like make_symbol_completion_list, but returns a list of symbols
- defined in a source file FILE. */
+ defined in all source files name SRCFILE. */
static VEC (char_ptr) *
make_file_symbol_completion_list_1 (const char *text, const char *word,
const char *srcfile)
{
- struct symtab *s;
/* The symbol we are completing on. Points in same buffer as text. */
const char *sym_text;
/* Length of sym_text. */
sym_text_len = strlen (sym_text);
- /* Find the symtab for SRCFILE (this loads it if it was not yet read
- in). */
- s = lookup_symtab (srcfile);
- if (s == NULL)
+ /* Go through symtabs for SRCFILE and check the externs and statics
+ for symbols which match. */
+ iterate_over_symtabs (srcfile, [&] (symtab *s)
{
- /* Maybe they typed the file with leading directories, while the
- symbol tables record only its basename. */
- const char *tail = lbasename (srcfile);
-
- if (tail > srcfile)
- s = lookup_symtab (tail);
- }
-
- /* If we have no symtab for that file, return an empty list. */
- if (s == NULL)
- return (return_val);
-
- /* Go through this symtab and check the externs and statics for
- symbols which match. */
- add_symtab_completions (SYMTAB_COMPUNIT (s),
- sym_text, sym_text_len,
- text, word, TYPE_CODE_UNDEF);
+ add_symtab_completions (SYMTAB_COMPUNIT (s),
+ sym_text, sym_text_len,
+ text, word, TYPE_CODE_UNDEF);
+ return false;
+ });
return (return_val);
}
error "somebody incompatibly modified the source files needed by linespec.exp"
}
+gdb_test_no_output "set breakpoint pending off" \
+ "disable pending breakpoints for linespec tests"
+
# Copying files to a remote host loses the directory prefix during
# compilation.
if { [is_remote host] } {
gdb_test "clear one/thefile.cc:$l1" \
"Deleted breakpoint $decimal *" \
"clear breakpoint using dir/file:line"
+
+ if { [readline_is_used] } {
+ # There are functions named 'twodup' in both source files.
+ # Both should be found if we restrict the linespec to the
+ # ambiguous "thefile.cc" source filename. Check both
+ # completion and setting the breakpoint.
+ set tst "complete unique function name in two source files"
+ send_gdb "break thefile.cc:t\t"
+ gdb_test_multiple "" $tst {
+ -re "break thefile.cc:twodup\\(\\) " {
+ pass $tst
+
+ send_gdb "\n"
+ gdb_test "" \
+ "Breakpoint $decimal at $hex: thefile.cc:twodup\\(\\). \[(\]2 locations\[)\]" \
+ "set break at unique function name in two source files"
+ }
+ }
+
+ # Check both completing and setting a breakpoint on a linespec
+ # with a source component, where there's more than one source
+ # file with the same basename. We should find the functions
+ # in all matching sources -- one/thefile.cc and
+ # two/thefile.cc. The "one" file has "z1()", while the "two"
+ # file has "z2()".
+ set tst "complete non-unique function name in two source files"
+ send_gdb "break thefile.cc:z\t"
+ gdb_test_multiple "" $tst {
+ -re "break thefile.cc:z\\\x07" {
+ send_gdb "\t"
+ gdb_test_multiple "" $tst {
+ -re "\r\nz1\\(\\)\[ \t\]+z2\\(\\)\[ \t\]+\r\n$gdb_prompt " {
+ pass $tst
+
+ send_gdb "\n"
+ gdb_test "" \
+ "Function \"z\" not defined in \"thefile.cc\"." \
+ "set break at non-unique function name in two source files"
+ }
+ }
+ }
+ }
+
+ # Now check that disambiguating the source path makes GDB only
+ # match the symbols in that file. "z" should now have a
+ # unique completion to "z1()", and setting the breakpoint
+ # should find only one location.
+ set tst "complete unique function name in disambiguated source file"
+ send_gdb "break one/thefile.cc:z\t"
+ gdb_test_multiple "" $tst {
+ -re "break one/thefile.cc:z1\\(\\) " {
+ pass $tst
+
+ send_gdb "\n"
+ gdb_test "" \
+ "Breakpoint $decimal at $hex: file .*thefile.cc, line \[^\r\n\]*" \
+ "set break at unique function name in disambiguated source file"
+ }
+ }
+
+ # Check that using a non-existing source path does not confuse
+ # GDB. It should not match any symbol.
+ set dir_file "one/thefile.cc"
+ set non_existing "/some/non-existing/absolute/path/prefix/$dir_file"
+ set non_existing_re [string_to_regexp $non_existing]
+
+ set tst "complete functions in non-existing absolute path"
+ send_gdb "break $non_existing:\t"
+ gdb_test_multiple "" $tst {
+ -re "break $non_existing_re:\\\x07" {
+ send_gdb "\t\t"
+ gdb_test_multiple "" $tst {
+ -re "^\\\x07\\\x07" {
+ pass $tst
+
+ # There's a function called 'twodup' in each
+ # of the thefile.cc files. Make sure none is
+ # picked.
+ send_gdb "twodup\n"
+ gdb_test "" \
+ "No source file named $non_existing_re." \
+ "set break in function in non-existing absolute path"
+ }
+ }
+ }
+ }
+ }
}
gdb_test "break thefile.cc:$l1" \
# not the locations.
gdb_test "complete condition " "condition $decimal\r\ncondition $decimal\r\ncondition $decimal"
-gdb_test_no_output "set breakpoint pending off" \
- "disable pending breakpoints for linespec tests"
-
# This is PR breakpoints/12856.
gdb_test "break lspec.cc:nosuchfunction" \
"Function \"nosuchfunction\" not defined in \"lspec.cc\"." \