-# Copyright 2009, 2010 Free Software Foundation, Inc.
+# Copyright 2009-2019 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
# This file is part of the gdb testsuite.
+load_lib completion-support.exp
+
# A helper procedure to test location completions restricted by
# class.
proc test_class_complete {class expr name matches} {
gdb_test_multiple $cmd $name {
"break ${class}::main" { fail "$name (saw global symbol)" }
$cmd { exp_continue }
- -re "break ${class}::\[A-Za-z0-9_~\]+" {
+ -re "break ${class}::\[^\r\n\]*\r\n" {
set str $expect_out(0,string)
scan $str "break ${class}::%\[^(\]" method
lappend seen $method
}
}
-if $tracelevel then {
- strace $tracelevel
-}
-
if { [skip_cplus_tests] } { continue }
-set testfile pr9594
-set binfile ${objdir}/${subdir}/${testfile}
+standard_testfile pr9594.cc
-if {[gdb_compile "${srcdir}/${subdir}/${testfile}.cc" "${testfile}.o" object {c++ debug}] != ""} {
- untested cpcompletion.exp
+if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
return -1
}
-if {[gdb_compile "${testfile}.o" ${binfile} executable {c++ debug}] != "" } {
- untested cpcompletion.exp
- return -1
+# Tests below are about tab-completion, which doesn't work if readline
+# library isn't used. Check it first.
+
+if { ![readline_is_used] } {
+ untested "no tab completion support without readline"
+ return -1
}
-gdb_exit
+# Test that completion is restricted by class name (all methods)
+test_class_complete Foo "" "complete class methods" \
+ [list Foo Foofoo get_foo set_foo ~Foo]
+
+test_class_complete Foo F "complete class methods beginning with F" \
+ [list Foo Foofoo]
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
+# The tests below depend on the current code scope.
-set bp_location [gdb_get_line_number "Set breakpoint here" ${testfile}.cc]
+set bp_location [gdb_get_line_number "Set breakpoint here" ${srcfile}]
-if {![runto $bp_location]} {
+if {![runto "${srcfile}:$bp_location"]} {
perror "test suppressed"
+ return
}
# This also tests inheritance -- completion should only see a single
# Test completion with an anonymous struct.
gdb_test "complete p a.g" "p a\\.get"
-# Test that completion is restricted by class name (all methods)
-test_class_complete Foo "" "complete class methods" \
- [list Foo Foofoo get_foo set_foo ~Foo]
+with_test_prefix "expression with namespace" {
+ # Before the scope operator, GDB shows all the symbols whose
+ # fully-qualified name matches the completion word.
+ test_gdb_complete_multiple "p " "Test_NS" "" {
+ "Test_NS"
+ "Test_NS::Nested"
+ "Test_NS::Nested::qux"
+ "Test_NS::bar"
+ "Test_NS::foo"
+ }
-test_class_complete Foo F "complete class methods beginning with F" \
- [list Foo Foofoo]
+ # Unlike in linespecs, tab- and complete-command completion work a
+ # bit differently when completing around the scope operator. The
+ # matches in the tab-completion case only show the part of the
+ # symbol after the scope, since ':' is a word break character.
+ set tab_completion_list {
+ "Nested"
+ "Nested::qux"
+ "bar"
+ "foo"
+ }
+ test_gdb_complete_tab_multiple "p Test_NS:" ":" $tab_completion_list
+ test_gdb_complete_tab_multiple "p Test_NS::" "" $tab_completion_list
+
+ # OTOH, the complete command must show the whole command, with
+ # qualified symbol displayed as entered by the user.
+ set cmd_completion_list {
+ "Test_NS::Nested"
+ "Test_NS::Nested::qux"
+ "Test_NS::bar"
+ "Test_NS::foo"
+ }
+ test_gdb_complete_cmd_multiple "p " "Test_NS:" $cmd_completion_list
+ test_gdb_complete_cmd_multiple "p " "Test_NS::" $cmd_completion_list
+
+ # Add a disambiguating character and we get a unique completion.
+ test_gdb_complete_unique "p Test_NS::f" "p Test_NS::foo"
+}