[06/40] Expression completer should not match explicit location options
Commit Message
On 06/29/2017 12:24 PM, Yao Qi wrote:
> Pedro Alves <palves@redhat.com> writes:
>
>> commands that take expressions (not linespecs/locations) as
>> arguments, such as the "print" command, do _not_ understand
>> the "-source", "-function" etc. switches. Instead, "-foo" is
>> understood as an expression applying unary minus on a symbol
>> named "foo" (think "print -1").
>
> This paragraph is useful. Thanks for the explanation. Patch is good to
> me.
Rewrote the commit log in that direction, and pushed it in, then.
From eb17d4137dc83a373b8968cd20b256fa8073a4ca Mon Sep 17 00:00:00 2001
From: Pedro Alves <palves@redhat.com>
Date: Thu, 29 Jun 2017 15:52:38 +0100
Subject: [PATCH] Expression completer should not match explicit location
options
This commit fixes a mismatch between what "print" command completer
thinks the command understands, and what the command actually
understands.
The explicit location options are understood by commands that take
(linespecs and) explicit locations as argument. I.e, breakpoint
commands, and "list". For example:
(gdb) b -source file.c -function my_func
So for those commands, it makes sense that the completer
completes:
"b -sour[TAB]" -> "b -source "
"b -functi[TAB]" -> "b -function "
etc.
However, completion for commands that take expressions (not
linespecs/locations) as arguments, such as the "print" command, also
completes the explicit location options, even though those switches
aren't really understood by these commands. Instead, "-foo" is
understood as an expression applying unary minus on a symbol named
"foo" (think "print -1"):
(gdb) p -func[TAB]
(gdb) p -function [RET]
No symbol "function" in current context.
The patch fixes this by having the expression_completer function
bypass the function that completes explicit locations.
New regression tests included.
gdb/ChangeLog:
2017-06-29 Pedro Alves <palves@redhat.com>
* completer.c (expression_completer): Call
linespec_location_completer instead of location_completer.
gdb/testsuite/ChangeLog:
2017-06-29 Pedro Alves <palves@redhat.com>
* gdb.base/printcmds.exp: Add tests.
---
gdb/ChangeLog | 5 +++++
gdb/testsuite/ChangeLog | 4 ++++
gdb/completer.c | 2 +-
gdb/testsuite/gdb.base/printcmds.exp | 6 ++++++
4 files changed, 16 insertions(+), 1 deletion(-)
@@ -1,5 +1,10 @@
2017-06-29 Pedro Alves <palves@redhat.com>
+ * completer.c (expression_completer): Call
+ linespec_location_completer instead of location_completer.
+
+2017-06-29 Pedro Alves <palves@redhat.com>
+
* completer.c (expression_completer): Remove code that recomputes
'text' from 'word'.
@@ -1,3 +1,7 @@
+2017-06-29 Pedro Alves <palves@redhat.com>
+
+ * gdb.base/printcmds.exp: Add tests.
+
2017-06-28 Doug Gilmore <Doug.Gilmore@imgtec.com>
PR gdb/21337
@@ -635,7 +635,7 @@ expression_completer (struct cmd_list_element *ignore,
xfree (fieldname);
/* Not ideal but it is what we used to do before... */
- return location_completer (ignore, text, word);
+ return linespec_location_completer (ignore, text, word);
}
/* See definition in completer.h. */
@@ -931,6 +931,12 @@ gdb_test "ptype \"abc\"" " = char \\\[4\\\]"
gdb_test "print \$cvar = \"abc\"" " = \"abc\""
gdb_test "print sizeof (\$cvar)" " = 4"
+# GDB used to complete the explicit location options even when
+# printing expressions.
+gdb_test_no_output "complete p -function"
+gdb_test_no_output "complete p -line"
+gdb_test_no_output "complete p -source"
+
gdb_file_cmd ${binfile}
gdb_test "print \$pc" "No registers\\." "print \$pc (with file)"