cpexprs.exp.tcl revision 1.1.1.2 1 1.1 christos # cpexprs.exp - C++ expressions tests
2 1.1 christos #
3 1.1.1.2 christos # Copyright 2008-2023 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 christos if {[skip_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 christos gdb_test_multiple $test $test {
726 1.1 christos -re "( = {.*} 0x\[0-9a-f\]+ <CV::m.*>)\r\n$gdb_prompt $" {
727 1.1 christos # = {void (CV * const, CV::t)} 0x400944 <CV::m(int)>
728 1.1 christos set correct $expect_out(1,string)
729 1.1 christos pass $test
730 1.1 christos }
731 1.1 christos }
732 1.1 christos gdb_test "p CV::m(int)$cv" [string_to_regexp $correct]
733 1.1 christos }
734 1.1 christos
735 1.1 christos # Test TYPENAME:: gets recognized even in parentheses.
736 1.1 christos gdb_test "p CV_f(int)" { = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>}
737 1.1 christos gdb_test "p CV_f(CV::t)" { = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>}
738 1.1 christos gdb_test "p CV_f(CV::i)" " = 43"
739 1.1 christos
740 1.1 christos gdb_test "p CV_f('cpexprs.cc'::CV::t)" \
741 1.1 christos { = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>}
742 1.1 christos
743 1.1 christos # Make sure conversion operator names are canonicalized and properly
744 1.1 christos # "spelled."
745 1.1 christos gdb_test "p base::operator const fluff * const *" \
746 1.1 christos [get "base::operator fluff const* const*" print] \
747 1.1 christos "canonicalized conversion operator name 1"
748 1.1 christos gdb_test "p base::operator const fluff* const*" \
749 1.1 christos [get "base::operator fluff const* const*" print] \
750 1.1 christos "canonicalized conversion operator name 2"
751 1.1 christos gdb_test "p base::operator derived*" \
752 1.1 christos "There is no field named operator derived\\*" \
753 1.1 christos "undefined conversion operator"
754 1.1 christos
755 1.1 christos gdb_exit
756 1.1 christos return 0
757