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