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