1 1.1 christos # cpexprs.exp - C++ expressions tests 2 1.1 christos # 3 1.1.1.3 christos # Copyright 2008-2024 Free Software Foundation, Inc. 4 1.1 christos # 5 1.1 christos # Contributed by Red Hat, originally written by Keith Seitz. 6 1.1 christos # 7 1.1 christos # This program is free software; you can redistribute it and/or modify 8 1.1 christos # it under the terms of the GNU General Public License as published by 9 1.1 christos # the Free Software Foundation; either version 3 of the License, or 10 1.1 christos # (at your option) any later version. 11 1.1 christos # 12 1.1 christos # This program is distributed in the hope that it will be useful, 13 1.1 christos # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 christos # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 christos # GNU General Public License for more details. 16 1.1 christos # 17 1.1 christos # You should have received a copy of the GNU General Public License 18 1.1 christos # along with this program. If not, see <http://www.gnu.org/licenses/>. 19 1.1 christos 20 1.1 christos # This file is part of the gdb testsuite. 21 1.1 christos 22 1.1 christos # A helper proc which sets a breakpoint at FUNC and attempts to 23 1.1 christos # run to the breakpoint. 24 1.1 christos proc test_breakpoint {func} { 25 1.1 christos global DEC 26 1.1 christos 27 1.1 christos # Return to the top of the test function every time. 28 1.1 christos delete_breakpoints 29 1.1 christos if { ! [gdb_breakpoint test_function] } { 30 1.1 christos fail "set test_function breakpoint for $func" 31 1.1 christos } elseif { [gdb_test "continue" \ 32 1.1 christos "Continuing.\r\n\r\nBreakpoint $DEC+,.*test_function.*" \ 33 1.1.1.2 christos "continue to test_function for $func"] != 0 } { 34 1.1 christos } else { 35 1.1 christos gdb_breakpoint "$func" 36 1.1 christos set i [expr {[string last : $func] + 1}] 37 1.1 christos set efunc [string_to_regexp [string range $func $i end]] 38 1.1 christos gdb_test "continue" \ 39 1.1 christos "Continuing.\r\n\r\nBreakpoint $DEC+,.*$efunc.*" \ 40 1.1 christos "continue to $func" 41 1.1 christos } 42 1.1 christos } 43 1.1 christos 44 1.1 christos # Add a function to the list of tested functions 45 1.1 christos # FUNC is the name of the function (which will be passed to gdb commands) 46 1.1 christos # TYPE is the type of the function, as expected from the "print" command 47 1.1 christos # PRINT is the name of the function, as expected result of the print command 48 1.1 christos # *OR* "-", indicating that FUNC should be used (needed for virtual/inherited 49 1.1 christos # funcs) 50 1.1 christos # LST is either the expected result of the list command (the comment from 51 1.1 christos # the source code) *OR* "-", in which case FUNC will be used 52 1.1 christos # 53 1.1 christos # Usage: 54 1.1 christos # add NAME TYPE PRINT LST 55 1.1 christos # add NAME TYPE PRINT - 56 1.1 christos proc add_type_regexp {func type print lst} { 57 1.1 christos global all_functions CONVAR ADDR 58 1.1 christos 59 1.1 christos set all_functions($func,type) $type 60 1.1 christos if {$print == "-"} { 61 1.1 christos set print $func 62 1.1 christos } 63 1.1 christos 64 1.1 christos # An exception: since gdb canonicalizes C++ output, 65 1.1 christos # "(void)" must be mutated to "()". 66 1.1 christos regsub {\(void\)} $print {()} print 67 1.1 christos 68 1.1 christos set all_functions($func,print) \ 69 1.1 christos "$CONVAR = {$type} $ADDR <[string_to_regexp $print].*>" 70 1.1 christos if {$lst == "-"} { 71 1.1 christos set lst "$func" 72 1.1 christos } 73 1.1 christos set all_functions($func,list) ".*// [string_to_regexp $lst]" 74 1.1 christos } 75 1.1 christos 76 1.1 christos proc add {func type print lst} { 77 1.1 christos add_type_regexp $func [string_to_regexp $type] $print $lst 78 1.1 christos } 79 1.1 christos 80 1.1 christos proc get {func cmd} { 81 1.1 christos global all_functions 82 1.1 christos return $all_functions($func,$cmd) 83 1.1 christos } 84 1.1 christos 85 1.1 christos # Returns a list of function names for a given command 86 1.1 christos proc get_functions {cmd} { 87 1.1 christos global all_functions 88 1.1 christos set result {} 89 1.1 christos foreach i [array names all_functions *,$cmd] { 90 1.1 christos if {$all_functions($i) != ""} { 91 1.1 christos set idx [string last , $i] 92 1.1 christos if {$idx != -1} { 93 1.1 christos lappend result [string range $i 0 [expr {$idx - 1}]] 94 1.1 christos } 95 1.1 christos } 96 1.1 christos } 97 1.1 christos 98 1.1 christos return [lsort $result] 99 1.1 christos } 100 1.1 christos 101 1.1 christos # Some convenience variables for this test 102 1.1 christos set DEC {[0-9]}; # a decimal number 103 1.1 christos set HEX {[0-9a-fA-F]}; # a hexidecimal number 104 1.1 christos set CONVAR "\\\$$DEC+"; # convenience variable regexp 105 1.1 christos set ADDR "0x$HEX+"; # address 106 1.1 christos 107 1.1 christos # An array of functions/methods that we are testing... 108 1.1 christos # Each element consists is indexed by NAME,COMMAND, where 109 1.1 christos # NAME is the function name and COMMAND is the gdb command that 110 1.1 christos # we are testing. The value of the array for any index pair is 111 1.1 christos # the expected result of running COMMAND with the NAME as argument. 112 1.1 christos 113 1.1 christos # The array holding all functions/methods to test. Valid subindexes 114 1.1 christos # are (none need character escaping -- "add" will take care of that): 115 1.1 christos 116 1.1 christos # add name type print_name list 117 1.1 christos # NAME,type: value is type of function 118 1.1 christos # NAME,print: value is print name of function (careful w/inherited/virtual!) 119 1.1 christos # NAME,list: value is comment in source code on first line of function 120 1.1 christos # (without the leading "//") 121 1.1 christos array set all_functions {} 122 1.1 christos 123 1.1 christos # "Normal" functions/methods 124 1.1 christos add {test_function} \ 125 1.1 christos {int (int, char **)} \ 126 1.1 christos - \ 127 1.1 christos - 128 1.1 christos add {derived::a_function} \ 129 1.1 christos {void (const derived * const)} \ 130 1.1 christos - \ 131 1.1 christos - 132 1.1 christos add {base1::a_function} \ 133 1.1 christos {void (const base1 * const)} \ 134 1.1 christos - \ 135 1.1 christos - 136 1.1 christos add {base2::a_function} \ 137 1.1 christos {void (const base2 * const)} \ 138 1.1 christos - \ 139 1.1 christos - 140 1.1 christos 141 1.1 christos # Constructors 142 1.1 christos 143 1.1 christos # On targets using the ARM EABI, the constructor is expected to return 144 1.1 christos # "this". 145 1.1 christos proc ctor_ret { type } { 146 1.1 christos if { [istarget arm*-*eabi*] || [is_aarch32_target] } { 147 1.1 christos return "$type *" 148 1.1 christos } else { 149 1.1 christos return "void " 150 1.1 christos } 151 1.1 christos } 152 1.1 christos 153 1.1 christos proc ctor_prefix { type } { 154 1.1 christos set ret [ctor_ret $type] 155 1.1 christos return "${ret}($type * const" 156 1.1 christos } 157 1.1 christos 158 1.1 christos proc ctor { type arglist } { 159 1.1 christos if { $arglist != "" } { 160 1.1 christos set arglist ", $arglist" 161 1.1 christos } 162 1.1 christos return "[ctor_prefix $type]$arglist)" 163 1.1 christos } 164 1.1 christos 165 1.1 christos add {derived::derived} \ 166 1.1 christos [ctor derived ""] \ 167 1.1 christos - \ 168 1.1 christos - 169 1.1 christos add_type_regexp {base1::base1(void)} \ 170 1.1 christos "[string_to_regexp [ctor_prefix base1]], (const )?void \\*\\*( const)?\\)" \ 171 1.1 christos - \ 172 1.1 christos - 173 1.1 christos add {base1::base1(int)} \ 174 1.1 christos [ctor base1 "int"] \ 175 1.1 christos - \ 176 1.1 christos - 177 1.1 christos add_type_regexp {base2::base2} \ 178 1.1 christos "[string_to_regexp [ctor_prefix base2]], (const )?void \\*\\*( const)?\\)" \ 179 1.1 christos - \ 180 1.1 christos - 181 1.1 christos add {base::base(void)} \ 182 1.1 christos [ctor base ""] \ 183 1.1 christos - \ 184 1.1 christos - 185 1.1 christos add {base::base(int)} \ 186 1.1 christos [ctor base "int"] \ 187 1.1 christos - \ 188 1.1 christos - 189 1.1 christos 190 1.1 christos # Destructors 191 1.1 christos 192 1.1 christos # On targets using the ARM EABI, some destructors are expected 193 1.1 christos # to return "this". Others are void. For internal reasons, 194 1.1 christos # GCC returns void * instead of $type *; RealView appears to do 195 1.1 christos # the same. 196 1.1 christos proc dtor { type } { 197 1.1 christos if { [istarget arm*-*eabi*] || [is_aarch32_target] } { 198 1.1 christos set ret "void *" 199 1.1 christos } else { 200 1.1 christos set ret "void " 201 1.1 christos } 202 1.1 christos return "${ret}($type * const)" 203 1.1 christos } 204 1.1 christos 205 1.1 christos add {base::~base} \ 206 1.1 christos [dtor base] \ 207 1.1 christos - \ 208 1.1 christos - 209 1.1 christos 210 1.1 christos # Overloaded methods (all are const) 211 1.1 christos add {base::overload(void) const} \ 212 1.1 christos {int (const base * const)} \ 213 1.1 christos - \ 214 1.1 christos {base::overload(void) const} 215 1.1 christos add {base::overload(int) const} \ 216 1.1 christos {int (const base * const, int)} \ 217 1.1 christos - \ 218 1.1 christos - 219 1.1 christos add {base::overload(short) const} \ 220 1.1 christos {int (const base * const, short)} \ 221 1.1 christos - \ 222 1.1 christos - 223 1.1 christos add {base::overload(long) const} \ 224 1.1 christos {int (const base * const, long)} \ 225 1.1 christos - \ 226 1.1 christos - 227 1.1 christos add {base::overload(char*) const} \ 228 1.1 christos {int (const base * const, char *)} \ 229 1.1 christos - \ 230 1.1 christos - 231 1.1 christos add {base::overload(base&) const} \ 232 1.1 christos {int (const base * const, base &)} \ 233 1.1 christos - \ 234 1.1 christos - 235 1.1 christos 236 1.1 christos # Operators 237 1.1 christos add {base::operator+} \ 238 1.1 christos {int (const base * const, const base &)} \ 239 1.1 christos - \ 240 1.1 christos - 241 1.1 christos add {base::operator++} \ 242 1.1 christos {base (base * const)} \ 243 1.1 christos - \ 244 1.1 christos - 245 1.1 christos add {base::operator+=} \ 246 1.1 christos {base (base * const, const base &)} \ 247 1.1 christos - \ 248 1.1 christos - 249 1.1 christos add {base::operator-} \ 250 1.1 christos {int (const base * const, const base &)} \ 251 1.1 christos - \ 252 1.1 christos - 253 1.1 christos add {base::operator--} \ 254 1.1 christos {base (base * const)} \ 255 1.1 christos - \ 256 1.1 christos - 257 1.1 christos add {base::operator-=} \ 258 1.1 christos {base (base * const, const base &)} \ 259 1.1 christos - \ 260 1.1 christos - 261 1.1 christos add {base::operator*} \ 262 1.1 christos {int (const base * const, const base &)} \ 263 1.1 christos - \ 264 1.1 christos - 265 1.1 christos add {base::operator*=} \ 266 1.1 christos {base (base * const, const base &)} \ 267 1.1 christos - \ 268 1.1 christos - 269 1.1 christos add {base::operator/} \ 270 1.1 christos {int (const base * const, const base &)} \ 271 1.1 christos - \ 272 1.1 christos - 273 1.1 christos add {base::operator/=} \ 274 1.1 christos {base (base * const, const base &)} \ 275 1.1 christos - \ 276 1.1 christos - 277 1.1 christos add {base::operator%} \ 278 1.1 christos {int (const base * const, const base &)} \ 279 1.1 christos - \ 280 1.1 christos - 281 1.1 christos add {base::operator%=} \ 282 1.1 christos {base (base * const, const base &)} \ 283 1.1 christos - \ 284 1.1 christos - 285 1.1 christos add {base::operator<} \ 286 1.1 christos {bool (const base * const, const base &)} \ 287 1.1 christos - \ 288 1.1 christos - 289 1.1 christos add {base::operator<=} \ 290 1.1 christos {bool (const base * const, const base &)} \ 291 1.1 christos - \ 292 1.1 christos - 293 1.1 christos add {base::operator>} \ 294 1.1 christos {bool (const base * const, const base &)} \ 295 1.1 christos - \ 296 1.1 christos - 297 1.1 christos add {base::operator>=} \ 298 1.1 christos {bool (const base * const, const base &)} \ 299 1.1 christos - \ 300 1.1 christos - 301 1.1 christos add {base::operator!=} \ 302 1.1 christos {bool (const base * const, const base &)} \ 303 1.1 christos - \ 304 1.1 christos - 305 1.1 christos add {base::operator==} \ 306 1.1 christos {bool (const base * const, const base &)} \ 307 1.1 christos - \ 308 1.1 christos - 309 1.1 christos add {base::operator!} \ 310 1.1 christos {bool (const base * const)} \ 311 1.1 christos - \ 312 1.1 christos - 313 1.1 christos add {base::operator&&} \ 314 1.1 christos {bool (const base * const, const base &)} \ 315 1.1 christos - \ 316 1.1 christos - 317 1.1 christos add {base::operator||} \ 318 1.1 christos {bool (const base * const, const base &)} \ 319 1.1 christos - \ 320 1.1 christos - 321 1.1 christos add {base::operator<<} \ 322 1.1 christos {int (const base * const, int)} \ 323 1.1 christos - \ 324 1.1 christos - 325 1.1 christos add {base::operator<<=} \ 326 1.1 christos {base (base * const, int)} \ 327 1.1 christos - \ 328 1.1 christos - 329 1.1 christos add {base::operator>>} \ 330 1.1 christos {int (const base * const, int)} \ 331 1.1 christos - \ 332 1.1 christos - 333 1.1 christos add {base::operator>>=} \ 334 1.1 christos {base (base * const, int)} \ 335 1.1 christos - \ 336 1.1 christos - 337 1.1 christos add {base::operator~} \ 338 1.1 christos {int (const base * const)} \ 339 1.1 christos - \ 340 1.1 christos - 341 1.1 christos add {base::operator&} \ 342 1.1 christos {int (const base * const, const base &)} \ 343 1.1 christos - \ 344 1.1 christos - 345 1.1 christos add {base::operator&=} \ 346 1.1 christos {base (base * const, const base &)} \ 347 1.1 christos - \ 348 1.1 christos - 349 1.1 christos add {base::operator|} \ 350 1.1 christos {int (const base * const, const base &)} \ 351 1.1 christos - \ 352 1.1 christos - 353 1.1 christos add {base::operator|=} \ 354 1.1 christos {base (base * const, const base &)} \ 355 1.1 christos - \ 356 1.1 christos - 357 1.1 christos add {base::operator^} \ 358 1.1 christos {int (const base * const, const base &)} \ 359 1.1 christos - \ 360 1.1 christos - 361 1.1 christos add {base::operator^=} \ 362 1.1 christos {base (base * const, const base &)} \ 363 1.1 christos - \ 364 1.1 christos - 365 1.1 christos add {base::operator=} \ 366 1.1 christos {base (base * const, const base &)} \ 367 1.1 christos - \ 368 1.1 christos - 369 1.1 christos add {base::operator()} \ 370 1.1 christos {void (const base * const)} \ 371 1.1 christos - \ 372 1.1 christos - 373 1.1 christos add {base::operator[]} \ 374 1.1 christos {int (const base * const, int)} \ 375 1.1 christos - \ 376 1.1 christos - 377 1.1 christos add {base::operator new} \ 378 1.1 christos {void *(size_t)} \ 379 1.1 christos - \ 380 1.1 christos - 381 1.1 christos add {base::operator delete} \ 382 1.1 christos {void (void *)} \ 383 1.1 christos - \ 384 1.1 christos - 385 1.1 christos add {base::operator new[]} \ 386 1.1 christos {void *(size_t)} \ 387 1.1 christos - \ 388 1.1 christos - 389 1.1 christos add {base::operator delete[]} \ 390 1.1 christos {void (void *)} \ 391 1.1 christos - \ 392 1.1 christos - 393 1.1 christos add {base::operator char*} \ 394 1.1 christos {char *(const base * const)} \ 395 1.1 christos - \ 396 1.1 christos - 397 1.1 christos add {base::operator fluff*} \ 398 1.1 christos {fluff *(const base * const)} \ 399 1.1 christos - \ 400 1.1 christos - 401 1.1 christos add {base::operator fluff**} \ 402 1.1 christos {fluff **(const base * const)} \ 403 1.1 christos - \ 404 1.1 christos - 405 1.1 christos add {base::operator int} \ 406 1.1 christos {int (const base * const)} \ 407 1.1 christos - \ 408 1.1 christos - 409 1.1 christos add {base::operator fluff const* const*} \ 410 1.1 christos {const fluff * const *(const base * const)} \ 411 1.1 christos - \ 412 1.1 christos - 413 1.1 christos 414 1.1 christos # Templates 415 1.1 christos add {tclass<char>::do_something} \ 416 1.1 christos {void (tclass<char> * const)} \ 417 1.1 christos - \ 418 1.1 christos - 419 1.1 christos add {tclass<int>::do_something} \ 420 1.1 christos {void (tclass<int> * const)} \ 421 1.1 christos - \ 422 1.1 christos - 423 1.1 christos add {tclass<long>::do_something} \ 424 1.1 christos {void (tclass<long> * const)} \ 425 1.1 christos - \ 426 1.1 christos - 427 1.1 christos add {tclass<short>::do_something} \ 428 1.1 christos {void (tclass<short> * const)} \ 429 1.1 christos - \ 430 1.1 christos - 431 1.1 christos add {tclass<base>::do_something} \ 432 1.1 christos {void (tclass<base> * const)} \ 433 1.1 christos - \ 434 1.1 christos - 435 1.1 christos add {flubber<int, int, int, int, int>} \ 436 1.1 christos {void (void)} \ 437 1.1 christos - \ 438 1.1 christos flubber 439 1.1 christos add {flubber<int, int, int, int, short>} \ 440 1.1 christos {void (void)} \ 441 1.1 christos - \ 442 1.1 christos flubber 443 1.1 christos add {flubber<int, int, int, int, long>} \ 444 1.1 christos {void (void)} \ 445 1.1 christos - \ 446 1.1 christos flubber 447 1.1 christos add {flubber<int, int, int, int, char>} \ 448 1.1 christos {void (void)} \ 449 1.1 christos - \ 450 1.1 christos flubber 451 1.1 christos add {flubber<int, int, int, short, int>} \ 452 1.1 christos {void (void)} \ 453 1.1 christos - \ 454 1.1 christos flubber 455 1.1 christos add {flubber<int, int, int, short, short>} \ 456 1.1 christos {void (void)} \ 457 1.1 christos - \ 458 1.1 christos flubber 459 1.1 christos add {flubber<int, int, int, short, long>} \ 460 1.1 christos {void (void)} \ 461 1.1 christos - \ 462 1.1 christos flubber 463 1.1 christos add {flubber<int, int, int, short, char>} \ 464 1.1 christos {void (void)} \ 465 1.1 christos - \ 466 1.1 christos flubber 467 1.1 christos add {flubber<int, int, int, long, int>} \ 468 1.1 christos {void (void)} \ 469 1.1 christos - \ 470 1.1 christos flubber 471 1.1 christos add {flubber<int, int, int, long, short>} \ 472 1.1 christos {void (void)} \ 473 1.1 christos - \ 474 1.1 christos flubber 475 1.1 christos add {flubber<int, int, int, long, long>} \ 476 1.1 christos {void (void)} \ 477 1.1 christos - \ 478 1.1 christos flubber 479 1.1 christos add {flubber<int, int, int, long, char>} \ 480 1.1 christos {void (void)} \ 481 1.1 christos - \ 482 1.1 christos flubber 483 1.1 christos add {flubber<int, int, int, char, int>} \ 484 1.1 christos {void (void)} \ 485 1.1 christos - \ 486 1.1 christos flubber 487 1.1 christos add {flubber<int, int, int, char, short>} \ 488 1.1 christos {void (void)} \ 489 1.1 christos - \ 490 1.1 christos flubber 491 1.1 christos add {flubber<int, int, int, char, long>} \ 492 1.1 christos {void (void)} \ 493 1.1 christos - \ 494 1.1 christos flubber 495 1.1 christos add {flubber<int, int, int, char, char>} \ 496 1.1 christos {void (void)} \ 497 1.1 christos - \ 498 1.1 christos flubber 499 1.1 christos add {flubber<int, int, short, int, int>} \ 500 1.1 christos {void (void)} \ 501 1.1 christos - \ 502 1.1 christos flubber 503 1.1 christos add {flubber<int, int, short, int, short>} \ 504 1.1 christos {void (void)} \ 505 1.1 christos - \ 506 1.1 christos flubber 507 1.1 christos add {flubber<int, int, short, int, long>} \ 508 1.1 christos {void (void)} \ 509 1.1 christos - \ 510 1.1 christos flubber 511 1.1 christos add {flubber<int, int, short, int, char>} \ 512 1.1 christos {void (void)} \ 513 1.1 christos - \ 514 1.1 christos flubber 515 1.1 christos add {flubber<int, int, short, short, int>} \ 516 1.1 christos {void (void)} \ 517 1.1 christos - \ 518 1.1 christos flubber 519 1.1 christos add {flubber<short, int, short, int, short>} \ 520 1.1 christos {void (void)} \ 521 1.1 christos - \ 522 1.1 christos flubber 523 1.1 christos add {flubber<long, short, long, short, long>} \ 524 1.1 christos {void (void)} \ 525 1.1 christos - \ 526 1.1 christos flubber 527 1.1 christos add {tclass<base>::do_something} \ 528 1.1 christos {void (tclass<base> * const)} \ 529 1.1 christos - \ 530 1.1 christos {tclass<T>::do_something} 531 1.1 christos add {policy1::policy} \ 532 1.1 christos [ctor "policy<int, operation_1<void*> >" "int"] \ 533 1.1 christos {policy<int, operation_1<void*> >::policy} \ 534 1.1 christos {policy<T, Policy>::policy} 535 1.1 christos add {policy2::policy} \ 536 1.1 christos [ctor "policy<int, operation_2<void*> >" int] \ 537 1.1 christos {policy<int, operation_2<void*> >::policy} \ 538 1.1 christos {policy<T, Policy>::policy} 539 1.1 christos add {policy3::policy} \ 540 1.1 christos [ctor "policy<int, operation_3<void*> >" "int"] \ 541 1.1 christos {policy<int, operation_3<void*> >::policy} \ 542 1.1 christos {policy<T, Policy>::policy} 543 1.1 christos add {policy4::policy} \ 544 1.1 christos [ctor "policy<int, operation_4<void*> >" "int"] \ 545 1.1 christos {policy<int, operation_4<void*> >::policy} \ 546 1.1 christos {policy<T, Policy>::policy} 547 1.1 christos add {policy1::function} \ 548 1.1 christos {void (void)} \ 549 1.1 christos {operation_1<void*>::function} \ 550 1.1 christos {operation_1<T>::function} 551 1.1 christos add {policy2::function} \ 552 1.1 christos {void (void)} \ 553 1.1 christos {operation_2<void*>::function} \ 554 1.1 christos {operation_2<T>::function} 555 1.1 christos add {policy3::function} \ 556 1.1 christos {void (void)} \ 557 1.1 christos {operation_3<void*>::function} \ 558 1.1 christos {operation_3<T>::function} 559 1.1 christos add {policy4::function} \ 560 1.1 christos {void (void)} \ 561 1.1 christos {operation_4<void*>::function} \ 562 1.1 christos {operation_4<T>::function} 563 1.1 christos add {policyd<int, operation_1<int> >::policyd} \ 564 1.1 christos [ctor "policyd<int, operation_1<int> >" "int"] \ 565 1.1 christos - \ 566 1.1 christos {policyd<T, Policy>::policyd} 567 1.1 christos add {policyd1::policyd} \ 568 1.1 christos [ctor "policyd<int, operation_1<int> >" "int"] \ 569 1.1 christos {policyd<int, operation_1<int> >::policyd} \ 570 1.1 christos {policyd<T, Policy>::policyd} 571 1.1 christos add {policyd<int, operation_1<int> >::~policyd} \ 572 1.1 christos [dtor "policyd<int, operation_1<int> >"] \ 573 1.1 christos - \ 574 1.1 christos {policyd<T, Policy>::~policyd} 575 1.1 christos add {policyd1::~policyd} \ 576 1.1 christos [dtor "policyd<int, operation_1<int> >"] \ 577 1.1 christos {policyd<int, operation_1<int> >::~policyd} \ 578 1.1 christos {policyd<T, Policy>::~policyd} 579 1.1 christos add {policyd<long, operation_1<long> >::policyd} \ 580 1.1 christos [ctor "policyd<long, operation_1<long> >" "long"] \ 581 1.1 christos - \ 582 1.1 christos {policyd<T, Policy>::policyd} 583 1.1 christos add {policyd2::policyd} \ 584 1.1 christos [ctor "policyd<long, operation_1<long> >" "long"] \ 585 1.1 christos {policyd<long, operation_1<long> >::policyd} \ 586 1.1 christos {policyd<T, Policy>::policyd} 587 1.1 christos add {policyd<long, operation_1<long> >::~policyd} \ 588 1.1 christos [dtor "policyd<long, operation_1<long> >"] \ 589 1.1 christos - \ 590 1.1 christos {policyd<T, Policy>::~policyd} 591 1.1 christos add {policyd2::~policyd} \ 592 1.1 christos [dtor "policyd<long, operation_1<long> >"] \ 593 1.1 christos {policyd<long, operation_1<long> >::~policyd} \ 594 1.1 christos {policyd<T, Policy>::~policyd} 595 1.1 christos add {policyd<char, operation_1<char> >::policyd} \ 596 1.1 christos [ctor "policyd<char, operation_1<char> >" "char"] \ 597 1.1 christos - \ 598 1.1 christos {policyd<T, Policy>::policyd} 599 1.1 christos add {policyd3::policyd} \ 600 1.1 christos [ctor "policyd<char, operation_1<char> >" "char"] \ 601 1.1 christos {policyd<char, operation_1<char> >::policyd} \ 602 1.1 christos {policyd<T, Policy>::policyd} 603 1.1 christos add {policyd<char, operation_1<char> >::~policyd} \ 604 1.1 christos [dtor "policyd<char, operation_1<char> >"] \ 605 1.1 christos - \ 606 1.1 christos {policyd<T, Policy>::~policyd} 607 1.1 christos add {policyd3::~policyd} \ 608 1.1 christos [dtor "policyd<char, operation_1<char> >"] \ 609 1.1 christos {policyd<char, operation_1<char> >::~policyd} \ 610 1.1 christos {policyd<T, Policy>::~policyd} 611 1.1 christos add {policyd<base, operation_1<base> >::policyd} \ 612 1.1 christos [ctor "policyd<base, operation_1<base> >" "base"] \ 613 1.1 christos - \ 614 1.1 christos {policyd<T, Policy>::policyd} 615 1.1 christos add {policyd4::policyd} \ 616 1.1 christos [ctor "policyd<base, operation_1<base> >" "base"] \ 617 1.1 christos {policyd<base, operation_1<base> >::policyd} \ 618 1.1 christos {policyd<T, Policy>::policyd} 619 1.1 christos add {policyd<base, operation_1<base> >::~policyd} \ 620 1.1 christos [dtor "policyd<base, operation_1<base> >"] \ 621 1.1 christos - \ 622 1.1 christos {policyd<T, Policy>::~policyd} 623 1.1 christos add {policyd4::~policyd} \ 624 1.1 christos [dtor "policyd<base, operation_1<base> >"] \ 625 1.1 christos {policyd<base, operation_1<base> >::~policyd} \ 626 1.1 christos {policyd<T, Policy>::~policyd} 627 1.1 christos add {policyd<tclass<int>, operation_1<tclass<int> > >::policyd} \ 628 1.1 christos [ctor "policyd<tclass<int>, operation_1<tclass<int> > >" "tclass<int>"] \ 629 1.1 christos - \ 630 1.1 christos {policyd<T, Policy>::policyd} 631 1.1 christos add {policyd5::policyd} \ 632 1.1 christos [ctor "policyd<tclass<int>, operation_1<tclass<int> > >" "tclass<int>"] \ 633 1.1 christos {policyd<tclass<int>, operation_1<tclass<int> > >::policyd} \ 634 1.1 christos {policyd<T, Policy>::policyd} 635 1.1 christos add {policyd<tclass<int>, operation_1<tclass<int> > >::~policyd} \ 636 1.1 christos [dtor "policyd<tclass<int>, operation_1<tclass<int> > >"] \ 637 1.1 christos - \ 638 1.1 christos {policyd<T, Policy>::~policyd} 639 1.1 christos add {policyd5::~policyd} \ 640 1.1 christos [dtor "policyd<tclass<int>, operation_1<tclass<int> > >"] \ 641 1.1 christos {policyd<tclass<int>, operation_1<tclass<int> > >::~policyd} \ 642 1.1 christos {policyd<T, Policy>::~policyd} 643 1.1 christos add {policyd<int, operation_1<int> >::function} \ 644 1.1 christos {void (void)} \ 645 1.1 christos {operation_1<int>::function}\ 646 1.1 christos {operation_1<T>::function} 647 1.1 christos add {policyd1::function} \ 648 1.1 christos {void (void)} \ 649 1.1 christos {operation_1<int>::function} \ 650 1.1 christos {operation_1<T>::function} 651 1.1 christos add {policyd2::function} \ 652 1.1 christos {void (void)} \ 653 1.1 christos {operation_1<long>::function} \ 654 1.1 christos {operation_1<T>::function} 655 1.1 christos add {policyd<char, operation_1<char> >::function} \ 656 1.1 christos {void (void)} \ 657 1.1 christos {operation_1<char>::function} \ 658 1.1 christos {operation_1<T>::function} 659 1.1 christos add {policyd3::function} \ 660 1.1 christos {void (void)} \ 661 1.1 christos {operation_1<char>::function} \ 662 1.1 christos {operation_1<T>::function} 663 1.1 christos add {policyd<base, operation_1<base> >::function} \ 664 1.1 christos {void (void)} \ 665 1.1 christos {operation_1<base>::function} \ 666 1.1 christos {operation_1<T>::function} 667 1.1 christos add {policyd4::function} \ 668 1.1 christos {void (void)} \ 669 1.1 christos {operation_1<base>::function} \ 670 1.1 christos {operation_1<T>::function} 671 1.1 christos add {policyd<tclass<int>, operation_1<tclass<int> > >::function} \ 672 1.1 christos {void (void)} \ 673 1.1 christos {operation_1<tclass<int> >::function} \ 674 1.1 christos {operation_1<T>::function} 675 1.1 christos add {policyd5::function} \ 676 1.1 christos {void (void)} \ 677 1.1 christos {operation_1<tclass<int> >::function} \ 678 1.1 christos {operation_1<T>::function} 679 1.1 christos 680 1.1 christos # Start the test 681 1.1.1.3 christos if {![allow_cplus_tests]} { continue } 682 1.1 christos 683 1.1 christos # 684 1.1 christos # test running programs 685 1.1 christos # 686 1.1 christos 687 1.1 christos standard_testfile cpexprs.cc 688 1.1 christos 689 1.1 christos # Include required flags. 690 1.1 christos set flags "$flags debug c++" 691 1.1 christos 692 1.1 christos if {[prepare_for_testing "failed to prepare" $testfile $srcfile "$flags"]} { 693 1.1 christos return -1 694 1.1 christos } 695 1.1 christos 696 1.1 christos if {![runto_main]} { 697 1.1 christos perror "couldn't run to breakpoint" 698 1.1 christos continue 699 1.1 christos } 700 1.1 christos 701 1.1 christos # Set the listsize to one. This will help with testing "list". 702 1.1 christos gdb_test "set listsize 1" 703 1.1 christos 704 1.1 christos # "print METHOD" 705 1.1 christos foreach name [get_functions print] { 706 1.1 christos gdb_test "print $name" [get $name print] 707 1.1 christos } 708 1.1 christos 709 1.1 christos # "list METHOD" 710 1.1 christos foreach name [get_functions list] { 711 1.1 christos gdb_test "list $name" [get $name list] 712 1.1 christos } 713 1.1 christos 714 1.1 christos # Running to breakpoint -- use any function we can "list" 715 1.1 christos foreach name [get_functions list] { 716 1.1 christos # Skip "test_function", since test_breakpoint uses it 717 1.1 christos if {[string compare $name "test_function"] != 0} { 718 1.1 christos test_breakpoint $name 719 1.1 christos } 720 1.1 christos } 721 1.1 christos 722 1.1 christos # Test c/v gets recognized even without quoting. 723 1.1 christos foreach cv {{} { const} { volatile} { const volatile}} { 724 1.1 christos set test "p 'CV::m(int)$cv'" 725 1.1.1.3 christos set correct dummy_value 726 1.1.1.3 christos 727 1.1 christos gdb_test_multiple $test $test { 728 1.1 christos -re "( = {.*} 0x\[0-9a-f\]+ <CV::m.*>)\r\n$gdb_prompt $" { 729 1.1 christos # = {void (CV * const, CV::t)} 0x400944 <CV::m(int)> 730 1.1 christos set correct $expect_out(1,string) 731 1.1 christos pass $test 732 1.1 christos } 733 1.1 christos } 734 1.1 christos gdb_test "p CV::m(int)$cv" [string_to_regexp $correct] 735 1.1 christos } 736 1.1 christos 737 1.1 christos # Test TYPENAME:: gets recognized even in parentheses. 738 1.1 christos gdb_test "p CV_f(int)" { = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>} 739 1.1 christos gdb_test "p CV_f(CV::t)" { = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>} 740 1.1 christos gdb_test "p CV_f(CV::i)" " = 43" 741 1.1 christos 742 1.1 christos gdb_test "p CV_f('cpexprs.cc'::CV::t)" \ 743 1.1 christos { = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>} 744 1.1 christos 745 1.1 christos # Make sure conversion operator names are canonicalized and properly 746 1.1 christos # "spelled." 747 1.1 christos gdb_test "p base::operator const fluff * const *" \ 748 1.1 christos [get "base::operator fluff const* const*" print] \ 749 1.1 christos "canonicalized conversion operator name 1" 750 1.1 christos gdb_test "p base::operator const fluff* const*" \ 751 1.1 christos [get "base::operator fluff const* const*" print] \ 752 1.1 christos "canonicalized conversion operator name 2" 753 1.1 christos gdb_test "p base::operator derived*" \ 754 1.1 christos "There is no field named operator derived\\*" \ 755 1.1 christos "undefined conversion operator" 756 1.1 christos 757 1.1 christos gdb_exit 758 1.1 christos return 0 759