PR gdb/17960 Internal error: tracker != NULL when completing on file:function
authorDoug Evans <dje@google.com>
Mon, 10 Aug 2015 19:23:09 +0000 (12:23 -0700)
committerDoug Evans <dje@google.com>
Mon, 10 Aug 2015 19:23:09 +0000 (12:23 -0700)
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.

gdb/ChangeLog
gdb/symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/completion.exp

index 0d71d23..624fba8 100644 (file)
@@ -1,3 +1,11 @@
+2015-08-10  Doug Evans  <dje@google.com>
+           Keith Seitz  <keiths@redhat.com>
+
+       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-10  Joel Brobecker  <brobecker@adacore.com>
 
        * infrun.c (follow_fork, displaced_step_prepare, resume): Remove
index ebafe53..5278265 100644 (file)
@@ -5604,9 +5604,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;
@@ -5662,8 +5662,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);
@@ -5699,6 +5697,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.  */
index 813b249..294fbce 100644 (file)
@@ -1,3 +1,9 @@
+2015-08-10  Doug Evans  <dje@google.com>
+           Keith Seitz  <keiths@redhat.com>
+
+       PR gdb/17960
+       * gdb.base/completion.exp: Add location completer tests.
+
 2015-08-07  Pedro Alves  <palves@redhat.com>
 
        * gdb.arch/ppc64-atomic-inst.exp (do_test): New procedure, move
index 1eb0fd8..f0e4dec 100644 (file)
@@ -777,6 +777,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.
 #