From: Doug Evans Date: Mon, 10 Aug 2015 20:37:46 +0000 (-0700) Subject: PR gdb/17960 Internal error: tracker != NULL when completing on file:function X-Git-Tag: gdb-7.10-release~35 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3649abf39ee70a6237a06df85cf027dcc0d03c56;p=thirdparty%2Fbinutils-gdb.git PR gdb/17960 Internal error: tracker != NULL when completing on file:function gdb/ChangeLog: * symtab.c (make_file_symbol_completion_list_1): Renamed from make_file_symbol_completion_list and made static. (make_file_symbol_completion_list): New function. gdb/testsuite/ChangeLog: * gdb.base/completion.exp: Add location completer tests. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4d4e8dd25e2..e48068c8144 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2015-08-10 Doug Evans + Keith Seitz + + PR gdb/17960 + * symtab.c (make_file_symbol_completion_list_1): Renamed from + make_file_symbol_completion_list and made static. + (make_file_symbol_completion_list): New function. + 2015-08-06 Clem Dickey PR python/17136 diff --git a/gdb/symtab.c b/gdb/symtab.c index 2b6af6ccd19..7d3b228275f 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -5598,9 +5598,9 @@ make_symbol_completion_list_fn (struct cmd_list_element *ignore, /* Like make_symbol_completion_list, but returns a list of symbols defined in a source file FILE. */ -VEC (char_ptr) * -make_file_symbol_completion_list (const char *text, const char *word, - const char *srcfile) +static VEC (char_ptr) * +make_file_symbol_completion_list_1 (const char *text, const char *word, + const char *srcfile) { struct symbol *sym; struct symtab *s; @@ -5656,8 +5656,6 @@ make_file_symbol_completion_list (const char *text, const char *word, sym_text_len = strlen (sym_text); - return_val = NULL; - /* Find the symtab for SRCFILE (this loads it if it was not yet read in). */ s = lookup_symtab (srcfile); @@ -5693,6 +5691,36 @@ make_file_symbol_completion_list (const char *text, const char *word, return (return_val); } +/* Wrapper around make_file_symbol_completion_list_1 + to handle MAX_COMPLETIONS_REACHED_ERROR. */ + +VEC (char_ptr) * +make_file_symbol_completion_list (const char *text, const char *word, + const char *srcfile) +{ + struct cleanup *back_to, *cleanups; + + completion_tracker = new_completion_tracker (); + cleanups = make_cleanup_free_completion_tracker (&completion_tracker); + return_val = NULL; + back_to = make_cleanup (do_free_completion_list, &return_val); + + TRY + { + make_file_symbol_completion_list_1 (text, word, srcfile); + } + CATCH (except, RETURN_MASK_ERROR) + { + if (except.error != MAX_COMPLETIONS_REACHED_ERROR) + throw_exception (except); + } + END_CATCH + + discard_cleanups (back_to); + do_cleanups (cleanups); + return return_val; +} + /* A helper function for make_source_files_completion_list. It adds another file name to a list of possible completions, growing the list as necessary. */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 9445c2cac86..6357c877e2f 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-08-10 Doug Evans + Keith Seitz + + PR gdb/17960 + * gdb.base/completion.exp: Add location completer tests. + 2015-08-06 Pedro Alves * gdb.threads/forking-threads-plus-breakpoint.exp: New file. diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp index 1eb0fd801a0..f0e4dec9b54 100644 --- a/gdb/testsuite/gdb.base/completion.exp +++ b/gdb/testsuite/gdb.base/completion.exp @@ -776,6 +776,88 @@ gdb_test_multiple "" "$test" { } } +# +# Tests for the location completer +# + +# Turn off pending breakpoint support so that we don't get queried +# all the time. +gdb_test_no_output "set breakpoint pending off" + +set subsrc [string range $srcfile 0 [expr {[string length $srcfile] - 3}]] +set test "tab complete break $subsrc" +send_gdb "break $subsrc\t\t" +gdb_test_multiple "" $test { + -re "break\.c.*break1\.c.*$gdb_prompt " { + send_gdb "1\t\n" + gdb_test_multiple "" $test { + -re ".*Function \"$srcfile2\" not defined\..*$gdb_prompt " { + pass $test + } + -re "$gdb_prompt p$" { + fail $test + } + } + } + + -re "$gdb_prompt p$" { + fail $test + } +} + +gdb_test "complete break $subsrc" "break\.c.*break1\.c" + +set test "tab complete break need" +send_gdb "break need\t" +gdb_test_multiple "" $test { + -re "break need_malloc " { + send_gdb "\n" + gdb_test_multiple "" $test { + -re ".*Breakpoint.*at .*/$srcfile, line .*$gdb_prompt " { + pass $test + gdb_test_no_output "delete breakpoint \$bpnum" \ + "delete breakpoint for $test" + } + -re "$gdb_prompt p$" { + fail $test + } + } + } + -re "$gdb_prompt p$" { + fail $test + } +} + +gdb_test "complete break need" "need_malloc" + +# gdb/17960 +# Enabling max-completions is necessary to trigger the bug. +gdb_test_no_output "set max-completions 10" +set test "tab complete break $srcfile:ma" +send_gdb "break $srcfile:ma\t" +gdb_test_multiple "" $test { + -re "break $srcfile:main " { + send_gdb "\n" + gdb_test_multiple "" $test { + -re ".*Breakpoint.*at .*/$srcfile, line .*$gdb_prompt " { + pass $test + gdb_test_no_output "delete breakpoint \$bpnum" \ + "delete breakpoint for $test" + } + -re "$gdb_prompt p$" { + fail $test + } + } + } + -re "$gdb_prompt p$" { + fail $test + } +} + +gdb_test "complete break $srcfile:ma" "break\.c:main" + +# End of gdb/17960 testing. + # # Completion limiting. #