Home | History | Annotate | Line # | Download | only in gdb.linespec
      1  1.1.1.4  christos # Copyright 2017-2024 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.1.3  christos load_lib data-structures.exp
     20      1.1  christos 
     21      1.1  christos standard_testfile cpls.cc cpls2.cc cpls-hyphen.cc
     22      1.1  christos 
     23  1.1.1.4  christos set opts {}
     24  1.1.1.4  christos lappend opts debug
     25  1.1.1.4  christos lappend opts additional_flags=-std=c++11
     26  1.1.1.4  christos 
     27      1.1  christos if {[prepare_for_testing "failed to prepare" $testfile \
     28  1.1.1.4  christos 	 [list $srcfile $srcfile2 $srcfile3] $opts]} {
     29      1.1  christos     return -1
     30      1.1  christos }
     31      1.1  christos 
     32      1.1  christos # Tests below are about tab-completion, which doesn't work if readline
     33      1.1  christos # library isn't used.  Check it first.
     34      1.1  christos 
     35      1.1  christos if { ![readline_is_used] } {
     36      1.1  christos     untested "no tab completion support without readline"
     37      1.1  christos     return -1
     38      1.1  christos }
     39      1.1  christos 
     40  1.1.1.3  christos #
     41  1.1.1.3  christos # Some convenience procedures for testing template parameter list
     42  1.1.1.3  christos # completion.
     43  1.1.1.3  christos #
     44  1.1.1.3  christos 
     45  1.1.1.3  christos # For the variable named ARGLISTVAR, which should be the name of an
     46  1.1.1.3  christos # argument list in the calling frame, "consume" the top-most token.
     47  1.1.1.3  christos # [See comments for makefoo for description of arglist format.]
     48  1.1.1.3  christos 
     49  1.1.1.3  christos proc consume {arglistvar} {
     50  1.1.1.3  christos   upvar $arglistvar arglist
     51  1.1.1.3  christos 
     52  1.1.1.3  christos   # ARGLIST is a string -- simply strip off the first character.
     53  1.1.1.3  christos   set arglist [string range $arglist 1 end]
     54  1.1.1.3  christos }
     55  1.1.1.3  christos 
     56  1.1.1.3  christos # Create a function template named NAME, using the given stack ID to grab
     57  1.1.1.3  christos # NUM template parameters.  The result is pushed back onto the
     58  1.1.1.3  christos # stack.  NUM may be "all," in which case we use the entire stack
     59  1.1.1.3  christos # to create the function template, including function arguments.
     60  1.1.1.3  christos # The resulting template function's arguments are taken from the test
     61  1.1.1.3  christos # source code for the function "foo" and is not generalized.
     62  1.1.1.3  christos 
     63  1.1.1.3  christos proc maket {sid name {num 1}} {
     64  1.1.1.3  christos 
     65  1.1.1.3  christos   # Set up a temporary stack of parameters.  This will reverse
     66  1.1.1.3  christos   # the order in SID so that when they are popped again below,
     67  1.1.1.3  christos   # we get them in the correct order.  This also takes into account
     68  1.1.1.3  christos   # how many levels of the result stack we want to consider.
     69  1.1.1.3  christos 
     70  1.1.1.3  christos   set paramstack [::Stack::new]
     71  1.1.1.3  christos   if {[string equal $num "all"]} {
     72  1.1.1.3  christos     while {![stack empty $sid]} {
     73  1.1.1.3  christos       stack push $paramstack [stack pop $sid]
     74  1.1.1.3  christos     }
     75  1.1.1.3  christos   } else {
     76  1.1.1.3  christos     for {set i 0} {$i < $num} {incr i} {
     77  1.1.1.3  christos       stack push $paramstack [stack pop $sid]
     78  1.1.1.3  christos     }
     79  1.1.1.3  christos   }
     80  1.1.1.3  christos 
     81  1.1.1.3  christos   # Construct the function template and push it back to the
     82  1.1.1.3  christos   # top of the stack given by SID.
     83  1.1.1.3  christos   set result ""
     84  1.1.1.3  christos   set first true
     85  1.1.1.3  christos   while {![stack empty $paramstack]} {
     86  1.1.1.3  christos     set top [stack pop $paramstack]
     87  1.1.1.3  christos     if {$first} {
     88  1.1.1.3  christos       set first false
     89  1.1.1.3  christos     } else {
     90  1.1.1.3  christos       append result ", "
     91  1.1.1.3  christos     }
     92  1.1.1.3  christos     append result $top
     93  1.1.1.3  christos   }
     94  1.1.1.3  christos 
     95  1.1.1.3  christos   # Save argument list.
     96  1.1.1.3  christos   set args $result
     97  1.1.1.3  christos 
     98  1.1.1.3  christos   # GDB outputs "> >" instead of ">>".
     99  1.1.1.3  christos   if {[string index $top end] == ">"} {
    100  1.1.1.3  christos       append result " "
    101  1.1.1.3  christos   }
    102  1.1.1.3  christos   set result "$name<$result>"
    103  1.1.1.3  christos   if {[string equal $num "all"]} {
    104  1.1.1.3  christos     append result "($args)"
    105  1.1.1.3  christos   }
    106  1.1.1.3  christos   stack push $sid $result
    107  1.1.1.3  christos   stack delete $paramstack
    108  1.1.1.3  christos }
    109  1.1.1.3  christos 
    110  1.1.1.3  christos # Given the stack SID and the name of a variable of the desired template
    111  1.1.1.3  christos # parameters, construct the actual template parameter and push it to the
    112  1.1.1.3  christos # top of the stack.
    113  1.1.1.3  christos 
    114  1.1.1.3  christos proc makearg {sid arglistvar} {
    115  1.1.1.3  christos     upvar $arglistvar arglist
    116  1.1.1.3  christos 
    117  1.1.1.3  christos   set c [string index $arglist 0]
    118  1.1.1.3  christos   consume arglist
    119  1.1.1.3  christos   switch $c {
    120  1.1.1.3  christos     A -
    121  1.1.1.3  christos     B {
    122  1.1.1.3  christos       makearg $sid arglist
    123  1.1.1.3  christos       makearg $sid arglist
    124  1.1.1.3  christos       maket $sid $c 2
    125  1.1.1.3  christos     }
    126  1.1.1.3  christos 
    127  1.1.1.3  christos     a -
    128  1.1.1.3  christos     b -
    129  1.1.1.3  christos     c -
    130  1.1.1.3  christos     d {
    131  1.1.1.3  christos       makearg $sid arglist
    132  1.1.1.3  christos       maket $sid $c
    133  1.1.1.3  christos     }
    134  1.1.1.3  christos 
    135  1.1.1.3  christos     i {
    136  1.1.1.3  christos       stack push $sid "int"
    137  1.1.1.3  christos     }
    138  1.1.1.3  christos 
    139  1.1.1.3  christos     n {
    140  1.1.1.3  christos       # These are not templates.
    141  1.1.1.3  christos       set c [string index $arglist 0]
    142  1.1.1.3  christos       stack push $sid "n::n$c"
    143  1.1.1.3  christos       consume arglist
    144  1.1.1.3  christos     }
    145  1.1.1.3  christos 
    146  1.1.1.3  christos     N {
    147  1.1.1.3  christos       set c [string index $arglist 0]
    148  1.1.1.3  christos       makearg $sid arglist
    149  1.1.1.3  christos       set top [stack pop $sid]
    150  1.1.1.3  christos       stack push $sid "n::N$top"
    151  1.1.1.3  christos     }
    152  1.1.1.3  christos 
    153  1.1.1.3  christos     default { error "unhandled arglist identifier: '$c'" }
    154  1.1.1.3  christos   }
    155  1.1.1.3  christos }
    156  1.1.1.3  christos 
    157  1.1.1.3  christos # Given ARGLIST, construct a class template for the type and return
    158  1.1.1.3  christos # it as a string.
    159  1.1.1.3  christos 
    160  1.1.1.3  christos proc maketype {arglist} {
    161  1.1.1.3  christos     set s [Stack::new]
    162  1.1.1.3  christos     makearg $s arglist
    163  1.1.1.3  christos     set result [stack pop $s]
    164  1.1.1.3  christos     stack delete $s
    165  1.1.1.3  christos     return $result
    166  1.1.1.3  christos }
    167  1.1.1.3  christos 
    168  1.1.1.3  christos # Returns a function template declaration for the function "foo" in the
    169  1.1.1.3  christos # corresponding test source code.  ARGLIST specifies the exact instantiation
    170  1.1.1.3  christos # that is desired.
    171  1.1.1.3  christos #
    172  1.1.1.3  christos # Generically, this procedure returns a string of the form,
    173  1.1.1.3  christos # "foo<parameter-list> (arg-list)", where ARGLIST describes the parameter(s).
    174  1.1.1.3  christos #
    175  1.1.1.3  christos # Valid specifiers for ARGLIST (must be kept in sync with source code):
    176  1.1.1.3  christos #
    177  1.1.1.3  christos # i: Creates an "int" type.
    178  1.1.1.3  christos # a, b, c, d: Creates the struct template of the same name, taking a single
    179  1.1.1.3  christos #    template parameter.
    180  1.1.1.3  christos # A, B: Creates the struct template of the same name, taking two template
    181  1.1.1.3  christos #    parameters.
    182  1.1.1.3  christos # na, nb: Creates the non-template structs n::na and n::nb, respectively.
    183  1.1.1.3  christos # NA, NB: Creates the struct templates n::NA and n::NB, respectively, which
    184  1.1.1.3  christos #    take two template parameters.
    185  1.1.1.3  christos #
    186  1.1.1.3  christos # Examples:
    187  1.1.1.3  christos # makefoo i
    188  1.1.1.3  christos # --> foo<int> (int)
    189  1.1.1.3  christos # makefoo ii
    190  1.1.1.3  christos # --> foo<int, int> (int, int)
    191  1.1.1.3  christos # makefoo Aiabi
    192  1.1.1.3  christos # --> foo<A<int, a<b<int> > > > (A<int, a<b<int> > >)
    193  1.1.1.3  christos # makefoo NANAiaiNBbiabi
    194  1.1.1.3  christos # --> foo<n::NA<n::NA<int, a<int> >, n::NB<b<int>, a<b<int> > > > >
    195  1.1.1.3  christos #          (n::NA<n::NA<int, a<int> >, n::NB<b<int>, a<b<int> > > >)
    196  1.1.1.3  christos 
    197  1.1.1.3  christos proc makefoo {arglist} {
    198  1.1.1.3  christos     set s [::Stack::new]
    199  1.1.1.3  christos     while {[string length $arglist] > 0} {
    200  1.1.1.3  christos 	makearg $s arglist
    201  1.1.1.3  christos     }
    202  1.1.1.3  christos 
    203  1.1.1.3  christos   maket $s "foo" all
    204  1.1.1.3  christos   set result [stack pop $s]
    205  1.1.1.3  christos   stack delete $s
    206  1.1.1.3  christos   return $result
    207  1.1.1.3  christos }
    208  1.1.1.3  christos 
    209  1.1.1.3  christos # Test wrapper for a single "makefoo" unit test.
    210  1.1.1.3  christos 
    211  1.1.1.3  christos proc test_makefoo_1 {arglist expected} {
    212  1.1.1.3  christos   set exp "foo<$expected"
    213  1.1.1.3  christos   if {[string index $exp end] == ">"} {
    214  1.1.1.3  christos     append exp " "
    215  1.1.1.3  christos   }
    216  1.1.1.3  christos   append exp ">"
    217  1.1.1.3  christos   append exp "($expected)"
    218  1.1.1.3  christos 
    219  1.1.1.3  christos   set calc [makefoo $arglist]
    220  1.1.1.3  christos   send_log "makefoo $arglist = $calc\n"
    221  1.1.1.3  christos   send_log "expecting: $exp\n"
    222  1.1.1.3  christos   if {[string equal $exp $calc]} {
    223  1.1.1.3  christos     pass "makefoo unit test: $arglist"
    224  1.1.1.3  christos   } else {
    225  1.1.1.3  christos       fail "makefoo unit test: $arglist"
    226  1.1.1.3  christos   }
    227  1.1.1.3  christos }
    228  1.1.1.3  christos 
    229  1.1.1.3  christos # Test whether the procedure "makefoo" is functioning as expected.
    230  1.1.1.3  christos 
    231  1.1.1.3  christos proc test_makefoo {} {
    232  1.1.1.3  christos   test_makefoo_1 "i" "int"
    233  1.1.1.3  christos   test_makefoo_1 "ai" "a<int>"
    234  1.1.1.3  christos   test_makefoo_1 "aai" "a<a<int> >"
    235  1.1.1.3  christos   test_makefoo_1 "ii" "int, int"
    236  1.1.1.3  christos   test_makefoo_1 "aaibi" "a<a<int> >, b<int>"
    237  1.1.1.3  christos     test_makefoo_1 \
    238  1.1.1.3  christos       "ababiibababai" "a<b<a<b<int> > > >, int, b<a<b<a<b<a<int> > > > > >"
    239  1.1.1.3  christos   test_makefoo_1 "Aii" "A<int, int>"
    240  1.1.1.3  christos   test_makefoo_1 "ABaibibi" "A<B<a<int>, b<int> >, b<int> >"
    241  1.1.1.3  christos   test_makefoo_1 "na" "n::na"
    242  1.1.1.3  christos   test_makefoo_1 "nana" "n::na, n::na"
    243  1.1.1.3  christos   test_makefoo_1 "NAii" "n::NA<int, int>"
    244  1.1.1.3  christos   test_makefoo_1 "NANAiiNAii" "n::NA<n::NA<int, int>, n::NA<int, int> >"
    245  1.1.1.3  christos }
    246  1.1.1.3  christos 
    247  1.1.1.3  christos #
    248  1.1.1.3  christos # Tests start here.
    249  1.1.1.3  christos #
    250  1.1.1.3  christos 
    251      1.1  christos # Disable the completion limit for the whole testcase.
    252      1.1  christos gdb_test_no_output "set max-completions unlimited"
    253      1.1  christos 
    254      1.1  christos # Start of tests.
    255      1.1  christos 
    256      1.1  christos # Test completion of all parameter prefixes, crossing "(" and ")",
    257      1.1  christos # with and without whitespace.
    258      1.1  christos 
    259      1.1  christos proc_with_prefix all-param-prefixes {} {
    260      1.1  christos 
    261      1.1  christos     # Test both linespecs and explicit locations.
    262      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    263      1.1  christos 	set line "$cmd_prefix param_prefixes_test_long(long)"
    264      1.1  christos 	set start [index_after "test_long" $line]
    265      1.1  christos 	test_complete_prefix_range $line $start
    266      1.1  christos 
    267      1.1  christos 	# Same, but with extra spaces.  Note that the original spaces in
    268      1.1  christos 	# the input line are preserved after completion.
    269      1.1  christos 	test_gdb_complete_unique \
    270      1.1  christos 	    "$cmd_prefix param_prefixes_test_long(long "   \
    271      1.1  christos 	    "$cmd_prefix param_prefixes_test_long(long )"
    272      1.1  christos 	test_gdb_complete_unique \
    273      1.1  christos 	    "$cmd_prefix param_prefixes_test_long( long "  \
    274      1.1  christos 	    "$cmd_prefix param_prefixes_test_long( long )"
    275      1.1  christos 	test_gdb_complete_unique \
    276      1.1  christos 	    "$cmd_prefix param_prefixes_test_long ( long " \
    277      1.1  christos 	    "$cmd_prefix param_prefixes_test_long ( long )"
    278      1.1  christos 
    279      1.1  christos 	# Complete all parameter prefixes between "(i" and "(int*, int&)".
    280      1.1  christos 	# Note that this exercises completing when the point is at the
    281      1.1  christos 	# space in "param_prefixes_test_intp_intr(int*, ".
    282      1.1  christos 	set line "$cmd_prefix param_prefixes_test_intp_intr(int*, int&)"
    283      1.1  christos 	set start [index_after "intp_intr" $line]
    284      1.1  christos 	test_complete_prefix_range $line $start
    285      1.1  christos 
    286      1.1  christos 	# Similar, but with extra spaces.
    287      1.1  christos 	test_gdb_complete_unique \
    288      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int* " \
    289      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int* , int&)"
    290      1.1  christos 
    291      1.1  christos 	test_gdb_complete_unique \
    292      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *" \
    293      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *, int&)"
    294      1.1  christos 
    295      1.1  christos 	test_gdb_complete_unique \
    296      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *, int " \
    297      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *, int &)"
    298      1.1  christos 
    299      1.1  christos 	test_gdb_complete_unique \
    300      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *,  int & " \
    301      1.1  christos 	    "$cmd_prefix param_prefixes_test_intp_intr (  int *,  int & )"
    302      1.1  christos     }
    303      1.1  christos }
    304      1.1  christos 
    305      1.1  christos # Test completion of an overloaded function.
    306      1.1  christos 
    307      1.1  christos proc_with_prefix overload {} {
    308      1.1  christos     set completion_list {
    309      1.1  christos 	"overload_ambiguous_test(int, int)"
    310      1.1  christos 	"overload_ambiguous_test(int, long)"
    311      1.1  christos 	"overload_ambiguous_test(long)"
    312      1.1  christos     }
    313      1.1  christos 
    314      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    315      1.1  christos 	test_gdb_complete_multiple \
    316      1.1  christos 	    "$cmd_prefix " "overload_ambiguous_" "test(" \
    317      1.1  christos 	    $completion_list
    318      1.1  christos 	check_bp_locations_match_list \
    319      1.1  christos 	    "$cmd_prefix overload_ambiguous_test" \
    320      1.1  christos 	    $completion_list
    321      1.1  christos 
    322      1.1  christos 	# Test disambiguating by typing enough to pick the "int" as
    323      1.1  christos 	# first parameter type.  This then tests handling ambiguity in
    324      1.1  christos 	# the second parameter, which checks that tab completion when
    325      1.1  christos 	# the point is at the whitespace behaves naturally, by showing
    326      1.1  christos 	# the remaining matching overloads to the user.
    327      1.1  christos 	test_gdb_complete_multiple \
    328      1.1  christos 	    "$cmd_prefix " "overload_ambiguous_test(i" "nt, " {
    329      1.1  christos 	    "overload_ambiguous_test(int, int)"
    330      1.1  christos 	    "overload_ambiguous_test(int, long)"
    331      1.1  christos 	}
    332      1.1  christos 
    333      1.1  christos 	# Add a few more characters to make the completion
    334      1.1  christos 	# unambiguous.
    335      1.1  christos 	test_gdb_complete_unique \
    336      1.1  christos 	    "$cmd_prefix overload_ambiguous_test(int, i" \
    337      1.1  christos 	    "$cmd_prefix overload_ambiguous_test(int, int)"
    338      1.1  christos 	check_bp_locations_match_list \
    339      1.1  christos 	    "$cmd_prefix overload_ambiguous_test(int, int)" {
    340      1.1  christos 		"overload_ambiguous_test(int, int)"
    341      1.1  christos 	    }
    342      1.1  christos     }
    343      1.1  christos }
    344      1.1  christos 
    345      1.1  christos # Test completion of a function that is defined in different scopes
    346      1.1  christos # with different parameters.
    347      1.1  christos 
    348      1.1  christos proc_with_prefix overload-2 {} {
    349      1.1  christos     with_test_prefix "all" {
    350      1.1  christos 	set completion_list {
    351      1.1  christos 	    "(anonymous namespace)::overload2_function(overload2_arg3)"
    352      1.1  christos 	    "(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg4)"
    353      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    354      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    355      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    356      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
    357      1.1  christos 	    "ns_overload2_test::overload2_function(overload2_arg5)"
    358      1.1  christos 	    "ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"
    359      1.1  christos 	    "overload2_function(overload2_arg1)"
    360      1.1  christos 	    "struct_overload2_test::overload2_function(overload2_arg2)"
    361      1.1  christos 	}
    362      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    363      1.1  christos 	    test_gdb_complete_multiple \
    364      1.1  christos 		"$cmd_prefix " "overload2_func" "tion(overload2_arg" $completion_list
    365      1.1  christos 	    check_bp_locations_match_list \
    366      1.1  christos 		"$cmd_prefix overload2_function" $completion_list
    367      1.1  christos 	}
    368      1.1  christos     }
    369      1.1  christos 
    370      1.1  christos     # Same, but restrict to functions/methods in some scope.
    371      1.1  christos     with_test_prefix "restrict scope" {
    372      1.1  christos 	set completion_list {
    373      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    374      1.1  christos 	    "ns_overload2_test::overload2_function(overload2_arg5)"
    375      1.1  christos 	}
    376      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    377      1.1  christos 	    test_gdb_complete_multiple \
    378      1.1  christos 		"$cmd_prefix " "ns_overload2_test::overload2_func" "tion(overload2_arg" $completion_list
    379      1.1  christos 	    check_bp_locations_match_list \
    380      1.1  christos 		"$cmd_prefix ns_overload2_test::overload2_function" $completion_list
    381      1.1  christos 	}
    382      1.1  christos     }
    383      1.1  christos 
    384      1.1  christos     # Restrict to anonymous namespace scopes.
    385      1.1  christos     with_test_prefix "restrict scope 2" {
    386      1.1  christos 	set completion_list {
    387      1.1  christos 	    "(anonymous namespace)::overload2_function(overload2_arg3)"
    388      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    389      1.1  christos 	}
    390      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    391      1.1  christos 	    test_gdb_complete_multiple \
    392      1.1  christos 		"$cmd_prefix " "(anonymous namespace)::overload2_func" "tion(overload2_arg" $completion_list
    393      1.1  christos 	    check_bp_locations_match_list \
    394      1.1  christos 		"$cmd_prefix (anonymous namespace)::overload2_function" $completion_list
    395      1.1  christos 	}
    396      1.1  christos     }
    397      1.1  christos 
    398      1.1  christos     # Add enough scopes, and we get a unique completion.
    399      1.1  christos     with_test_prefix "unique completion" {
    400      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    401      1.1  christos 	    test_gdb_complete_unique \
    402      1.1  christos 		"$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_func" \
    403      1.1  christos 		"$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    404      1.1  christos 	    check_setting_bp_fails "$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_func"
    405      1.1  christos 	    check_bp_locations_match_list \
    406      1.1  christos 		"$cmd_prefix ns_overload2_test::(anonymous namespace)::overload2_function" \
    407      1.1  christos 		{"ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"}
    408      1.1  christos 	}
    409      1.1  christos     }
    410      1.1  christos }
    411      1.1  christos 
    412      1.1  christos # Test linespecs / locations using fully-qualified names.
    413      1.1  christos 
    414      1.1  christos proc_with_prefix fqn {} {
    415      1.1  christos 
    416      1.1  christos     # "-qualified" works with both explicit locations and linespecs.
    417      1.1  christos     # Also test that combining a source file with a function name
    418      1.1  christos     # still results in a full match, with both linespecs and explicit
    419      1.1  christos     # locations.
    420      1.1  christos     foreach cmd_prefix {
    421      1.1  christos 	"b -qualified "
    422      1.1  christos 	"b -qualified -function "
    423      1.1  christos 	"b -qualified cpls.cc:"
    424      1.1  christos 	"b -qualified -source cpls.cc -function "
    425      1.1  christos 	"b -source cpls.cc -qualified -function "
    426      1.1  christos     } {
    427      1.1  christos 	test_gdb_complete_unique \
    428      1.1  christos 	    "${cmd_prefix}overload2_func" \
    429      1.1  christos 	    "${cmd_prefix}overload2_function(overload2_arg1)"
    430      1.1  christos 
    431      1.1  christos 	# Drill down until we find a unique completion.
    432      1.1  christos 	test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::" "" {
    433      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    434      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    435      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    436      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
    437      1.1  christos 	    "ns_overload2_test::overload2_function(overload2_arg5)"
    438      1.1  christos 	    "ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"
    439      1.1  christos 	}
    440      1.1  christos 
    441      1.1  christos 	test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::(anonymous namespace)::" "" {
    442      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    443      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    444      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
    445      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
    446      1.1  christos 	}
    447      1.1  christos 
    448      1.1  christos 	test_gdb_complete_multiple "${cmd_prefix}" "ns_overload2_test::(anonymous namespace)::ns_overload2_test::" "" {
    449      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    450      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
    451      1.1  christos 	}
    452      1.1  christos 
    453      1.1  christos 	test_gdb_complete_unique \
    454      1.1  christos 	    "${cmd_prefix}ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_func" \
    455      1.1  christos 	    "${cmd_prefix}ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
    456      1.1  christos 
    457      1.1  christos     }
    458      1.1  christos }
    459      1.1  christos 
    460      1.1  christos # Check that a fully-qualified lookup name doesn't match symbols in
    461      1.1  christos # nested scopes.
    462      1.1  christos 
    463      1.1  christos proc_with_prefix fqn-2 {} {
    464      1.1  christos     set linespec "struct_overload2_test::overload2_function(overload2_arg6)"
    465      1.1  christos     set cmd_prefix "b -qualified"
    466      1.1  christos     check_setting_bp_fails "$cmd_prefix $linespec"
    467      1.1  christos     test_gdb_complete_none "$cmd_prefix $linespec"
    468      1.1  christos 
    469      1.1  christos     # Check that using the same name, but not fully-qualifying it,
    470      1.1  christos     # would find something, just to make sure the test above is
    471      1.1  christos     # testing what we intend to test.
    472      1.1  christos     set cmd_prefix "b -function"
    473      1.1  christos     test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
    474      1.1  christos     check_bp_locations_match_list \
    475      1.1  christos 	"$cmd_prefix $linespec" \
    476      1.1  christos 	{"ns_overload2_test::struct_overload2_test::overload2_function(overload2_arg6)"}
    477      1.1  christos }
    478      1.1  christos 
    479      1.1  christos # Test completion of functions in different scopes that have the same
    480      1.1  christos # name and parameters.  Restricting the scopes should find fewer and
    481      1.1  christos # fewer matches.
    482      1.1  christos 
    483      1.1  christos proc_with_prefix overload-3 {} {
    484      1.1  christos     with_test_prefix "all overloads" {
    485      1.1  christos 	set completion_list {
    486      1.1  christos 	    "(anonymous namespace)::overload3_function(int)"
    487      1.1  christos 	    "(anonymous namespace)::overload3_function(long)"
    488      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    489      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    490      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
    491      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(long)"
    492      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
    493      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
    494      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::overload3_function(int)"
    495      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::overload3_function(long)"
    496      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    497      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    498      1.1  christos 	    "ns_overload3_test::overload3_function(int)"
    499      1.1  christos 	    "ns_overload3_test::overload3_function(long)"
    500      1.1  christos 	    "ns_overload3_test::struct_overload3_test::overload3_function(int)"
    501      1.1  christos 	    "ns_overload3_test::struct_overload3_test::overload3_function(long)"
    502      1.1  christos 	    "overload3_function(int)"
    503      1.1  christos 	    "overload3_function(long)"
    504      1.1  christos 	    "struct_overload3_test::overload3_function(int)"
    505      1.1  christos 	    "struct_overload3_test::overload3_function(long)"
    506      1.1  christos 	}
    507      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    508      1.1  christos 	    test_gdb_complete_multiple "$cmd_prefix " "overload3_func" "tion(" $completion_list
    509      1.1  christos 	    check_bp_locations_match_list "$cmd_prefix overload3_function" $completion_list
    510      1.1  christos 	}
    511      1.1  christos     }
    512      1.1  christos 
    513      1.1  christos     with_test_prefix "restrict overload" {
    514      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    515      1.1  christos 	    test_gdb_complete_unique \
    516      1.1  christos 		"$cmd_prefix overload3_function(int)" \
    517      1.1  christos 		"$cmd_prefix overload3_function(int)"
    518      1.1  christos 	    check_bp_locations_match_list "$cmd_prefix overload3_function(int)" {
    519      1.1  christos 		"(anonymous namespace)::overload3_function(int)"
    520      1.1  christos 		"(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    521      1.1  christos 		"ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
    522      1.1  christos 		"ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
    523      1.1  christos 		"ns_overload3_test::(anonymous namespace)::overload3_function(int)"
    524      1.1  christos 		"ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    525      1.1  christos 		"ns_overload3_test::overload3_function(int)"
    526      1.1  christos 		"ns_overload3_test::struct_overload3_test::overload3_function(int)"
    527      1.1  christos 		"overload3_function(int)"
    528      1.1  christos 		"struct_overload3_test::overload3_function(int)"
    529      1.1  christos 	    }
    530      1.1  christos 	}
    531      1.1  christos     }
    532      1.1  christos 
    533      1.1  christos     with_test_prefix "restrict scope" {
    534      1.1  christos 	set completion_list {
    535      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    536      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    537      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
    538      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
    539      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
    540      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
    541      1.1  christos 	    "ns_overload3_test::struct_overload3_test::overload3_function(int)"
    542      1.1  christos 	    "ns_overload3_test::struct_overload3_test::overload3_function(long)"
    543      1.1  christos 	    "struct_overload3_test::overload3_function(int)"
    544      1.1  christos 	    "struct_overload3_test::overload3_function(long)"
    545      1.1  christos 	}
    546      1.1  christos 	foreach cmd_prefix {"b" "b -function"} {
    547      1.1  christos 	    test_gdb_complete_multiple \
    548      1.1  christos 		"$cmd_prefix " "struct_overload3_test::overload3_func" "tion(" \
    549      1.1  christos 		$completion_list
    550      1.1  christos 	    check_bp_locations_match_list \
    551      1.1  christos 		"$cmd_prefix struct_overload3_test::overload3_function" \
    552      1.1  christos 		$completion_list
    553      1.1  christos 	}
    554      1.1  christos     }
    555      1.1  christos }
    556      1.1  christos 
    557      1.1  christos # Test completing an overloaded template method.
    558      1.1  christos 
    559      1.1  christos proc_with_prefix template-overload {} {
    560      1.1  christos     set completion_list {
    561      1.1  christos 	"template_struct<int>::template_overload_fn(int)"
    562      1.1  christos 	"template_struct<long>::template_overload_fn(long)"
    563      1.1  christos     }
    564      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    565      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix " "template_overload_fn" "(" $completion_list
    566      1.1  christos 	check_bp_locations_match_list "$cmd_prefix template_overload_fn" $completion_list
    567      1.1  christos 	check_bp_locations_match_list \
    568      1.1  christos 	    "$cmd_prefix template_struct<int>::template_overload_fn" \
    569      1.1  christos 	    "template_struct<int>::template_overload_fn(int)"
    570      1.1  christos     }
    571      1.1  christos }
    572      1.1  christos 
    573      1.1  christos # Test completing template methods with non-void return type.
    574      1.1  christos 
    575      1.1  christos proc_with_prefix template-ret-type {} {
    576      1.1  christos     set method_name "template2_fn<int, int>"
    577      1.1  christos     set param_list "(template2_ret_type<int>, int, int)"
    578      1.1  christos     set struct_type "template2_struct<template2_ret_type<int> >"
    579      1.1  christos     set ret_type "template2_ret_type<int>"
    580      1.1  christos 
    581      1.1  christos     # Templates are listed both with and without return type, making
    582      1.1  christos     # "template2_<tab>" ambiguous.
    583      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    584      1.1  christos 	set completion_list \
    585      1.1  christos 	    [list \
    586      1.1  christos 		 "${ret_type} ${struct_type}::${method_name}${param_list}" \
    587      1.1  christos 		 "${struct_type}::${method_name}${param_list}"]
    588      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix " "template2_" "" $completion_list
    589      1.1  christos 
    590      1.1  christos 	# Add one character more after "2_", and the linespec becomes
    591      1.1  christos 	# unambiguous.  Test completing the whole prefix range after that,
    592      1.1  christos 	# thus testing completing either with or without return type.
    593      1.1  christos 	foreach {s t} [list \
    594      1.1  christos 			   "template2_r" \
    595      1.1  christos 			   "${ret_type} ${struct_type}::${method_name}${param_list}" \
    596      1.1  christos 			   "template2_s" \
    597      1.1  christos 			   "${struct_type}::${method_name}${param_list}"] {
    598      1.1  christos 	    set linespec $t
    599      1.1  christos 	    set complete_line "$cmd_prefix $linespec"
    600      1.1  christos 	    set start [index_after $s $complete_line]
    601      1.1  christos 	    test_complete_prefix_range $complete_line $start
    602      1.1  christos 	}
    603      1.1  christos 
    604  1.1.1.3  christos 	# Setting a breakpoint with or without template params and without
    605  1.1.1.3  christos 	# the method params works, just like with non-template functions.
    606  1.1.1.3  christos 	#  It also works with or without return type.
    607      1.1  christos 	foreach linespec [list \
    608  1.1.1.3  christos 			      "template2_fn" \
    609      1.1  christos 			      "${method_name}" \
    610      1.1  christos 			      "${method_name}${param_list}" \
    611      1.1  christos 			      "${struct_type}::${method_name}" \
    612      1.1  christos 			      "${struct_type}::${method_name}${param_list}" \
    613      1.1  christos 			      "${ret_type} ${struct_type}::${method_name}" \
    614      1.1  christos 			      "${ret_type} ${struct_type}::${method_name}${param_list}"] {
    615      1.1  christos 	    check_bp_locations_match_list \
    616      1.1  christos 		"$cmd_prefix $linespec" \
    617      1.1  christos 		[list "${struct_type}::${method_name}${param_list}"]
    618      1.1  christos 	}
    619      1.1  christos     }
    620      1.1  christos }
    621      1.1  christos 
    622  1.1.1.3  christos # Test completion of function template foo.
    623  1.1.1.3  christos 
    624  1.1.1.3  christos proc_with_prefix template-function-foo {} {
    625  1.1.1.3  christos 
    626  1.1.1.3  christos     foreach cmd_prefix {"b" "b -function"} {
    627  1.1.1.3  christos 	# "foo" is ambiguous, this will set many different breakpoints.
    628  1.1.1.3  christos 	set completion_list \
    629  1.1.1.3  christos 	    [list \
    630  1.1.1.3  christos 		 [makefoo Aabiaai] \
    631  1.1.1.3  christos 		 [makefoo Aabiabi] \
    632  1.1.1.3  christos 		 [makefoo Aabicdi] \
    633  1.1.1.3  christos 		 [makefoo AabicdiAabiaai] \
    634  1.1.1.3  christos 		 [makefoo AabicdiAabiabi] \
    635  1.1.1.3  christos 		 [makefoo AabicdiBabicdi] \
    636  1.1.1.3  christos 		 [makefoo Babicdi] \
    637  1.1.1.3  christos 		 [makefoo aai] \
    638  1.1.1.3  christos 		 [makefoo aaiabi] \
    639  1.1.1.3  christos 		 [makefoo aaicci] \
    640  1.1.1.3  christos 		 [makefoo aaicdi] \
    641  1.1.1.3  christos 		 [makefoo abi] \
    642  1.1.1.3  christos 		 [makefoo anabnb] \
    643  1.1.1.3  christos 		 [makefoo cci] \
    644  1.1.1.3  christos 		 [makefoo cdi] \
    645  1.1.1.3  christos 		 [makefoo NAnanbNBnanb] \
    646  1.1.1.3  christos 		 [makefoo nanb]]
    647  1.1.1.3  christos 	test_gdb_complete_multiple "$cmd_prefix " "foo" "<" $completion_list
    648  1.1.1.3  christos 	check_bp_locations_match_list "$cmd_prefix foo" $completion_list
    649  1.1.1.3  christos 
    650  1.1.1.3  christos 	# "foo<" should give the same result, but it should not set any
    651  1.1.1.3  christos 	# breakpoints.
    652  1.1.1.3  christos 	test_gdb_complete_multiple "$cmd_prefix " "foo<" "" $completion_list
    653  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<"
    654  1.1.1.3  christos 
    655  1.1.1.3  christos 	# "foo<A" should only give completions in COMPLETION_LIST that
    656  1.1.1.3  christos 	# start with "A" but should set no breakpoints.
    657  1.1.1.3  christos 	set completion_list \
    658  1.1.1.3  christos 	    [list \
    659  1.1.1.3  christos 		 [makefoo Aabiaai] \
    660  1.1.1.3  christos 		 [makefoo Aabiabi] \
    661  1.1.1.3  christos 		 [makefoo Aabicdi] \
    662  1.1.1.3  christos 		 [makefoo AabicdiAabiaai] \
    663  1.1.1.3  christos 		 [makefoo AabicdiAabiabi] \
    664  1.1.1.3  christos 		 [makefoo AabicdiBabicdi]]
    665  1.1.1.3  christos 	test_gdb_complete_multiple "$cmd_prefix " "foo<A" "<a<b<int> >, " \
    666  1.1.1.3  christos 	    $completion_list
    667  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<A"
    668  1.1.1.3  christos 
    669  1.1.1.3  christos 	# "foo<A>" should give any function with one parameter of any type
    670  1.1.1.3  christos 	# of A.  While the parameter list in the template should be ignored,
    671  1.1.1.3  christos 	# the function's argument list should not be ignored.
    672  1.1.1.3  christos 	set completion_list \
    673  1.1.1.3  christos 	    [list \
    674  1.1.1.3  christos 		 [makefoo Aabiaai] \
    675  1.1.1.3  christos 		 [makefoo Aabiabi] \
    676  1.1.1.3  christos 		 [makefoo Aabicdi]]
    677  1.1.1.3  christos 	test_gdb_complete_multiple "$cmd_prefix " "foo<A>" \
    678  1.1.1.3  christos 	    "(A<a<b<int> >, " $completion_list
    679  1.1.1.3  christos 	check_bp_locations_match_list "$cmd_prefix foo<A>" $completion_list
    680  1.1.1.3  christos 
    681  1.1.1.3  christos 	# "foo<A," should complete to any function with more than one
    682  1.1.1.3  christos 	# parameter where the first parameter is any type of A.  Insufficient
    683  1.1.1.3  christos 	# location to set breakpoints.
    684  1.1.1.3  christos 	set completion_list \
    685  1.1.1.3  christos 	    [list \
    686  1.1.1.3  christos 		 [makefoo AabicdiAabiaai] \
    687  1.1.1.3  christos 		 [makefoo AabicdiAabiabi] \
    688  1.1.1.3  christos 		 [makefoo AabicdiBabicdi]]
    689  1.1.1.3  christos 	test_gdb_complete_multiple "$cmd_prefix " "foo<A," " " \
    690  1.1.1.3  christos 	    $completion_list
    691  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<A,"
    692  1.1.1.3  christos 
    693  1.1.1.3  christos 	# "foo<A<a<b<int>, a" should give all completions starting with
    694  1.1.1.3  christos 	# "Aabia" but it is insufficient to set breakpoints.
    695  1.1.1.3  christos 	set completion_list \
    696  1.1.1.3  christos 	    [list \
    697  1.1.1.3  christos 		 [makefoo Aabiaai] \
    698  1.1.1.3  christos 		 [makefoo Aabiabi]]
    699  1.1.1.3  christos 	test_gdb_complete_multiple "$cmd_prefix " "foo<A<a<b<int> >, a" \
    700  1.1.1.3  christos 	    "<" $completion_list
    701  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<A<a<b<int> >, a"
    702  1.1.1.3  christos 
    703  1.1.1.3  christos 	# "foo<A<a<b<int>, a<" should yield the same results as above.
    704  1.1.1.3  christos 	test_gdb_complete_multiple "$cmd_prefix " "foo<A<a<b<int> >, a<" \
    705  1.1.1.3  christos 	    "" $completion_list
    706  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<A<a<b<int> >, a<"
    707  1.1.1.3  christos 
    708  1.1.1.3  christos 	# "foo<A<a<b<int>, a<a" is unique but insufficient to set a
    709  1.1.1.3  christos 	# breakpoint.  This has an ignored template parameter list, so
    710  1.1.1.3  christos 	# the completion will contain an ignored list ("a<a>")
    711  1.1.1.3  christos 	test_gdb_complete_unique "$cmd_prefix foo<A<a<b<int> >, a<a" \
    712  1.1.1.3  christos 	    "$cmd_prefix [makefoo Aabiaai]"
    713  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<A<b<int> >, a<a"
    714  1.1.1.3  christos 
    715  1.1.1.3  christos 	# "foo<A<a<b<int>, a<b" is also unique.  Same parameter ignoring
    716  1.1.1.3  christos 	# happens here, too (except "a<b>").
    717  1.1.1.3  christos 	test_gdb_complete_unique "$cmd_prefix foo<A<a<b<int> >, a<b" \
    718  1.1.1.3  christos 	    "$cmd_prefix [makefoo Aabiabi]"
    719  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<A<a<b<int> >, a<b"
    720  1.1.1.3  christos 
    721  1.1.1.3  christos 	# "foo<B" is unique but insufficient to set a breakpoint.
    722  1.1.1.3  christos 	test_gdb_complete_unique "$cmd_prefix foo<B" \
    723  1.1.1.3  christos 	    "$cmd_prefix [makefoo Babicdi]"
    724  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<B"
    725  1.1.1.3  christos 
    726  1.1.1.3  christos 	# "foo<B>" yields the same unique result and sets a breakpoint.
    727  1.1.1.3  christos 	# Since the input skips the parameter list, so does the completion.
    728  1.1.1.3  christos 	test_gdb_complete_unique "$cmd_prefix foo<B>" \
    729  1.1.1.3  christos 	    "$cmd_prefix foo<B>(B<a<b<int> >, c<d<int> > >)"
    730  1.1.1.3  christos 	check_bp_locations_match_list "$cmd_prefix foo<B>" \
    731  1.1.1.3  christos 	    [list [makefoo Babicdi]]
    732  1.1.1.3  christos 
    733  1.1.1.3  christos 	# "foo<B," should return no completions and no breakpoints.
    734  1.1.1.3  christos 	test_gdb_complete_none "$cmd_prefix foo<B,"
    735  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<B,"
    736  1.1.1.3  christos 
    737  1.1.1.3  christos 	# "foo<n::" should yield only the functions starting with
    738  1.1.1.3  christos 	# "n" and "N" and no breakpoints.
    739  1.1.1.3  christos 	set completion_list \
    740  1.1.1.3  christos 	    [list \
    741  1.1.1.3  christos 		 [makefoo NAnanbNBnanb] \
    742  1.1.1.3  christos 		 [makefoo nanb]]
    743  1.1.1.3  christos 	test_gdb_complete_multiple "$cmd_prefix " "foo<n::" "" \
    744  1.1.1.3  christos 	    $completion_list
    745  1.1.1.3  christos 	check_setting_bp_fails "$cmd_prefix foo<n::"
    746  1.1.1.3  christos 
    747  1.1.1.3  christos 	# "foo<A<a, c> >" is unique and sets a breakpoint.
    748  1.1.1.3  christos 	# Multiple template parameter lists are skipped, so GDB will ignore
    749  1.1.1.3  christos 	# them in the completion.
    750  1.1.1.3  christos 	test_gdb_complete_unique "$cmd_prefix foo<A<a, c> >" \
    751  1.1.1.3  christos 	    "$cmd_prefix foo<A<a, c> >(A<a<b<int> >, c<d<int> > >)"
    752  1.1.1.3  christos 	check_bp_locations_match_list "$cmd_prefix foo<A<a, c> >" \
    753  1.1.1.3  christos 	    [list [makefoo Aabicdi]]
    754  1.1.1.3  christos     }
    755  1.1.1.3  christos }
    756  1.1.1.3  christos 
    757  1.1.1.3  christos # Helper for template-class-with-method to build completion lists.
    758  1.1.1.3  christos 
    759  1.1.1.3  christos proc makem {arglist_list} {
    760  1.1.1.3  christos     set completion_list {}
    761  1.1.1.3  christos     foreach arglist $arglist_list {
    762  1.1.1.3  christos 	lappend completion_list "[maketype $arglist]::method()"
    763  1.1.1.3  christos     }
    764  1.1.1.3  christos     return $completion_list
    765  1.1.1.3  christos }
    766  1.1.1.3  christos 
    767  1.1.1.3  christos # Returns a list of elements that look like
    768  1.1.1.3  christos #   void TYPE::method()
    769  1.1.1.3  christos # where TYPE is derived from each arglist in ARGLIST_LIST.
    770  1.1.1.3  christos 
    771  1.1.1.3  christos proc test_makem_1 {arglist_list expected_list} {
    772  1.1.1.3  christos     set result [makem $arglist_list]
    773  1.1.1.3  christos     send_log "makem $arglist = $result\n"
    774  1.1.1.3  christos     send_log "expecting $expected_list\n"
    775  1.1.1.3  christos 
    776  1.1.1.3  christos     # Do list equality via canonical strings.
    777  1.1.1.3  christos     if {[expr {[list {*}$expected_list] eq [list {*}$result]}]} {
    778  1.1.1.3  christos 	pass "makem unit test: $arglist"
    779  1.1.1.3  christos     } else {
    780  1.1.1.3  christos 	fail "makem unit test: $arglist"
    781  1.1.1.3  christos     }
    782  1.1.1.3  christos }
    783  1.1.1.3  christos 
    784  1.1.1.3  christos # Unit tests for makem.
    785  1.1.1.3  christos 
    786  1.1.1.3  christos proc test_makem {} {
    787  1.1.1.3  christos     test_makem_1 ai {"a<int>::method()"}
    788  1.1.1.3  christos     test_makem_1 bi {"b<int>::method()"}
    789  1.1.1.3  christos     test_makem_1 {ai bi} {"a<int>::method()" "b<int>::method()"}
    790  1.1.1.3  christos     test_makem_1 {Aaiaai Bbibbi abi cdi} {
    791  1.1.1.3  christos 	"A<a<int>, a<a<int> > >::method()"
    792  1.1.1.3  christos 	"B<b<int>, b<b<int> > >::method()"
    793  1.1.1.3  christos 	"a<b<int> >::method()"
    794  1.1.1.3  christos 	"c<d<int> >::method()"
    795  1.1.1.3  christos     }
    796  1.1.1.3  christos }
    797  1.1.1.3  christos 
    798  1.1.1.3  christos # Test class template containing a (non-templated) method called "method."
    799  1.1.1.3  christos 
    800  1.1.1.3  christos proc_with_prefix template-class-with-method {} {
    801  1.1.1.3  christos 
    802  1.1.1.3  christos     foreach {type type_list} \
    803  1.1.1.3  christos 	[list \
    804  1.1.1.3  christos 	     "" {aai abi cci cdi Aabicdi Aabiaai Aabiabi Babicdi} \
    805  1.1.1.3  christos 	     "a" {aai abi} \
    806  1.1.1.3  christos 	     "b" {} \
    807  1.1.1.3  christos 	     "c" {cci cdi} \
    808  1.1.1.3  christos 	     "A" {Aabicdi Aabiaai Aabiabi} \
    809  1.1.1.3  christos 	     "B" {Babicdi} \
    810  1.1.1.3  christos 	     "A<a, a>" {Aabiaai Aabiabi} \
    811  1.1.1.3  christos 	     "A<a<b>, c>" {Aabicdi}\
    812  1.1.1.3  christos 	     "A<a, d>" {} \
    813  1.1.1.3  christos 	     "B<a, a>" {} \
    814  1.1.1.3  christos 	     "B<a, b>" {} \
    815  1.1.1.3  christos 	     "B<a, c>" {Babicdi}] \
    816  1.1.1.3  christos 	{
    817  1.1.1.3  christos 	    foreach cmd_prefix {"b" "b -function"} {
    818  1.1.1.3  christos 		set c "$cmd_prefix "
    819  1.1.1.3  christos 		if {$type != ""} {
    820  1.1.1.3  christos 		    append c "${type}::"
    821  1.1.1.3  christos 		}
    822  1.1.1.3  christos 		append c "method"
    823  1.1.1.3  christos 
    824  1.1.1.3  christos 		if {[llength $type_list] > 0} {
    825  1.1.1.3  christos 		    test_gdb_complete_unique $c "${c}()"
    826  1.1.1.3  christos 		    check_bp_locations_match_list $c [makem $type_list]
    827  1.1.1.3  christos 		} else {
    828  1.1.1.3  christos 		    test_gdb_complete_none $c
    829  1.1.1.3  christos 		}
    830  1.1.1.3  christos 	    }
    831  1.1.1.3  christos 	}
    832  1.1.1.3  christos }
    833  1.1.1.3  christos 
    834  1.1.1.5  christos # Test completion of a const-overloaded function (const-overload).
    835      1.1  christos # Note that "const" appears after the function/method parameters.
    836      1.1  christos 
    837      1.1  christos proc_with_prefix const-overload {} {
    838      1.1  christos     set completion_list {
    839      1.1  christos 	"struct_with_const_overload::const_overload_fn()"
    840      1.1  christos 	"struct_with_const_overload::const_overload_fn() const"
    841      1.1  christos     }
    842      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    843      1.1  christos 	test_gdb_complete_multiple \
    844      1.1  christos 	    "$cmd_prefix " "const_overload_fn" "()" \
    845      1.1  christos 	    $completion_list
    846      1.1  christos 	test_gdb_complete_multiple \
    847      1.1  christos 	    "$cmd_prefix " "const_overload_fn ( " ")" \
    848      1.1  christos 	    $completion_list
    849      1.1  christos 	test_gdb_complete_multiple \
    850      1.1  christos 	    "$cmd_prefix " "const_overload_fn()" "" \
    851      1.1  christos 	    $completion_list
    852      1.1  christos 
    853      1.1  christos 	check_bp_locations_match_list \
    854      1.1  christos 	    "$cmd_prefix const_overload_fn" \
    855      1.1  christos 	    {"struct_with_const_overload::const_overload_fn()"
    856      1.1  christos 		"struct_with_const_overload::const_overload_fn() const"}
    857      1.1  christos 
    858      1.1  christos 	check_setting_bp_fails "$cmd_prefix const_overload_fn("
    859      1.1  christos 	check_bp_locations_match_list \
    860      1.1  christos 	    "$cmd_prefix const_overload_fn()" \
    861      1.1  christos 	    {"struct_with_const_overload::const_overload_fn()"}
    862      1.1  christos 	check_bp_locations_match_list \
    863      1.1  christos 	    "$cmd_prefix const_overload_fn() const" \
    864      1.1  christos 	    {"struct_with_const_overload::const_overload_fn() const"}
    865      1.1  christos     }
    866      1.1  christos }
    867      1.1  christos 
    868      1.1  christos # Same but quote-enclose the function name.  This makes the overload
    869      1.1  christos # no longer be ambiguous.
    870      1.1  christos 
    871      1.1  christos proc_with_prefix const-overload-quoted {} {
    872      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    873      1.1  christos 	set linespec "'const_overload_fn()'"
    874      1.1  christos 	test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
    875      1.1  christos 	check_bp_locations_match_list \
    876      1.1  christos 	    "$cmd_prefix $linespec" {
    877      1.1  christos 		"struct_with_const_overload::const_overload_fn()"
    878      1.1  christos 	    }
    879      1.1  christos 
    880      1.1  christos 	set linespec "'const_overload_fn() const'"
    881      1.1  christos 	test_gdb_complete_unique "$cmd_prefix $linespec" "$cmd_prefix $linespec"
    882      1.1  christos 	check_bp_locations_match_list \
    883      1.1  christos 	    "$cmd_prefix $linespec" {
    884      1.1  christos 		"struct_with_const_overload::const_overload_fn() const"
    885      1.1  christos 	    }
    886      1.1  christos     }
    887      1.1  christos }
    888      1.1  christos 
    889      1.1  christos # Test that when the function is unambiguous, linespec completion
    890      1.1  christos # appends the end quote char automatically, both ' and ".
    891      1.1  christos 
    892      1.1  christos proc_with_prefix append-end-quote-char-when-unambiguous {} {
    893      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
    894      1.1  christos 	foreach qc $completion::all_quotes_list {
    895      1.1  christos 	    set linespec "${qc}not_overloaded_fn()${qc}"
    896      1.1  christos 	    foreach cmd [list "$cmd_prefix ${qc}not_overloaded_fn()" \
    897      1.1  christos 			      "$cmd_prefix ${qc}not_overloaded_fn" \
    898      1.1  christos 			      "$cmd_prefix ${qc}not_overloaded_"] {
    899      1.1  christos 		test_gdb_complete_unique $cmd "$cmd_prefix $linespec"
    900      1.1  christos 	    }
    901      1.1  christos 	    check_bp_locations_match_list \
    902      1.1  christos 		"$cmd_prefix $linespec" {"not_overloaded_fn()"}
    903      1.1  christos 	}
    904      1.1  christos     }
    905      1.1  christos }
    906      1.1  christos 
    907      1.1  christos # Test completing symbols of source files.
    908      1.1  christos 
    909      1.1  christos proc_with_prefix in-source-file-unconstrained {} {
    910      1.1  christos     # First test that unconstrained matching picks up functions from
    911      1.1  christos     # multiple files.
    912      1.1  christos     test_gdb_complete_multiple "b " "file_constrained_test" "_cpls" {
    913      1.1  christos 	"file_constrained_test_cpls2_function(int)"
    914      1.1  christos 	"file_constrained_test_cpls_function(int)"
    915      1.1  christos     }
    916      1.1  christos     check_setting_bp_fails "b file_constrained_test_cpls"
    917      1.1  christos }
    918      1.1  christos 
    919      1.1  christos # Test an unambiguous completion that would be ambiguous if it weren't
    920      1.1  christos # for the source file component, due to
    921      1.1  christos # "file_constrained_test_cpls_function" in cpls.cc.  Test with
    922      1.1  christos # different components quoted, and with whitespace before the function
    923      1.1  christos # name.
    924      1.1  christos 
    925      1.1  christos proc_with_prefix in-source-file-unambiguous {} {
    926      1.1  christos     foreach sqc $completion::maybe_quoted_list {
    927      1.1  christos 	foreach fqc $completion::maybe_quoted_list {
    928      1.1  christos 	    # Linespec.
    929      1.1  christos 	    foreach sep {":" ": "} {
    930      1.1  christos 		set linespec \
    931      1.1  christos 		    "${sqc}cpls2.cc${sqc}${sep}${fqc}file_constrained_test_cpls2_function(int)${fqc}"
    932      1.1  christos 		set complete_line "b $linespec"
    933      1.1  christos 		set start [index_after "constrained_test" $complete_line]
    934      1.1  christos 		set input_line [string range $complete_line 0 $start]
    935      1.1  christos 		test_gdb_complete_unique $input_line ${complete_line}
    936      1.1  christos 		check_bp_locations_match_list "b $linespec" {
    937      1.1  christos 		    "file_constrained_test_cpls2_function(int)"
    938      1.1  christos 		}
    939      1.1  christos 	    }
    940      1.1  christos 
    941      1.1  christos 	    # Explicit location.
    942      1.1  christos 	    set source_opt "-source ${sqc}cpls2.cc${sqc}"
    943      1.1  christos 	    set function_opt "-function ${fqc}file_constrained_test_cpls2_function(int)${fqc}"
    944      1.1  christos 	    set complete_line "b $source_opt $function_opt"
    945      1.1  christos 	    set start [index_after "cpls2_functio" $complete_line]
    946      1.1  christos 	    set input_line [string range $complete_line 0 $start]
    947      1.1  christos 	    test_gdb_complete_unique $input_line ${complete_line}
    948      1.1  christos 	    check_bp_locations_match_list "$complete_line" {
    949      1.1  christos 		    "file_constrained_test_cpls2_function(int)"
    950      1.1  christos 	    }
    951      1.1  christos 	}
    952      1.1  christos     }
    953      1.1  christos }
    954      1.1  christos 
    955      1.1  christos # Test an ambiguous completion constrained by a source file.  Test
    956      1.1  christos # with different components quoted, and with whitespace before the
    957      1.1  christos # function name.
    958      1.1  christos 
    959      1.1  christos proc_with_prefix in-source-file-ambiguous {} {
    960      1.1  christos     foreach sqc $completion::maybe_quoted_list {
    961      1.1  christos 	foreach fqc $completion::maybe_quoted_list {
    962      1.1  christos 	    # Linespec.
    963      1.1  christos 	    foreach sep {":" ": "} {
    964      1.1  christos 		set cmd_prefix "b ${sqc}cpls2.cc${sqc}${sep}"
    965      1.1  christos 		test_gdb_complete_multiple "${cmd_prefix}" ${fqc} "" {
    966      1.1  christos 		    "another_file_constrained_test_cpls2_function(int)"
    967      1.1  christos 		    "file_constrained_test_cpls2_function(int)"
    968      1.1  christos 		} ${fqc} ${fqc}
    969      1.1  christos 	    }
    970      1.1  christos 
    971      1.1  christos 	    # Explicit location.
    972      1.1  christos 	    test_gdb_complete_multiple \
    973      1.1  christos 		"b -source ${sqc}cpls2.cc${sqc} -function " ${fqc} "" {
    974      1.1  christos 		"another_file_constrained_test_cpls2_function(int)"
    975      1.1  christos 		"file_constrained_test_cpls2_function(int)"
    976      1.1  christos 	    } ${fqc} ${fqc}
    977      1.1  christos 	}
    978      1.1  christos     }
    979      1.1  christos }
    980      1.1  christos 
    981      1.1  christos # Check that completing a file name in a linespec auto-appends a colon
    982      1.1  christos # instead of a whitespace character.
    983      1.1  christos 
    984      1.1  christos proc_with_prefix source-complete-appends-colon {} {
    985      1.1  christos     # Test with quotes to make sure the end quote char is put at the
    986      1.1  christos     # right place.
    987      1.1  christos     foreach qc $completion::maybe_quoted_list {
    988      1.1  christos 	test_gdb_complete_unique \
    989      1.1  christos 	    "b ${qc}cpls2." \
    990      1.1  christos 	    "b ${qc}cpls2.cc${qc}" ":"
    991      1.1  christos 	test_gdb_complete_unique \
    992      1.1  christos 	    "b ${qc}cpls2.c" \
    993      1.1  christos 	    "b ${qc}cpls2.cc${qc}" ":"
    994      1.1  christos 	test_gdb_complete_unique \
    995      1.1  christos 	    "b ${qc}cpls2.cc" \
    996      1.1  christos 	    "b ${qc}cpls2.cc${qc}" ":"
    997      1.1  christos 
    998      1.1  christos 	# Same, but with a filename with an hyphen (which is normally
    999      1.1  christos 	# a language word break char).
   1000      1.1  christos 	test_gdb_complete_unique \
   1001      1.1  christos 	    "b ${qc}cpls-" \
   1002      1.1  christos 	    "b ${qc}cpls-hyphen.cc${qc}" ":"
   1003      1.1  christos 	test_gdb_complete_unique \
   1004      1.1  christos 	    "b ${qc}cpls-hyphen" \
   1005      1.1  christos 	    "b ${qc}cpls-hyphen.cc${qc}" ":"
   1006      1.1  christos     }
   1007      1.1  christos 
   1008      1.1  christos     # Test the same, but with the name of a nonexisting file.
   1009      1.1  christos 
   1010      1.1  christos     # Cursor at the end of the string.
   1011      1.1  christos     test_gdb_complete_none "b nonexistingfilename.cc"
   1012      1.1  christos     # Cursor past the end of the string.
   1013      1.1  christos     test_gdb_complete_multiple "b nonexistingfilename.cc " "" "" \
   1014      1.1  christos 	$completion::keyword_list
   1015      1.1  christos     foreach qc $completion::all_quotes_list {
   1016      1.1  christos 	# Unterminated quote.
   1017      1.1  christos 	test_gdb_complete_none "b ${qc}nonexistingfilename.cc"
   1018      1.1  christos 	test_gdb_complete_none "b ${qc}nonexistingfilename.cc "
   1019      1.1  christos 	# Terminated quote, cursor at the quote.
   1020      1.1  christos 	test_gdb_complete_unique \
   1021      1.1  christos 	    "b ${qc}nonexistingfilename.cc${qc}" \
   1022      1.1  christos 	    "b ${qc}nonexistingfilename.cc${qc}"
   1023      1.1  christos 	# Terminated quote, cursor past the quote.
   1024      1.1  christos 	test_gdb_complete_multiple \
   1025      1.1  christos 	    "b ${qc}nonexistingfilename.cc${qc} " "" "" \
   1026      1.1  christos 	    $completion::keyword_list
   1027      1.1  christos     }
   1028      1.1  christos }
   1029      1.1  christos 
   1030      1.1  christos ####################################################################
   1031      1.1  christos 
   1032      1.1  christos # Test that a colon at the end of the linespec is understood as an
   1033      1.1  christos # incomplete scope operator (incomplete-scope-colon), instead of a
   1034      1.1  christos # source/function separator.
   1035      1.1  christos 
   1036      1.1  christos proc_with_prefix incomplete-scope-colon {} {
   1037      1.1  christos 
   1038      1.1  christos     # Helper for the loop below to simplify it.  Tests completion of
   1039      1.1  christos     # the range defined by the RANGE_SS found in the constructed line.
   1040      1.1  christos     #
   1041      1.1  christos     # E.g., with:
   1042      1.1  christos     #
   1043      1.1  christos     #   source="source.cc"
   1044      1.1  christos     #   fqc="'"
   1045      1.1  christos     #   prototype="ns::function()"
   1046      1.1  christos     #   range_ss="s::f"
   1047      1.1  christos     #
   1048      1.1  christos     # we'd try completing with the cursor set in each of the
   1049      1.1  christos     # underlined range's positions of:
   1050      1.1  christos     #
   1051      1.1  christos     #   b source.cc:'ns::function()'"
   1052      1.1  christos     #                 ^^^^
   1053      1.1  christos     #
   1054      1.1  christos     # Also test that setting a breakpoint at the constructed line
   1055      1.1  christos     # finds the same breakpoint location as completion does.
   1056      1.1  christos     #
   1057      1.1  christos     proc incomplete_scope_colon_helper {prototype range_ss {skip_check_bp 0}} {
   1058      1.1  christos 	foreach source {"" "cpls.cc"} {
   1059      1.1  christos 	    # Test with and without source quoting.
   1060      1.1  christos 	    foreach sqc $completion::maybe_quoted_list {
   1061      1.1  christos 		if {$source == "" && $sqc != ""} {
   1062      1.1  christos 		    # Invalid combination.
   1063      1.1  christos 		    continue
   1064      1.1  christos 		}
   1065      1.1  christos 
   1066      1.1  christos 		# Test with and without function quoting.
   1067      1.1  christos 		foreach fqc $completion::maybe_quoted_list {
   1068      1.1  christos 		    if {$source == ""} {
   1069      1.1  christos 			set linespec_source ""
   1070      1.1  christos 			set explicit_source ""
   1071      1.1  christos 		    } else {
   1072      1.1  christos 			set linespec_source "${sqc}${source}${sqc}:"
   1073      1.1  christos 			set explicit_source "-source ${sqc}${source}${sqc}"
   1074      1.1  christos 		    }
   1075      1.1  christos 
   1076      1.1  christos 		    # Even though this use case is trickier with
   1077      1.1  christos 		    # linespecs due to the ":" as separator, test both
   1078      1.1  christos 		    # linespecs and explicit locations for
   1079      1.1  christos 		    # completeness.
   1080      1.1  christos 		    foreach location [list \
   1081      1.1  christos 					  "${linespec_source}${fqc}$prototype${fqc}" \
   1082      1.1  christos 					  "${explicit_source} -function ${fqc}$prototype${fqc}"] {
   1083      1.1  christos 			set complete_line "b $location"
   1084      1.1  christos 			set start [string first $range_ss $complete_line]
   1085      1.1  christos 			set end [expr ($start + [string length $range_ss])]
   1086      1.1  christos 			test_complete_prefix_range $complete_line $start $end
   1087      1.1  christos 			if {!$skip_check_bp} {
   1088      1.1  christos 			    check_bp_locations_match_list "b $location" [list "$prototype"]
   1089      1.1  christos 			}
   1090      1.1  christos 		    }
   1091      1.1  christos 		}
   1092      1.1  christos 	    }
   1093      1.1  christos 	}
   1094      1.1  christos     }
   1095      1.1  christos 
   1096      1.1  christos     incomplete_scope_colon_helper \
   1097      1.1  christos 	"struct_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
   1098      1.1  christos 	"t::i"
   1099      1.1  christos 
   1100      1.1  christos     incomplete_scope_colon_helper \
   1101      1.1  christos 	"ns_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
   1102      1.1  christos 	"t::i"
   1103      1.1  christos 
   1104      1.1  christos     # Test completing around both "::"s.
   1105      1.1  christos     foreach range_ss {"t::s" "t::i"} skip_check_bp {0 1} {
   1106      1.1  christos 	incomplete_scope_colon_helper \
   1107      1.1  christos 	    "ns2_incomplete_scope_colon_test::struct_in_ns2_incomplete_scope_colon_test::incomplete_scope_colon_test()" \
   1108      1.1  christos 	    $range_ss $skip_check_bp
   1109      1.1  christos     }
   1110      1.1  christos }
   1111      1.1  christos 
   1112      1.1  christos # Test completing functions/methods in anonymous namespaces.
   1113      1.1  christos 
   1114      1.1  christos proc_with_prefix anon-ns {} {
   1115      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
   1116      1.1  christos 	foreach qc $completion::maybe_quoted_list {
   1117      1.1  christos 	    test_gdb_complete_unique \
   1118      1.1  christos 		"$cmd_prefix ${qc}anon_ns_function" \
   1119      1.1  christos 		"$cmd_prefix ${qc}anon_ns_function()${qc}"
   1120      1.1  christos 	    check_bp_locations_match_list "$cmd_prefix ${qc}anon_ns_function()${qc}" {
   1121      1.1  christos 		"(anonymous namespace)::anon_ns_function()"
   1122      1.1  christos 		"(anonymous namespace)::anon_ns_struct::anon_ns_function()"
   1123      1.1  christos 		"the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
   1124      1.1  christos 		"the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_struct::anon_ns_function()"
   1125      1.1  christos 	    }
   1126      1.1  christos 	}
   1127      1.1  christos 
   1128      1.1  christos 	# A "(" finds all anonymous namespace functions/methods in all
   1129      1.1  christos 	# scopes.
   1130      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix " "(" "anonymous namespace)::" {
   1131      1.1  christos 	    "(anonymous namespace)::anon_ns_function()"
   1132      1.1  christos 	    "(anonymous namespace)::anon_ns_struct::anon_ns_function()"
   1133      1.1  christos 	    "(anonymous namespace)::overload2_function(overload2_arg3)"
   1134      1.1  christos 	    "(anonymous namespace)::overload3_function(int)"
   1135      1.1  christos 	    "(anonymous namespace)::overload3_function(long)"
   1136      1.1  christos 	    "(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg4)"
   1137      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(int)"
   1138      1.1  christos 	    "(anonymous namespace)::struct_overload3_test::overload3_function(long)"
   1139      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::overload2_function(overload2_arg9)"
   1140      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::ns_overload2_test::struct_overload2_test::overload2_function(overload2_arga)"
   1141      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::overload2_function(overload2_arg7)"
   1142      1.1  christos 	    "ns_overload2_test::(anonymous namespace)::struct_overload2_test::overload2_function(overload2_arg8)"
   1143      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(int)"
   1144      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::overload3_function(long)"
   1145      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(int)"
   1146      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::ns_overload3_test::struct_overload3_test::overload3_function(long)"
   1147      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::overload3_function(int)"
   1148      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::overload3_function(long)"
   1149      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(int)"
   1150      1.1  christos 	    "ns_overload3_test::(anonymous namespace)::struct_overload3_test::overload3_function(long)"
   1151      1.1  christos 	    "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
   1152      1.1  christos 	    "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_struct::anon_ns_function()"
   1153      1.1  christos 	}
   1154      1.1  christos 
   1155      1.1  christos 	set function "the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_function()"
   1156      1.1  christos 	test_gdb_complete_unique "$cmd_prefix $function" "$cmd_prefix $function"
   1157      1.1  christos 	check_bp_locations_match_list "$cmd_prefix $function" [list $function]
   1158      1.1  christos 
   1159      1.1  christos 	# Test completing after the "(anonymous namespace)" part.
   1160      1.1  christos 	test_gdb_complete_unique \
   1161      1.1  christos 	    "$cmd_prefix the_anon_ns_wrapper_ns::(anonymous namespace)::anon_ns_fu" \
   1162      1.1  christos 	    "$cmd_prefix $function"
   1163      1.1  christos 
   1164      1.1  christos 	# Test whitespace in the "(anonymous namespace)" component.
   1165      1.1  christos 
   1166      1.1  christos 	test_gdb_complete_unique \
   1167      1.1  christos 	    "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous   namespace )::anon_ns_fu" \
   1168      1.1  christos 	    "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous   namespace )::anon_ns_function()"
   1169      1.1  christos 	check_setting_bp_fails \
   1170      1.1  christos 	    "$cmd_prefix the_anon_ns_wrapper_ns::( anonymous   namespace )::anon_ns_fu"
   1171      1.1  christos 
   1172      1.1  christos 	set function_ws \
   1173      1.1  christos 	    "the_anon_ns_wrapper_ns::( anonymous   namespace )::anon_ns_function ( )"
   1174      1.1  christos 	test_gdb_complete_unique "$cmd_prefix $function_ws" "$cmd_prefix $function_ws"
   1175      1.1  christos 	check_bp_locations_match_list "$cmd_prefix $function_ws" [list $function]
   1176      1.1  christos     }
   1177      1.1  christos }
   1178      1.1  christos 
   1179      1.1  christos # Basic test for completing "operator<".  More extensive C++ operator
   1180      1.1  christos # tests in cpls-op.exp.
   1181      1.1  christos 
   1182      1.1  christos proc_with_prefix operator< {} {
   1183      1.1  christos     # Complete all prefixes between "oper" and the whole prototype.
   1184      1.1  christos     set function "operator<(foo_enum, foo_enum)"
   1185      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
   1186      1.1  christos 	set line "$cmd_prefix $function"
   1187      1.1  christos 	set start [index_after "oper" $line]
   1188      1.1  christos 	test_complete_prefix_range $line $start
   1189      1.1  christos     }
   1190      1.1  christos 
   1191      1.1  christos     # There's a label in the function; try completing it.  (Exhaustive
   1192      1.1  christos     # label completion tests further below.)
   1193      1.1  christos     foreach location [list \
   1194      1.1  christos 		     "$function:label1" \
   1195      1.1  christos 		     "-function $function -label label1"] {
   1196      1.1  christos 
   1197      1.1  christos 	set cmd "b $location"
   1198      1.1  christos 	set input_line [string range $cmd 0 [expr [string length $cmd] - 3]]
   1199      1.1  christos 
   1200      1.1  christos 	test_gdb_complete_unique $input_line $cmd
   1201      1.1  christos 	test_gdb_complete_unique $cmd $cmd
   1202      1.1  christos 	check_bp_locations_match_list $cmd [list "$location"]
   1203      1.1  christos     }
   1204      1.1  christos }
   1205      1.1  christos 
   1206      1.1  christos # Test completion of scopes with an ambiguous prefix.
   1207      1.1  christos 
   1208      1.1  christos proc_with_prefix ambiguous-prefix {} {
   1209      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
   1210      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix " "ambiguous_pre" "fix_" {
   1211      1.1  christos 	    "ambiguous_prefix_global_func()"
   1212      1.1  christos 	    "the_ambiguous_prefix_ns::ambiguous_prefix_ns_func()"
   1213      1.1  christos 	    "the_ambiguous_prefix_struct::ambiguous_prefix_method()"
   1214      1.1  christos 	}
   1215      1.1  christos 	check_setting_bp_fails "$cmd_prefix ambiguous_prefix_"
   1216      1.1  christos     }
   1217      1.1  christos }
   1218      1.1  christos 
   1219      1.1  christos # Test completion of function labels.
   1220      1.1  christos 
   1221      1.1  christos proc_with_prefix function-labels {} {
   1222      1.1  christos     # Test with and without a source file component.
   1223      1.1  christos     foreach_location_functions \
   1224      1.1  christos 	{ "" "cpls.cc" } \
   1225      1.1  christos 	{ "function_with_labels(int)" } \
   1226      1.1  christos 	{
   1227      1.1  christos 	    # Linespec version.  Test various spacing around the label
   1228      1.1  christos 	    # colon separator.
   1229      1.1  christos 	    foreach label_sep {":" " :" ": " " : "} {
   1230      1.1  christos 		set linespec "${location}${label_sep}"
   1231      1.1  christos 		test_gdb_complete_multiple "b $linespec" "l" "abel" {
   1232      1.1  christos 		    "label1"
   1233      1.1  christos 		    "label2"
   1234      1.1  christos 		}
   1235      1.1  christos 		check_setting_bp_fails "b ${linespec}label"
   1236      1.1  christos 
   1237      1.1  christos 		set tsep [string trim ${source_sep}]
   1238      1.1  christos 		check_bp_locations_match_list \
   1239      1.1  christos 		    "b ${linespec}label1" [list "${source}${tsep}${function}:label1"]
   1240      1.1  christos 		check_bp_locations_match_list \
   1241      1.1  christos 		    "b ${linespec}label2" [list "${source}${tsep}${function}:label2"]
   1242      1.1  christos 	    }
   1243      1.1  christos 	} \
   1244      1.1  christos 	{
   1245      1.1  christos 	    # Explicit locations version.
   1246      1.1  christos 	    append location " -label"
   1247      1.1  christos 	    test_gdb_complete_multiple "b $location " "l" "abel" {
   1248      1.1  christos 		"label1"
   1249      1.1  christos 		"label2"
   1250      1.1  christos 	    }
   1251      1.1  christos 	    check_setting_bp_fails "b $location label"
   1252      1.1  christos 
   1253      1.1  christos 	    if {$source != ""} {
   1254      1.1  christos 		set bp_loc_src "-source ${source} "
   1255      1.1  christos 	    } else {
   1256      1.1  christos 		set bp_loc_src ""
   1257      1.1  christos 	    }
   1258      1.1  christos 	    check_bp_locations_match_list \
   1259      1.1  christos 		"b ${location} label1" [list "${bp_loc_src}-function $function -label label1"]
   1260      1.1  christos 	    check_bp_locations_match_list \
   1261      1.1  christos 		"b ${location} label2" [list "${bp_loc_src}-function $function -label label2"]
   1262      1.1  christos 	}
   1263      1.1  christos }
   1264      1.1  christos 
   1265      1.1  christos # Test that completion after a function name offers keyword
   1266  1.1.1.4  christos # (if/inferior/task/thread/-force-condition) matches in linespec mode,
   1267  1.1.1.4  christos # and also the explicit location options in explicit locations mode.
   1268      1.1  christos 
   1269      1.1  christos proc_with_prefix keywords-after-function {} {
   1270      1.1  christos     set explicit_list \
   1271  1.1.1.3  christos 	[lsort [concat \
   1272  1.1.1.3  christos 		    $completion::explicit_opts_list \
   1273  1.1.1.3  christos 		    $completion::keyword_list]]
   1274      1.1  christos 
   1275      1.1  christos     # Test without a source file, with a known source file, and with
   1276      1.1  christos     # and unknown source file.
   1277      1.1  christos     # Test a known and an unknown function.
   1278      1.1  christos     foreach_location_functions \
   1279      1.1  christos 	{ "" "cpls.cc" "unknown_file.cc" } \
   1280      1.1  christos 	{ "function_with_labels(int)" "unknown_function(int)" } \
   1281      1.1  christos 	{
   1282      1.1  christos 	    # Linespec version.
   1283      1.1  christos 	    test_gdb_complete_multiple "b ${location} " "" "" \
   1284      1.1  christos 		$completion::keyword_list
   1285      1.1  christos 	} \
   1286      1.1  christos 	{
   1287      1.1  christos 	    # Explicit locations version.
   1288      1.1  christos 	    test_gdb_complete_multiple "b ${location} " "" "" \
   1289      1.1  christos 		$explicit_list
   1290      1.1  christos 	}
   1291      1.1  christos }
   1292      1.1  christos 
   1293      1.1  christos # Same, but after a label.
   1294      1.1  christos 
   1295      1.1  christos proc_with_prefix keywords-after-label {} {
   1296      1.1  christos     set explicit_list \
   1297  1.1.1.3  christos 	[lsort [concat \
   1298  1.1.1.3  christos 		    $completion::explicit_opts_list \
   1299  1.1.1.3  christos 		    $completion::keyword_list]]
   1300      1.1  christos 
   1301      1.1  christos     foreach_location_labels \
   1302      1.1  christos 	{ "" "cpls.cc" } \
   1303      1.1  christos 	{ "function_with_labels(int)" "unknown_function(int)" } \
   1304      1.1  christos 	{ "label1" "non_existing_label" } \
   1305      1.1  christos 	{
   1306      1.1  christos 	    # Linespec version.
   1307      1.1  christos 	    test_gdb_complete_multiple "b ${location} " "" "" \
   1308      1.1  christos 		$completion::keyword_list
   1309      1.1  christos 	} \
   1310      1.1  christos 	{
   1311      1.1  christos 	    # Explicit locations version.
   1312      1.1  christos 	    test_gdb_complete_multiple "b ${location} " "" "" \
   1313      1.1  christos 		$explicit_list
   1314      1.1  christos 	}
   1315      1.1  christos }
   1316      1.1  christos 
   1317      1.1  christos # Similar, but after an unknown file, and in linespec mode only.
   1318      1.1  christos 
   1319      1.1  christos proc_with_prefix keywords-after-unknown-file {} {
   1320      1.1  christos     # Test with and without quoting.
   1321      1.1  christos     foreach qc $completion::maybe_quoted_list {
   1322      1.1  christos 	set line "b ${qc}unknown_file.cc${qc}: "
   1323      1.1  christos 	test_gdb_complete_multiple $line "" "" $completion::keyword_list
   1324      1.1  christos     }
   1325      1.1  christos }
   1326      1.1  christos 
   1327      1.1  christos # Test that linespec / function completion does not match data
   1328      1.1  christos # symbols, only functions/methods.
   1329      1.1  christos 
   1330      1.1  christos proc_with_prefix no-data-symbols {} {
   1331      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
   1332      1.1  christos 	test_gdb_complete_unique "$cmd_prefix code_" "$cmd_prefix code_function()"
   1333      1.1  christos     }
   1334      1.1  christos }
   1335      1.1  christos 
   1336      1.1  christos 
   1337      1.1  christos # After "if", we expect an expression, which has a different completer
   1338      1.1  christos # that matches data symbols as well.  Check that that works.
   1339      1.1  christos 
   1340      1.1  christos proc_with_prefix if-expression {} {
   1341      1.1  christos     foreach cmd_prefix {"b" "b -function"} {
   1342      1.1  christos 	test_gdb_complete_multiple "$cmd_prefix function() if " "code_" "" {
   1343      1.1  christos 	    "code_data"
   1344      1.1  christos 	    "code_function()"
   1345      1.1  christos 	}
   1346      1.1  christos 
   1347      1.1  christos 	test_gdb_complete_unique \
   1348      1.1  christos 	    "$cmd_prefix function() if code_data + another_da" \
   1349      1.1  christos 	    "$cmd_prefix function() if code_data + another_data"
   1350      1.1  christos 
   1351      1.1  christos 	test_gdb_complete_unique \
   1352      1.1  christos 	    "$cmd_prefix non_existing_function() if code_data + another_da" \
   1353      1.1  christos 	    "$cmd_prefix non_existing_function() if code_data + another_data"
   1354      1.1  christos 
   1355      1.1  christos 	# FIXME: For now, thread and task also use the expression
   1356      1.1  christos 	# completer.
   1357      1.1  christos 	test_gdb_complete_unique \
   1358      1.1  christos 	    "$cmd_prefix function() thread code_data + another_da" \
   1359      1.1  christos 	    "$cmd_prefix function() thread code_data + another_data"
   1360      1.1  christos 	test_gdb_complete_unique \
   1361      1.1  christos 	    "$cmd_prefix function() task code_data + another_da" \
   1362      1.1  christos 	    "$cmd_prefix function() task code_data + another_data"
   1363      1.1  christos     }
   1364      1.1  christos }
   1365      1.1  christos 
   1366      1.1  christos # The testcase driver.  Calls all test procedures.
   1367      1.1  christos 
   1368      1.1  christos proc test_driver {} {
   1369      1.1  christos     all-param-prefixes
   1370      1.1  christos     overload
   1371      1.1  christos     overload-2
   1372      1.1  christos     fqn
   1373      1.1  christos     fqn-2
   1374      1.1  christos     overload-3
   1375      1.1  christos     template-overload
   1376      1.1  christos     template-ret-type
   1377  1.1.1.3  christos     #test_makefoo
   1378  1.1.1.3  christos     template-function-foo
   1379  1.1.1.3  christos     #test_makem
   1380  1.1.1.3  christos     template-class-with-method
   1381      1.1  christos     const-overload
   1382      1.1  christos     const-overload-quoted
   1383      1.1  christos     append-end-quote-char-when-unambiguous
   1384      1.1  christos     in-source-file-unconstrained
   1385      1.1  christos     in-source-file-unambiguous
   1386      1.1  christos     in-source-file-ambiguous
   1387      1.1  christos     source-complete-appends-colon
   1388      1.1  christos     incomplete-scope-colon
   1389      1.1  christos     anon-ns
   1390      1.1  christos     operator<
   1391      1.1  christos     ambiguous-prefix
   1392      1.1  christos     function-labels
   1393      1.1  christos     keywords-after-function
   1394      1.1  christos     keywords-after-label
   1395      1.1  christos     keywords-after-unknown-file
   1396      1.1  christos     no-data-symbols
   1397      1.1  christos     if-expression
   1398      1.1  christos }
   1399      1.1  christos 
   1400      1.1  christos test_driver
   1401