Home | History | Annotate | Line # | Download | only in gdb.linespec
cpcompletion.exp revision 1.1.1.2
      1  1.1.1.2  christos # Copyright 2017-2020 Free Software Foundation, Inc.
      2      1.1  christos 
      3      1.1  christos # This program is free software; you can redistribute it and/or modify
      4      1.1  christos # it under the terms of the GNU General Public License as published by
      5      1.1  christos # the Free Software Foundation; either version 3 of the License, or
      6      1.1  christos # (at your option) any later version.
      7      1.1  christos #
      8      1.1  christos # This program is distributed in the hope that it will be useful,
      9      1.1  christos # but WITHOUT ANY WARRANTY; without even the implied warranty of
     10      1.1  christos # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11      1.1  christos # GNU General Public License for more details.
     12      1.1  christos #
     13      1.1  christos # You should have received a copy of the GNU General Public License
     14      1.1  christos # along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15      1.1  christos 
     16      1.1  christos # This file is part of the gdb testsuite.
     17      1.1  christos 
     18      1.1  christos load_lib completion-support.exp
     19      1.1  christos 
     20      1.1  christos standard_testfile cpls.cc cpls2.cc cpls-hyphen.cc
     21      1.1  christos 
     22      1.1  christos if {[prepare_for_testing "failed to prepare" $testfile \
     23      1.1  christos 	 [list $srcfile $srcfile2 $srcfile3] {debug}]} {
     24      1.1  christos     return -1
     25      1.1  christos }
     26      1.1  christos 
     27      1.1  christos # Tests below are about tab-completion, which doesn't work if readline
     28      1.1  christos # library isn't used.  Check it first.
     29      1.1  christos 
     30      1.1  christos if { ![readline_is_used] } {
     31      1.1  christos     untested "no tab completion support without readline"
     32      1.1  christos     return -1
     33      1.1  christos }
     34      1.1  christos 
     35      1.1  christos # Disable the completion limit for the whole testcase.
     36      1.1  christos gdb_test_no_output "set max-completions unlimited"
     37      1.1  christos 
     38      1.1  christos # Start of tests.
     39      1.1  christos 
     40      1.1  christos # Test completion of all parameter prefixes, crossing "(" and ")",
     41      1.1  christos # with and without whitespace.
     42      1.1  christos 
     43      1.1  christos proc_with_prefix all-param-prefixes {} {
     44      1.1  christos 
     45      1.1  christos     # Test both linespecs and explicit locations.
     46      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
     47      1.1  christos 	set line "$cmd_prefix param_prefixes_test_long(long)"
     48      1.1  christos 	set start [index_after "test_long" $line]
     49      1.1  christos 	test_complete_prefix_range $line $start
     50      1.1  christos 
     51      1.1  christos 	# Same, but with extra spaces.  Note that the original spaces in
     52      1.1  christos 	# the input line are preserved after completion.
     53      1.1  christos 	test_gdb_complete_unique \
     54      1.1  christos 	    "$cmd_prefix param_prefixes_test_long(long "   \
     55      1.1  christos 	    "$cmd_prefix param_prefixes_test_long(long )"
     56      1.1  christos 	test_gdb_complete_unique \
     57      1.1  christos 	    "$cmd_prefix param_prefixes_test_long( long "  \
     58      1.1  christos 	    "$cmd_prefix param_prefixes_test_long( long )"
     59      1.1  christos 	test_gdb_complete_unique \
     60      1.1  christos 	    "$cmd_prefix param_prefixes_test_long ( long " \
     61      1.1  christos 	    "$cmd_prefix param_prefixes_test_long ( long )"
     62      1.1  christos 
     63      1.1  christos 	# Complete all parameter prefixes between "(i" and "(int*, int&)".
     64      1.1  christos 	# Note that this exercises completing when the point is at the
     65      1.1  christos 	# space in "param_prefixes_test_intp_intr(int*, ".
     66      1.1  christos 	set line "$cmd_prefix param_prefixes_test_intp_intr(int*, int&)"
     67      1.1  christos 	set start [index_after "intp_intr" $line]
     68      1.1  christos 	test_complete_prefix_range $line $start
     69      1.1  christos 
     70      1.1  christos 	# Similar, but with extra spaces.
     71      1.1  christos 	test_gdb_complete_unique \
     72      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int* " \
     73      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int* , int&)"
     74      1.1  christos 
     75      1.1  christos 	test_gdb_complete_unique \
     76      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *" \
     77      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *, int&)"
     78      1.1  christos 
     79      1.1  christos 	test_gdb_complete_unique \
     80      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *, int " \
     81      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *, int &)"
     82      1.1  christos 
     83      1.1  christos 	test_gdb_complete_unique \
     84      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *,  int & " \
     85      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *,  int & )"
     86      1.1  christos     }
     87      1.1  christos }
     88      1.1  christos 
     89      1.1  christos # Test completion of an overloaded function.
     90      1.1  christos 
     91      1.1  christos proc_with_prefix overload {} {
     92      1.1  christos     set completion_list {
     93      1.1  christos 	"overload_ambiguous_test(int, int)"
     94      1.1  christos 	"overload_ambiguous_test(int, long)"
     95      1.1  christos 	"overload_ambiguous_test(long)"
     96      1.1  christos     }
     97      1.1  christos 
     98      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
     99      1.1  christos 	test_gdb_complete_multiple \
    100      1.1  christos 	    "$cmd_prefix " "overload_ambiguous_" "test(" \
    101      1.1  christos 	    $completion_list
    102      1.1  christos 	check_bp_locations_match_list \
    103      1.1  christos 	    "$cmd_prefix overload_ambiguous_test" \
    104      1.1  christos 	    $completion_list
    105      1.1  christos 
    106      1.1  christos 	# Test disambiguating by typing enough to pick the "int" as
    107      1.1  christos 	# first parameter type.  This then tests handling ambiguity in
    108      1.1  christos 	# the second parameter, which checks that tab completion when
    109      1.1  christos 	# the point is at the whitespace behaves naturally, by showing
    110      1.1  christos 	# the remaining matching overloads to the user.
    111      1.1  christos 	test_gdb_complete_multiple \
    112      1.1  christos 	    "$cmd_prefix " "overload_ambiguous_test(i" "nt, " {
    113      1.1  christos 	    "overload_ambiguous_test(int, int)"
    114      1.1  christos 	    "overload_ambiguous_test(int, long)"
    115      1.1  christos 	}
    116      1.1  christos 
    117      1.1  christos 	# Add a few more characters to make the completion
    118      1.1  christos 	# unambiguous.
    119      1.1  christos 	test_gdb_complete_unique \
    120      1.1  christos 	    "$cmd_prefix overload_ambiguous_test(int, i" \
    121      1.1  christos 	    "$cmd_prefix overload_ambiguous_test(int, int)"
    122      1.1  christos 	check_bp_locations_match_list \
    123      1.1  christos 	    "$cmd_prefix overload_ambiguous_test(int, int)" {
    124      1.1  christos 		"overload_ambiguous_test(int, int)"
    125      1.1  christos 	    }
    126      1.1  christos     }
    127      1.1  christos }
    128      1.1  christos 
    129      1.1  christos # Test completion of a function that is defined in different scopes
    130      1.1  christos # with different parameters.
    131      1.1  christos 
    132      1.1  christos proc_with_prefix overload-2 {} {
    133      1.1  christos     with_test_prefix "all" {
    134      1.1  christos 	set completion_list {
    135      1.1  christos 	    "(anonymous namespace)::overload2_function(overload2_arg3)"
    136      1.1  christos 	    "(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg4)"
    137      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    138      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    139      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    140      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
    141      1.1  christos 	    "ns_overload2_test::overload2_function(overload2_arg5)"
    142      1.1  christos 	    "ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"
    143      1.1  christos 	    "overload2_function(overload2_arg1)"
    144      1.1  christos 	    "struct_overload2_test::overload2_function(overload2_arg2)"
    145      1.1  christos 	}
    146      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    147      1.1  christos 	    test_gdb_complete_multiple \
    148      1.1  christos 		"$cmd_prefix " "overload2_func" "tion(overload2_arg" $completion_list
    149      1.1  christos 	    check_bp_locations_match_list \
    150      1.1  christos 		"$cmd_prefix overload2_function" $completion_list
    151      1.1  christos 	}
    152      1.1  christos     }
    153      1.1  christos 
    154      1.1  christos     # Same, but restrict to functions/methods in some scope.
    155      1.1  christos     with_test_prefix "restrict scope" {
    156      1.1  christos 	set completion_list {
    157      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    158      1.1  christos 	    "ns_overload2_test::overload2_function(overload2_arg5)"
    159      1.1  christos 	}
    160      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    161      1.1  christos 	    test_gdb_complete_multiple \
    162      1.1  christos 		"$cmd_prefix " "ns_overload2_test::overload2_func" "tion(overload2_arg" $completion_list
    163      1.1  christos 	    check_bp_locations_match_list \
    164      1.1  christos 		"$cmd_prefix ns_overload2_test::overload2_function" $completion_list
    165      1.1  christos 	}
    166      1.1  christos     }
    167      1.1  christos 
    168      1.1  christos     # Restrict to anonymous namespace scopes.
    169      1.1  christos     with_test_prefix "restrict scope 2" {
    170      1.1  christos 	set completion_list {
    171      1.1  christos 	    "(anonymous namespace)::overload2_function(overload2_arg3)"
    172      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    173      1.1  christos 	}
    174      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    175      1.1  christos 	    test_gdb_complete_multiple \
    176      1.1  christos 		"$cmd_prefix " "(anonymous namespace)::overload2_func" "tion(overload2_arg" $completion_list
    177      1.1  christos 	    check_bp_locations_match_list \
    178      1.1  christos 		"$cmd_prefix (anonymous namespace)::overload2_function" $completion_list
    179      1.1  christos 	}
    180      1.1  christos     }
    181      1.1  christos 
    182      1.1  christos     # Add enough scopes, and we get a unique completion.
    183      1.1  christos     with_test_prefix "unique completion" {
    184      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    185      1.1  christos 	    test_gdb_complete_unique \
    186      1.1  christos 		"$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_func" \
    187      1.1  christos 		"$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    188      1.1  christos 	    check_setting_bp_fails "$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_func"
    189      1.1  christos 	    check_bp_locations_match_list \
    190      1.1  christos 		"$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_function" \
    191      1.1  christos 		{"ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"}
    192      1.1  christos 	}
    193      1.1  christos     }
    194      1.1  christos }
    195      1.1  christos 
    196      1.1  christos # Test linespecs / locations using fully-qualified names.
    197      1.1  christos 
    198      1.1  christos proc_with_prefix fqn {} {
    199      1.1  christos 
    200      1.1  christos     # "-qualified" works with both explicit locations and linespecs.
    201      1.1  christos     # Also test that combining a source file with a function name
    202      1.1  christos     # still results in a full match, with both linespecs and explicit
    203      1.1  christos     # locations.
    204      1.1  christos     foreach cmd_prefix {
    205      1.1  christos 	"b -qualified "
    206      1.1  christos 	"b -qualified -function "
    207      1.1  christos 	"b -qualified cpls.cc:"
    208      1.1  christos 	"b -qualified -source cpls.cc -function "
    209      1.1  christos 	"b -source cpls.cc -qualified -function "
    210      1.1  christos     } {
    211      1.1  christos 	test_gdb_complete_unique \
    212      1.1  christos 	    "${cmd_prefix}overload2_func" \
    213      1.1  christos 	    "${cmd_prefix}overload2_function(overload2_arg1)"
    214      1.1  christos 
    215      1.1  christos 	# Drill down until we find a unique completion.
    216      1.1  christos 	test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::" "" {
    217      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    218      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    219      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    220      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
    221      1.1  christos 	    "ns_overload2_test::overload2_function(overload2_arg5)"
    222      1.1  christos 	    "ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"
    223      1.1  christos 	}
    224      1.1  christos 
    225      1.1  christos 	test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::(anonymous namespace)::" "" {
    226      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    227      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    228      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    229      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
    230      1.1  christos 	}
    231      1.1  christos 
    232      1.1  christos 	test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::(anonymous namespace)::ns_overload2_test::" "" {
    233      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    234      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    235      1.1  christos 	}
    236      1.1  christos 
    237      1.1  christos 	test_gdb_complete_unique \
    238      1.1  christos 	    "${cmd_prefix}ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_func" \
    239      1.1  christos 	    "${cmd_prefix}ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    240      1.1  christos 
    241      1.1  christos     }
    242      1.1  christos }
    243      1.1  christos 
    244      1.1  christos # Check that a fully-qualified lookup name doesn't match symbols in
    245      1.1  christos # nested scopes.
    246      1.1  christos 
    247      1.1  christos proc_with_prefix fqn-2 {} {
    248      1.1  christos     set linespec "struct_overload2_test::overload2_function(overload2_arg6)"
    249      1.1  christos     set cmd_prefix "b -qualified"
    250      1.1  christos     check_setting_bp_fails "$cmd_prefix $linespec"
    251      1.1  christos     test_gdb_complete_none "$cmd_prefix $linespec"
    252      1.1  christos 
    253      1.1  christos     # Check that using the same name, but not fully-qualifying it,
    254      1.1  christos     # would find something, just to make sure the test above is
    255      1.1  christos     # testing what we intend to test.
    256      1.1  christos     set cmd_prefix "b -function"
    257      1.1  christos     test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
    258      1.1  christos     check_bp_locations_match_list \
    259      1.1  christos 	"$cmd_prefix $linespec" \
    260      1.1  christos 	{"ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"}
    261      1.1  christos }
    262      1.1  christos 
    263      1.1  christos # Test completion of functions in different scopes that have the same
    264      1.1  christos # name and parameters.  Restricting the scopes should find fewer and
    265      1.1  christos # fewer matches.
    266      1.1  christos 
    267      1.1  christos proc_with_prefix overload-3 {} {
    268      1.1  christos     with_test_prefix "all overloads" {
    269      1.1  christos 	set completion_list {
    270      1.1  christos 	    "(anonymous namespace)::overload3_function(int)"
    271      1.1  christos 	    "(anonymous namespace)::overload3_function(long)"
    272      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    273      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    274      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
    275      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(long)"
    276      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
    277      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
    278      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::overload3_function(int)"
    279      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::overload3_function(long)"
    280      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    281      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    282      1.1  christos 	    "ns_overload3_test::overload3_function(int)"
    283      1.1  christos 	    "ns_overload3_test::overload3_function(long)"
    284      1.1  christos 	    "ns_overload3_test::struct_overload3_test::overload3_function(int)"
    285      1.1  christos 	    "ns_overload3_test::struct_overload3_test::overload3_function(long)"
    286      1.1  christos 	    "overload3_function(int)"
    287      1.1  christos 	    "overload3_function(long)"
    288      1.1  christos 	    "struct_overload3_test::overload3_function(int)"
    289      1.1  christos 	    "struct_overload3_test::overload3_function(long)"
    290      1.1  christos 	}
    291      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    292      1.1  christos 	    test_gdb_complete_multiple "$cmd_prefix " "overload3_func" "tion(" $completion_list
    293      1.1  christos 	    check_bp_locations_match_list "$cmd_prefix overload3_function" $completion_list
    294      1.1  christos 	}
    295      1.1  christos     }
    296      1.1  christos 
    297      1.1  christos     with_test_prefix "restrict overload" {
    298      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    299      1.1  christos 	    test_gdb_complete_unique \
    300      1.1  christos 		"$cmd_prefix overload3_function(int)" \
    301      1.1  christos 		"$cmd_prefix overload3_function(int)"
    302      1.1  christos 	    check_bp_locations_match_list "$cmd_prefix overload3_function(int)" {
    303      1.1  christos 		"(anonymous namespace)::overload3_function(int)"
    304      1.1  christos 		"(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    305      1.1  christos 		"ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
    306      1.1  christos 		"ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
    307      1.1  christos 		"ns_overload3_test::(anonymous namespace)::overload3_function(int)"
    308      1.1  christos 		"ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    309      1.1  christos 		"ns_overload3_test::overload3_function(int)"
    310      1.1  christos 		"ns_overload3_test::struct_overload3_test::overload3_function(int)"
    311      1.1  christos 		"overload3_function(int)"
    312      1.1  christos 		"struct_overload3_test::overload3_function(int)"
    313      1.1  christos 	    }
    314      1.1  christos 	}
    315      1.1  christos     }
    316      1.1  christos 
    317      1.1  christos     with_test_prefix "restrict scope" {
    318      1.1  christos 	set completion_list {
    319      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    320      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    321      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
    322      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
    323      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    324      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    325      1.1  christos 	    "ns_overload3_test::struct_overload3_test::overload3_function(int)"
    326      1.1  christos 	    "ns_overload3_test::struct_overload3_test::overload3_function(long)"
    327      1.1  christos 	    "struct_overload3_test::overload3_function(int)"
    328      1.1  christos 	    "struct_overload3_test::overload3_function(long)"
    329      1.1  christos 	}
    330      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    331      1.1  christos 	    test_gdb_complete_multiple \
    332      1.1  christos 		"$cmd_prefix " "struct_overload3_test::overload3_func" "tion(" \
    333      1.1  christos 		$completion_list
    334      1.1  christos 	    check_bp_locations_match_list \
    335      1.1  christos 		"$cmd_prefix struct_overload3_test::overload3_function" \
    336      1.1  christos 		$completion_list
    337      1.1  christos 	}
    338      1.1  christos     }
    339      1.1  christos }
    340      1.1  christos 
    341      1.1  christos # Test completing an overloaded template method.
    342      1.1  christos 
    343      1.1  christos proc_with_prefix template-overload {} {
    344      1.1  christos     set completion_list {
    345      1.1  christos 	"template_struct<int>::template_overload_fn(int)"
    346      1.1  christos 	"template_struct<long>::template_overload_fn(long)"
    347      1.1  christos     }
    348      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    349      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix " "template_overload_fn" "(" $completion_list
    350      1.1  christos 	check_bp_locations_match_list "$cmd_prefix template_overload_fn" $completion_list
    351      1.1  christos 	check_bp_locations_match_list \
    352      1.1  christos 	    "$cmd_prefix template_struct<int>::template_overload_fn" \
    353      1.1  christos 	    "template_struct<int>::template_overload_fn(int)"
    354      1.1  christos     }
    355      1.1  christos }
    356      1.1  christos 
    357      1.1  christos # Test completing template methods with non-void return type.
    358      1.1  christos 
    359      1.1  christos proc_with_prefix template-ret-type {} {
    360      1.1  christos     set method_name "template2_fn<int, int>"
    361      1.1  christos     set param_list "(template2_ret_type<int>, int, int)"
    362      1.1  christos     set struct_type "template2_struct<template2_ret_type<int> >"
    363      1.1  christos     set ret_type "template2_ret_type<int>"
    364      1.1  christos 
    365      1.1  christos     # Templates are listed both with and without return type, making
    366      1.1  christos     # "template2_<tab>" ambiguous.
    367      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    368      1.1  christos 	set completion_list \
    369      1.1  christos 	    [list \
    370      1.1  christos 		 "${ret_type} ${struct_type}::${method_name}${param_list}" \
    371      1.1  christos 		 "${struct_type}::${method_name}${param_list}"]
    372      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix " "template2_" "" $completion_list
    373      1.1  christos 
    374      1.1  christos 	# Add one character more after "2_", and the linespec becomes
    375      1.1  christos 	# unambiguous.  Test completing the whole prefix range after that,
    376      1.1  christos 	# thus testing completing either with or without return type.
    377      1.1  christos 	foreach {s t} [list \
    378      1.1  christos 			   "template2_r" \
    379      1.1  christos 			   "${ret_type} ${struct_type}::${method_name}${param_list}" \
    380      1.1  christos 			   "template2_s" \
    381      1.1  christos 			   "${struct_type}::${method_name}${param_list}"] {
    382      1.1  christos 	    set linespec $t
    383      1.1  christos 	    set complete_line "$cmd_prefix $linespec"
    384      1.1  christos 	    set start [index_after $s $complete_line]
    385      1.1  christos 	    test_complete_prefix_range $complete_line $start
    386      1.1  christos 	}
    387      1.1  christos 
    388      1.1  christos 	# Setting a breakpoint without the template params doesn't work.
    389      1.1  christos 	check_setting_bp_fails "$cmd_prefix template2_fn"
    390      1.1  christos 	# However, setting a breakpoint with template params and without
    391      1.1  christos 	# the method params does work, just like with non-template
    392      1.1  christos 	# functions.  It also works with or without return type.
    393      1.1  christos 	foreach linespec [list \
    394      1.1  christos 			      "${method_name}" \
    395      1.1  christos 			      "${method_name}${param_list}" \
    396      1.1  christos 			      "${struct_type}::${method_name}" \
    397      1.1  christos 			      "${struct_type}::${method_name}${param_list}" \
    398      1.1  christos 			      "${ret_type} ${struct_type}::${method_name}" \
    399      1.1  christos 			      "${ret_type} ${struct_type}::${method_name}${param_list}"] {
    400      1.1  christos 	    check_bp_locations_match_list \
    401      1.1  christos 		"$cmd_prefix $linespec" \
    402      1.1  christos 		[list "${struct_type}::${method_name}${param_list}"]
    403      1.1  christos 	}
    404      1.1  christos     }
    405      1.1  christos }
    406      1.1  christos 
    407      1.1  christos # Test completion of a const-overloaded funtion (const-overload).
    408      1.1  christos # Note that "const" appears after the function/method parameters.
    409      1.1  christos 
    410      1.1  christos proc_with_prefix const-overload {} {
    411      1.1  christos     set completion_list {
    412      1.1  christos 	"struct_with_const_overload::const_overload_fn()"
    413      1.1  christos 	"struct_with_const_overload::const_overload_fn() const"
    414      1.1  christos     }
    415      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    416      1.1  christos 	test_gdb_complete_multiple \
    417      1.1  christos 	    "$cmd_prefix " "const_overload_fn" "()" \
    418      1.1  christos 	    $completion_list
    419      1.1  christos 	test_gdb_complete_multiple \
    420      1.1  christos 	    "$cmd_prefix " "const_overload_fn ( " ")" \
    421      1.1  christos 	    $completion_list
    422      1.1  christos 	test_gdb_complete_multiple \
    423      1.1  christos 	    "$cmd_prefix " "const_overload_fn()" "" \
    424      1.1  christos 	    $completion_list
    425      1.1  christos 
    426      1.1  christos 	check_bp_locations_match_list \
    427      1.1  christos 	    "$cmd_prefix const_overload_fn" \
    428      1.1  christos 	    {"struct_with_const_overload::const_overload_fn()"
    429      1.1  christos 		"struct_with_const_overload::const_overload_fn() const"}
    430      1.1  christos 
    431      1.1  christos 	check_setting_bp_fails "$cmd_prefix const_overload_fn("
    432      1.1  christos 	check_bp_locations_match_list \
    433      1.1  christos 	    "$cmd_prefix const_overload_fn()" \
    434      1.1  christos 	    {"struct_with_const_overload::const_overload_fn()"}
    435      1.1  christos 	check_bp_locations_match_list \
    436      1.1  christos 	    "$cmd_prefix const_overload_fn() const" \
    437      1.1  christos 	    {"struct_with_const_overload::const_overload_fn() const"}
    438      1.1  christos     }
    439      1.1  christos }
    440      1.1  christos 
    441      1.1  christos # Same but quote-enclose the function name.  This makes the overload
    442      1.1  christos # no longer be ambiguous.
    443      1.1  christos 
    444      1.1  christos proc_with_prefix const-overload-quoted {} {
    445      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    446      1.1  christos 	set linespec "'const_overload_fn()'"
    447      1.1  christos 	test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
    448      1.1  christos 	check_bp_locations_match_list \
    449      1.1  christos 	    "$cmd_prefix $linespec" {
    450      1.1  christos 		"struct_with_const_overload::const_overload_fn()"
    451      1.1  christos 	    }
    452      1.1  christos 
    453      1.1  christos 	set linespec "'const_overload_fn() const'"
    454      1.1  christos 	test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
    455      1.1  christos 	check_bp_locations_match_list \
    456      1.1  christos 	    "$cmd_prefix $linespec" {
    457      1.1  christos 		"struct_with_const_overload::const_overload_fn() const"
    458      1.1  christos 	    }
    459      1.1  christos     }
    460      1.1  christos }
    461      1.1  christos 
    462      1.1  christos # Test that when the function is unambiguous, linespec completion
    463      1.1  christos # appends the end quote char automatically, both ' and ".
    464      1.1  christos 
    465      1.1  christos proc_with_prefix append-end-quote-char-when-unambiguous {} {
    466      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    467      1.1  christos 	foreach qc $completion::all_quotes_list {
    468      1.1  christos 	    set linespec "${qc}not_overloaded_fn()${qc}"
    469      1.1  christos 	    foreach cmd [list "$cmd_prefix ${qc}not_overloaded_fn()" \
    470      1.1  christos 			      "$cmd_prefix ${qc}not_overloaded_fn" \
    471      1.1  christos 			      "$cmd_prefix ${qc}not_overloaded_"] {
    472      1.1  christos 		test_gdb_complete_unique $cmd "$cmd_prefix $linespec"
    473      1.1  christos 	    }
    474      1.1  christos 	    check_bp_locations_match_list \
    475      1.1  christos 		"$cmd_prefix $linespec" {"not_overloaded_fn()"}
    476      1.1  christos 	}
    477      1.1  christos     }
    478      1.1  christos }
    479      1.1  christos 
    480      1.1  christos # Test completing symbols of source files.
    481      1.1  christos 
    482      1.1  christos proc_with_prefix in-source-file-unconstrained {} {
    483      1.1  christos     # First test that unconstrained matching picks up functions from
    484      1.1  christos     # multiple files.
    485      1.1  christos     test_gdb_complete_multiple "b " "file_constrained_test" "_cpls" {
    486      1.1  christos 	"file_constrained_test_cpls2_function(int)"
    487      1.1  christos 	"file_constrained_test_cpls_function(int)"
    488      1.1  christos     }
    489      1.1  christos     check_setting_bp_fails "b file_constrained_test_cpls"
    490      1.1  christos }
    491      1.1  christos 
    492      1.1  christos # Test an unambiguous completion that would be ambiguous if it weren't
    493      1.1  christos # for the source file component, due to
    494      1.1  christos # "file_constrained_test_cpls_function" in cpls.cc.  Test with
    495      1.1  christos # different components quoted, and with whitespace before the function
    496      1.1  christos # name.
    497      1.1  christos 
    498      1.1  christos proc_with_prefix in-source-file-unambiguous {} {
    499      1.1  christos     foreach sqc $completion::maybe_quoted_list {
    500      1.1  christos 	foreach fqc $completion::maybe_quoted_list {
    501      1.1  christos 	    # Linespec.
    502      1.1  christos 	    foreach sep {":" ": "} {
    503      1.1  christos 		set linespec \
    504      1.1  christos 		    "${sqc}cpls2.cc${sqc}${sep}${fqc}file_constrained_test_cpls2_function(int)${fqc}"
    505      1.1  christos 		set complete_line "b $linespec"
    506      1.1  christos 		set start [index_after "constrained_test" $complete_line]
    507      1.1  christos 		set input_line [string range $complete_line 0 $start]
    508      1.1  christos 		test_gdb_complete_unique $input_line ${complete_line}
    509      1.1  christos 		check_bp_locations_match_list "b $linespec" {
    510      1.1  christos 		    "file_constrained_test_cpls2_function(int)"
    511      1.1  christos 		}
    512      1.1  christos 	    }
    513      1.1  christos 
    514      1.1  christos 	    # Explicit location.
    515      1.1  christos 	    set source_opt "-source ${sqc}cpls2.cc${sqc}"
    516      1.1  christos 	    set function_opt "-function ${fqc}file_constrained_test_cpls2_function(int)${fqc}"
    517      1.1  christos 	    set complete_line "b $source_opt $function_opt"
    518      1.1  christos 	    set start [index_after "cpls2_functio" $complete_line]
    519      1.1  christos 	    set input_line [string range $complete_line 0 $start]
    520      1.1  christos 	    test_gdb_complete_unique $input_line ${complete_line}
    521      1.1  christos 	    check_bp_locations_match_list "$complete_line" {
    522      1.1  christos 		    "file_constrained_test_cpls2_function(int)"
    523      1.1  christos 	    }
    524      1.1  christos 	}
    525      1.1  christos     }
    526      1.1  christos }
    527      1.1  christos 
    528      1.1  christos # Test an ambiguous completion constrained by a source file.  Test
    529      1.1  christos # with different components quoted, and with whitespace before the
    530      1.1  christos # function name.
    531      1.1  christos 
    532      1.1  christos proc_with_prefix in-source-file-ambiguous {} {
    533      1.1  christos     foreach sqc $completion::maybe_quoted_list {
    534      1.1  christos 	foreach fqc $completion::maybe_quoted_list {
    535      1.1  christos 	    # Linespec.
    536      1.1  christos 	    foreach sep {":" ": "} {
    537      1.1  christos 		set cmd_prefix "b ${sqc}cpls2.cc${sqc}${sep}"
    538      1.1  christos 		test_gdb_complete_multiple "${cmd_prefix}" ${fqc} "" {
    539      1.1  christos 		    "another_file_constrained_test_cpls2_function(int)"
    540      1.1  christos 		    "file_constrained_test_cpls2_function(int)"
    541      1.1  christos 		} ${fqc} ${fqc}
    542      1.1  christos 	    }
    543      1.1  christos 
    544      1.1  christos 	    # Explicit location.
    545      1.1  christos 	    test_gdb_complete_multiple \
    546      1.1  christos 		"b -source ${sqc}cpls2.cc${sqc} -function " ${fqc} "" {
    547      1.1  christos 		"another_file_constrained_test_cpls2_function(int)"
    548      1.1  christos 		"file_constrained_test_cpls2_function(int)"
    549      1.1  christos 	    } ${fqc} ${fqc}
    550      1.1  christos 	}
    551      1.1  christos     }
    552      1.1  christos }
    553      1.1  christos 
    554      1.1  christos # Check that completing a file name in a linespec auto-appends a colon
    555      1.1  christos # instead of a whitespace character.
    556      1.1  christos 
    557      1.1  christos proc_with_prefix source-complete-appends-colon {} {
    558      1.1  christos     # Test with quotes to make sure the end quote char is put at the
    559      1.1  christos     # right place.
    560      1.1  christos     foreach qc $completion::maybe_quoted_list {
    561      1.1  christos 	test_gdb_complete_unique \
    562      1.1  christos 	    "b ${qc}cpls2." \
    563      1.1  christos 	    "b ${qc}cpls2.cc${qc}" ":"
    564      1.1  christos 	test_gdb_complete_unique \
    565      1.1  christos 	    "b ${qc}cpls2.c" \
    566      1.1  christos 	    "b ${qc}cpls2.cc${qc}" ":"
    567      1.1  christos 	test_gdb_complete_unique \
    568      1.1  christos 	    "b ${qc}cpls2.cc" \
    569      1.1  christos 	    "b ${qc}cpls2.cc${qc}" ":"
    570      1.1  christos 
    571      1.1  christos 	# Same, but with a filename with an hyphen (which is normally
    572      1.1  christos 	# a language word break char).
    573      1.1  christos 	test_gdb_complete_unique \
    574      1.1  christos 	    "b ${qc}cpls-" \
    575      1.1  christos 	    "b ${qc}cpls-hyphen.cc${qc}" ":"
    576      1.1  christos 	test_gdb_complete_unique \
    577      1.1  christos 	    "b ${qc}cpls-hyphen" \
    578      1.1  christos 	    "b ${qc}cpls-hyphen.cc${qc}" ":"
    579      1.1  christos     }
    580      1.1  christos 
    581      1.1  christos     # Test the same, but with the name of a nonexisting file.
    582      1.1  christos 
    583      1.1  christos     # Cursor at the end of the string.
    584      1.1  christos     test_gdb_complete_none "b nonexistingfilename.cc"
    585      1.1  christos     # Cursor past the end of the string.
    586      1.1  christos     test_gdb_complete_multiple "b nonexistingfilename.cc " "" "" \
    587      1.1  christos 	$completion::keyword_list
    588      1.1  christos     foreach qc $completion::all_quotes_list {
    589      1.1  christos 	# Unterminated quote.
    590      1.1  christos 	test_gdb_complete_none "b ${qc}nonexistingfilename.cc"
    591      1.1  christos 	test_gdb_complete_none "b ${qc}nonexistingfilename.cc "
    592      1.1  christos 	# Terminated quote, cursor at the quote.
    593      1.1  christos 	test_gdb_complete_unique \
    594      1.1  christos 	    "b ${qc}nonexistingfilename.cc${qc}" \
    595      1.1  christos 	    "b ${qc}nonexistingfilename.cc${qc}"
    596      1.1  christos 	# Terminated quote, cursor past the quote.
    597      1.1  christos 	test_gdb_complete_multiple \
    598      1.1  christos 	    "b ${qc}nonexistingfilename.cc${qc} " "" "" \
    599      1.1  christos 	    $completion::keyword_list
    600      1.1  christos     }
    601      1.1  christos }
    602      1.1  christos 
    603      1.1  christos ####################################################################
    604      1.1  christos 
    605      1.1  christos # Test that a colon at the end of the linespec is understood as an
    606      1.1  christos # incomplete scope operator (incomplete-scope-colon), instead of a
    607      1.1  christos # source/function separator.
    608      1.1  christos 
    609      1.1  christos proc_with_prefix incomplete-scope-colon {} {
    610      1.1  christos 
    611      1.1  christos     # Helper for the loop below to simplify it.  Tests completion of
    612      1.1  christos     # the range defined by the RANGE_SS found in the constructed line.
    613      1.1  christos     #
    614      1.1  christos     # E.g., with:
    615      1.1  christos     #
    616      1.1  christos     #   source="source.cc"
    617      1.1  christos     #   fqc="'"
    618      1.1  christos     #   prototype="ns::function()"
    619      1.1  christos     #   range_ss="s::f"
    620      1.1  christos     #
    621      1.1  christos     # we'd try completing with the cursor set in each of the
    622      1.1  christos     # underlined range's positions of:
    623      1.1  christos     #
    624      1.1  christos     #   b source.cc:'ns::function()'"
    625      1.1  christos     #                 ^^^^
    626      1.1  christos     #
    627      1.1  christos     # Also test that setting a breakpoint at the constructed line
    628      1.1  christos     # finds the same breakpoint location as completion does.
    629      1.1  christos     #
    630      1.1  christos     proc incomplete_scope_colon_helper {prototype range_ss {skip_check_bp 0}} {
    631      1.1  christos 	foreach source {"" "cpls.cc"} {
    632      1.1  christos 	    # Test with and without source quoting.
    633      1.1  christos 	    foreach sqc $completion::maybe_quoted_list {
    634      1.1  christos 		if {$source == "" && $sqc != ""} {
    635      1.1  christos 		    # Invalid combination.
    636      1.1  christos 		    continue
    637      1.1  christos 		}
    638      1.1  christos 
    639      1.1  christos 		# Test with and without function quoting.
    640      1.1  christos 		foreach fqc $completion::maybe_quoted_list {
    641      1.1  christos 		    if {$source == ""} {
    642      1.1  christos 			set linespec_source ""
    643      1.1  christos 			set explicit_source ""
    644      1.1  christos 		    } else {
    645      1.1  christos 			set linespec_source "${sqc}${source}${sqc}:"
    646      1.1  christos 			set explicit_source "-source ${sqc}${source}${sqc}"
    647      1.1  christos 		    }
    648      1.1  christos 
    649      1.1  christos 		    # Even though this use case is trickier with
    650      1.1  christos 		    # linespecs due to the ":" as separator, test both
    651      1.1  christos 		    # linespecs and explicit locations for
    652      1.1  christos 		    # completeness.
    653      1.1  christos 		    foreach location [list \
    654      1.1  christos 					  "${linespec_source}${fqc}$prototype${fqc}" \
    655      1.1  christos 					  "${explicit_source} -function ${fqc}$prototype${fqc}"] {
    656      1.1  christos 			set complete_line "b $location"
    657      1.1  christos 			set start [string first $range_ss $complete_line]
    658      1.1  christos 			set end [expr ($start + [string length $range_ss])]
    659      1.1  christos 			test_complete_prefix_range $complete_line $start $end
    660      1.1  christos 			if {!$skip_check_bp} {
    661      1.1  christos 			    check_bp_locations_match_list "b $location" [list "$prototype"]
    662      1.1  christos 			}
    663      1.1  christos 		    }
    664      1.1  christos 		}
    665      1.1  christos 	    }
    666      1.1  christos 	}
    667      1.1  christos     }
    668      1.1  christos 
    669      1.1  christos     incomplete_scope_colon_helper \
    670      1.1  christos 	"struct_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
    671      1.1  christos 	"t::i"
    672      1.1  christos 
    673      1.1  christos     incomplete_scope_colon_helper \
    674      1.1  christos 	"ns_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
    675      1.1  christos 	"t::i"
    676      1.1  christos 
    677      1.1  christos     # Test completing around both "::"s.
    678      1.1  christos     foreach range_ss {"t::s" "t::i"} skip_check_bp {0 1} {
    679      1.1  christos 	incomplete_scope_colon_helper \
    680      1.1  christos 	    "ns2_incomplete_scope_colon_test::struct_in_ns2_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
    681      1.1  christos 	    $range_ss $skip_check_bp
    682      1.1  christos     }
    683      1.1  christos }
    684      1.1  christos 
    685      1.1  christos # Test completing functions/methods in anonymous namespaces.
    686      1.1  christos 
    687      1.1  christos proc_with_prefix anon-ns {} {
    688      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    689      1.1  christos 	foreach qc $completion::maybe_quoted_list {
    690      1.1  christos 	    test_gdb_complete_unique \
    691      1.1  christos 		"$cmd_prefix ${qc}anon_ns_function" \
    692      1.1  christos 		"$cmd_prefix ${qc}anon_ns_function()${qc}"
    693      1.1  christos 	    check_bp_locations_match_list "$cmd_prefix ${qc}anon_ns_function()${qc}" {
    694      1.1  christos 		"(anonymous namespace)::anon_ns_function()"
    695      1.1  christos 		"(anonymous namespace)::anon_ns_struct::anon_ns_function()"
    696      1.1  christos 		"the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
    697      1.1  christos 		"the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_struct::anon_ns_function()"
    698      1.1  christos 	    }
    699      1.1  christos 	}
    700      1.1  christos 
    701      1.1  christos 	# A "(" finds all anonymous namespace functions/methods in all
    702      1.1  christos 	# scopes.
    703      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix " "(" "anonymous namespace)::" {
    704      1.1  christos 	    "(anonymous namespace)::anon_ns_function()"
    705      1.1  christos 	    "(anonymous namespace)::anon_ns_struct::anon_ns_function()"
    706      1.1  christos 	    "(anonymous namespace)::overload2_function(overload2_arg3)"
    707      1.1  christos 	    "(anonymous namespace)::overload3_function(int)"
    708      1.1  christos 	    "(anonymous namespace)::overload3_function(long)"
    709      1.1  christos 	    "(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg4)"
    710      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    711      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    712      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    713      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    714      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    715      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
    716      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
    717      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(long)"
    718      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
    719      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
    720      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::overload3_function(int)"
    721      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::overload3_function(long)"
    722      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    723      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    724      1.1  christos 	    "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
    725      1.1  christos 	    "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_struct::anon_ns_function()"
    726      1.1  christos 	}
    727      1.1  christos 
    728      1.1  christos 	set function "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
    729      1.1  christos 	test_gdb_complete_unique "$cmd_prefix $function" "$cmd_prefix $function"
    730      1.1  christos 	check_bp_locations_match_list "$cmd_prefix $function" [list $function]
    731      1.1  christos 
    732      1.1  christos 	# Test completing after the "(anonymous namespace)" part.
    733      1.1  christos 	test_gdb_complete_unique \
    734      1.1  christos 	    "$cmd_prefix the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_fu" \
    735      1.1  christos 	    "$cmd_prefix $function"
    736      1.1  christos 
    737      1.1  christos 	# Test whitespace in the "(anonymous namespace)" component.
    738      1.1  christos 
    739      1.1  christos 	test_gdb_complete_unique \
    740      1.1  christos 	    "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous   namespace )::anon_ns_fu" \
    741      1.1  christos 	    "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous   namespace )::anon_ns_function()"
    742      1.1  christos 	check_setting_bp_fails \
    743      1.1  christos 	    "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous   namespace )::anon_ns_fu"
    744      1.1  christos 
    745      1.1  christos 	set function_ws \
    746      1.1  christos 	    "the_anon_ns_wrapper_ns::( anonymous   namespace )::anon_ns_function ( )"
    747      1.1  christos 	test_gdb_complete_unique "$cmd_prefix $function_ws" "$cmd_prefix $function_ws"
    748      1.1  christos 	check_bp_locations_match_list "$cmd_prefix $function_ws" [list $function]
    749      1.1  christos     }
    750      1.1  christos }
    751      1.1  christos 
    752      1.1  christos # Basic test for completing "operator<".  More extensive C++ operator
    753      1.1  christos # tests in cpls-op.exp.
    754      1.1  christos 
    755      1.1  christos proc_with_prefix operator< {} {
    756      1.1  christos     # Complete all prefixes between "oper" and the whole prototype.
    757      1.1  christos     set function "operator<(foo_enum, foo_enum)"
    758      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    759      1.1  christos 	set line "$cmd_prefix $function"
    760      1.1  christos 	set start [index_after "oper" $line]
    761      1.1  christos 	test_complete_prefix_range $line $start
    762      1.1  christos     }
    763      1.1  christos 
    764      1.1  christos     # There's a label in the function; try completing it.  (Exhaustive
    765      1.1  christos     # label completion tests further below.)
    766      1.1  christos     foreach location [list \
    767      1.1  christos 		     "$function:label1" \
    768      1.1  christos 		     "-function $function -label label1"] {
    769      1.1  christos 
    770      1.1  christos 	set cmd "b $location"
    771      1.1  christos 	set input_line [string range $cmd 0 [expr [string length $cmd] - 3]]
    772      1.1  christos 
    773      1.1  christos 	test_gdb_complete_unique $input_line $cmd
    774      1.1  christos 	test_gdb_complete_unique $cmd $cmd
    775      1.1  christos 	check_bp_locations_match_list $cmd [list "$location"]
    776      1.1  christos     }
    777      1.1  christos }
    778      1.1  christos 
    779      1.1  christos # Test completion of scopes with an ambiguous prefix.
    780      1.1  christos 
    781      1.1  christos proc_with_prefix ambiguous-prefix {} {
    782      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    783      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix " "ambiguous_pre" "fix_" {
    784      1.1  christos 	    "ambiguous_prefix_global_func()"
    785      1.1  christos 	    "the_ambiguous_prefix_ns::ambiguous_prefix_ns_func()"
    786      1.1  christos 	    "the_ambiguous_prefix_struct::ambiguous_prefix_method()"
    787      1.1  christos 	}
    788      1.1  christos 	check_setting_bp_fails "$cmd_prefix ambiguous_prefix_"
    789      1.1  christos     }
    790      1.1  christos }
    791      1.1  christos 
    792      1.1  christos # Test completion of function labels.
    793      1.1  christos 
    794      1.1  christos proc_with_prefix function-labels {} {
    795      1.1  christos     # Test with and without a source file component.
    796      1.1  christos     foreach_location_functions \
    797      1.1  christos 	{ "" "cpls.cc" } \
    798      1.1  christos 	{ "function_with_labels(int)" } \
    799      1.1  christos 	{
    800      1.1  christos 	    # Linespec version.  Test various spacing around the label
    801      1.1  christos 	    # colon separator.
    802      1.1  christos 	    foreach label_sep {":" " :" ": " " : "} {
    803      1.1  christos 		set linespec "${location}${label_sep}"
    804      1.1  christos 		test_gdb_complete_multiple "b $linespec" "l" "abel" {
    805      1.1  christos 		    "label1"
    806      1.1  christos 		    "label2"
    807      1.1  christos 		}
    808      1.1  christos 		check_setting_bp_fails "b ${linespec}label"
    809      1.1  christos 
    810      1.1  christos 		set tsep [string trim ${source_sep}]
    811      1.1  christos 		check_bp_locations_match_list \
    812      1.1  christos 		    "b ${linespec}label1" [list "${source}${tsep}${function}:label1"]
    813      1.1  christos 		check_bp_locations_match_list \
    814      1.1  christos 		    "b ${linespec}label2" [list "${source}${tsep}${function}:label2"]
    815      1.1  christos 	    }
    816      1.1  christos 	} \
    817      1.1  christos 	{
    818      1.1  christos 	    # Explicit locations version.
    819      1.1  christos 	    append location " -label"
    820      1.1  christos 	    test_gdb_complete_multiple "b $location " "l" "abel" {
    821      1.1  christos 		"label1"
    822      1.1  christos 		"label2"
    823      1.1  christos 	    }
    824      1.1  christos 	    check_setting_bp_fails "b $location label"
    825      1.1  christos 
    826      1.1  christos 	    if {$source != ""} {
    827      1.1  christos 		set bp_loc_src "-source ${source} "
    828      1.1  christos 	    } else {
    829      1.1  christos 		set bp_loc_src ""
    830      1.1  christos 	    }
    831      1.1  christos 	    check_bp_locations_match_list \
    832      1.1  christos 		"b ${location} label1" [list "${bp_loc_src}-function $function -label label1"]
    833      1.1  christos 	    check_bp_locations_match_list \
    834      1.1  christos 		"b ${location} label2" [list "${bp_loc_src}-function $function -label label2"]
    835      1.1  christos 	}
    836      1.1  christos }
    837      1.1  christos 
    838      1.1  christos # Test that completion after a function name offers keyword
    839      1.1  christos # (if/task/thread) matches in linespec mode, and also the explicit
    840      1.1  christos # location options in explicit locations mode.
    841      1.1  christos 
    842      1.1  christos proc_with_prefix keywords-after-function {} {
    843      1.1  christos     set explicit_list \
    844      1.1  christos 	[concat $completion::explicit_opts_list $completion::keyword_list]
    845      1.1  christos 
    846      1.1  christos     # Test without a source file, with a known source file, and with
    847      1.1  christos     # and unknown source file.
    848      1.1  christos     # Test a known and an unknown function.
    849      1.1  christos     foreach_location_functions \
    850      1.1  christos 	{ "" "cpls.cc" "unknown_file.cc" } \
    851      1.1  christos 	{ "function_with_labels(int)" "unknown_function(int)" } \
    852      1.1  christos 	{
    853      1.1  christos 	    # Linespec version.
    854      1.1  christos 	    test_gdb_complete_multiple "b ${location} " "" "" \
    855      1.1  christos 		$completion::keyword_list
    856      1.1  christos 	} \
    857      1.1  christos 	{
    858      1.1  christos 	    # Explicit locations version.
    859      1.1  christos 	    test_gdb_complete_multiple "b ${location} " "" "" \
    860      1.1  christos 		$explicit_list
    861      1.1  christos 	}
    862      1.1  christos }
    863      1.1  christos 
    864      1.1  christos # Same, but after a label.
    865      1.1  christos 
    866      1.1  christos proc_with_prefix keywords-after-label {} {
    867      1.1  christos     set explicit_list \
    868      1.1  christos 	[concat $completion::explicit_opts_list $completion::keyword_list]
    869      1.1  christos 
    870      1.1  christos     foreach_location_labels \
    871      1.1  christos 	{ "" "cpls.cc" } \
    872      1.1  christos 	{ "function_with_labels(int)" "unknown_function(int)" } \
    873      1.1  christos 	{ "label1" "non_existing_label" } \
    874      1.1  christos 	{
    875      1.1  christos 	    # Linespec version.
    876      1.1  christos 	    test_gdb_complete_multiple "b ${location} " "" "" \
    877      1.1  christos 		$completion::keyword_list
    878      1.1  christos 	} \
    879      1.1  christos 	{
    880      1.1  christos 	    # Explicit locations version.
    881      1.1  christos 	    test_gdb_complete_multiple "b ${location} " "" "" \
    882      1.1  christos 		$explicit_list
    883      1.1  christos 	}
    884      1.1  christos }
    885      1.1  christos 
    886      1.1  christos # Similar, but after an unknown file, and in linespec mode only.
    887      1.1  christos 
    888      1.1  christos proc_with_prefix keywords-after-unknown-file {} {
    889      1.1  christos     # Test with and without quoting.
    890      1.1  christos     foreach qc $completion::maybe_quoted_list {
    891      1.1  christos 	set line "b ${qc}unknown_file.cc${qc}: "
    892      1.1  christos 	test_gdb_complete_multiple $line "" "" $completion::keyword_list
    893      1.1  christos     }
    894      1.1  christos }
    895      1.1  christos 
    896      1.1  christos # Test that linespec / function completion does not match data
    897      1.1  christos # symbols, only functions/methods.
    898      1.1  christos 
    899      1.1  christos proc_with_prefix no-data-symbols {} {
    900      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    901      1.1  christos 	test_gdb_complete_unique "$cmd_prefix code_" "$cmd_prefix code_function()"
    902      1.1  christos     }
    903      1.1  christos }
    904      1.1  christos 
    905      1.1  christos 
    906      1.1  christos # After "if", we expect an expression, which has a different completer
    907      1.1  christos # that matches data symbols as well.  Check that that works.
    908      1.1  christos 
    909      1.1  christos proc_with_prefix if-expression {} {
    910      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    911      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix function() if " "code_" "" {
    912      1.1  christos 	    "code_data"
    913      1.1  christos 	    "code_function()"
    914      1.1  christos 	}
    915      1.1  christos 
    916      1.1  christos 	test_gdb_complete_unique \
    917      1.1  christos 	    "$cmd_prefix function() if code_data + another_da" \
    918      1.1  christos 	    "$cmd_prefix function() if code_data + another_data"
    919      1.1  christos 
    920      1.1  christos 	test_gdb_complete_unique \
    921      1.1  christos 	    "$cmd_prefix non_existing_function() if code_data + another_da" \
    922      1.1  christos 	    "$cmd_prefix non_existing_function() if code_data + another_data"
    923      1.1  christos 
    924      1.1  christos 	# FIXME: For now, thread and task also use the expression
    925      1.1  christos 	# completer.
    926      1.1  christos 	test_gdb_complete_unique \
    927      1.1  christos 	    "$cmd_prefix function() thread code_data + another_da" \
    928      1.1  christos 	    "$cmd_prefix function() thread code_data + another_data"
    929      1.1  christos 	test_gdb_complete_unique \
    930      1.1  christos 	    "$cmd_prefix function() task code_data + another_da" \
    931      1.1  christos 	    "$cmd_prefix function() task code_data + another_data"
    932      1.1  christos     }
    933      1.1  christos }
    934      1.1  christos 
    935      1.1  christos # The testcase driver.  Calls all test procedures.
    936      1.1  christos 
    937      1.1  christos proc test_driver {} {
    938      1.1  christos     all-param-prefixes
    939      1.1  christos     overload
    940      1.1  christos     overload-2
    941      1.1  christos     fqn
    942      1.1  christos     fqn-2
    943      1.1  christos     overload-3
    944      1.1  christos     template-overload
    945      1.1  christos     template-ret-type
    946      1.1  christos     const-overload
    947      1.1  christos     const-overload-quoted
    948      1.1  christos     append-end-quote-char-when-unambiguous
    949      1.1  christos     in-source-file-unconstrained
    950      1.1  christos     in-source-file-unambiguous
    951      1.1  christos     in-source-file-ambiguous
    952      1.1  christos     source-complete-appends-colon
    953      1.1  christos     incomplete-scope-colon
    954      1.1  christos     anon-ns
    955      1.1  christos     operator<
    956      1.1  christos     ambiguous-prefix
    957      1.1  christos     function-labels
    958      1.1  christos     keywords-after-function
    959      1.1  christos     keywords-after-label
    960      1.1  christos     keywords-after-unknown-file
    961      1.1  christos     no-data-symbols
    962      1.1  christos     if-expression
    963      1.1  christos }
    964      1.1  christos 
    965      1.1  christos test_driver
    966