From a81aaca0578ee91ce1cee56c0a31e26c2a5ef581 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Sat, 25 Nov 2017 00:20:31 +0000 Subject: [PATCH] Fix completing an empty string Earlier while working on the big completer rework series, I managed to break (gdb) [TAB] locally, and make GDB crash, but only notice a few weeks down the road, because we have no test for that... I also noticed that: (gdb) [TAB] didn't work (didn't show all commands as matches), even though entering a command with leading whitespace works: (gdb) help This commit fixes the latter and adds a testcase that covers both issues. The gdb.base/completion.exp change is necessary because the new test has a file name that also starts with "gdb.base/complet", making that particular test ambiguous. Adding another letter disambiguates. gdb/ChangeLog: 2017-11-25 Pedro Alves * completer.c (complete_line_internal_1): Skip spaces until the start of the command. gdb/testsuite/ChangeLog: 2017-11-25 Pedro Alves * gdb.base/complete-empty.exp: New file. * gdb.base/completion.exp: Adjust. --- gdb/ChangeLog | 5 ++++ gdb/completer.c | 9 ++++--- gdb/testsuite/ChangeLog | 5 ++++ gdb/testsuite/gdb.base/complete-empty.exp | 44 +++++++++++++++++++++++++++++++ gdb/testsuite/gdb.base/completion.exp | 6 ++--- 5 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 gdb/testsuite/gdb.base/complete-empty.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index befce60..4e0b45e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2017-11-25 Pedro Alves + + * completer.c (complete_line_internal_1): Skip spaces until the + start of the command. + 2017-11-24 Pedro Alves * cp-support.c (cp_symbol_name_matches_1): New, factored out from diff --git a/gdb/completer.c b/gdb/completer.c index 68e9171..f9ece59 100644 --- a/gdb/completer.c +++ b/gdb/completer.c @@ -1270,10 +1270,13 @@ complete_line_internal_1 (completion_tracker &tracker, word = tmp_command + point - strlen (text); } - if (point == 0) + /* Move P up to the start of the command. */ + p = skip_spaces (p); + + if (*p == '\0') { - /* An empty line we want to consider ambiguous; that is, it - could be any command. */ + /* An empty line is ambiguous; that is, it could be any + command. */ c = CMD_LIST_AMBIGUOUS; result_list = 0; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index b45ff7b..afc85c8 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-25 Pedro Alves + + * gdb.base/complete-empty.exp: New file. + * gdb.base/completion.exp: Adjust. + 2017-11-25 Pedro Alves * gdb.linespec/cpls-ops.cc: New file. diff --git a/gdb/testsuite/gdb.base/complete-empty.exp b/gdb/testsuite/gdb.base/complete-empty.exp new file mode 100644 index 0000000..dc57fd0 --- /dev/null +++ b/gdb/testsuite/gdb.base/complete-empty.exp @@ -0,0 +1,44 @@ +# Copyright 2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file is part of the gdb testsuite. + +load_lib completion-support.exp + +gdb_exit +gdb_start + +# Start of tests. + +# Test TAB with no input. +proc_with_prefix empty-input-line {} { + # Set max-completions to 1 to avoid having to hardcode a set of + # command names. + gdb_test_no_output "set max-completions 1" + + # Given the completion limit, this completes to the command with + # the lowest alphanumeric sort, which is, and is likely to remain, + # "!". + test_gdb_complete_unique "" "!" " " 1 + + # Same, but with some leading whitespace. + test_gdb_complete_unique " " " !" " " 1 +} + +proc test_driver {} { + empty-input-line +} + +test_driver diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp index 9c7c17a..4e8187a 100644 --- a/gdb/testsuite/gdb.base/completion.exp +++ b/gdb/testsuite/gdb.base/completion.exp @@ -722,13 +722,13 @@ gdb_test "complete file ./gdb.base/compl" \ "file ./gdb.base/completion\\.exp.*" \ "complete-command 'file ./gdb.base/compl'" -set test "complete 'file ./gdb.base/complet'" -send_gdb "file ./gdb.base/complet\t" +set test "complete 'file ./gdb.base/completi'" +send_gdb "file ./gdb.base/completi\t" gdb_test_multiple "" "$test" { -re "^file ./gdb.base/completion\\.exp $" { send_gdb "\n" # Ignore the exact error message. - gdb_test_multiple "" "complete 'file ./gdb.base/complet'" { + gdb_test_multiple "" "complete 'file ./gdb.base/completi'" { -re "\r\nA program is being debugged already\\.\[\r\n\]+Are you sure you want to change the file\\? \\(y or n\\) $" { send_gdb "n\n" exp_continue -- 2.7.4