1 # cpexprs.exp
- C
++ expressions tests
3 # Copyright
2008-2015 Free Software Foundation
, Inc.
5 # Contributed by Red Hat
, originally written by Keith Seitz.
7 # This
program is free software
; you can redistribute it and
/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation
; either version
3 of the License
, or
10 #
(at your option
) any later version.
12 # This
program is distributed in the hope that it will be useful
,
13 # but WITHOUT
ANY WARRANTY
; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License
for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with this
program.
If not
, see
<http
://www.gnu.org
/licenses
/>.
20 # This file is part of the gdb testsuite.
22 # A helper proc which sets a breakpoint at FUNC and attempts to
23 # run to the breakpoint.
24 proc test_breakpoint
{func
} {
27 #
Return to the top of the test function
every time.
29 if { ! [gdb_breakpoint test_function
] } {
30 fail
"set test_function breakpoint for $func"
31 } elseif
{ [gdb_test
"continue" \
32 "Continuing.\r\n\r\nBreakpoint $DEC+,.*test_function.*" \
34 fail
"continue to test_function for $func"
36 gdb_breakpoint
"$func"
37 set i
[expr
{[string last
: $func
] + 1}]
38 set efunc
[string_to_regexp
[string range $func $i end
]]
40 "Continuing.\r\n\r\nBreakpoint $DEC+,.*$efunc.*" \
45 # Add a function to the list of tested functions
46 # FUNC is the
name of the function
(which will be passed to gdb commands
)
47 # TYPE is the type of the function
, as expected from the
"print" command
48 # PRINT is the
name of the function
, as expected result of the print command
49 #
*OR
* "-", indicating that FUNC should be used (needed for virtual/inherited
51 # LST is either the expected result of the list command
(the comment from
52 # the source code
) *OR
* "-", in which case FUNC will be used
55 # add
NAME TYPE PRINT LST
56 # add
NAME TYPE PRINT
-
57 proc add_type_regexp
{func type print lst
} {
58 global all_functions CONVAR ADDR
60 set all_functions
($func
,type
) $type
65 # An exception
: since gdb canonicalizes C
++ output
,
66 #
"(void)" must be mutated to "()".
67 regsub
{\
(void\
)} $print
{()} print
69 set all_functions
($func
,print
) \
70 "$CONVAR = {$type} $ADDR <[string_to_regexp $print].*>"
74 set all_functions
($func
,list
) ".*// [string_to_regexp $lst]"
77 proc add
{func type print lst
} {
78 add_type_regexp $func
[string_to_regexp $type
] $print $lst
83 return $all_functions
($func
,$cmd
)
86 # Returns a list of function names
for a given command
87 proc get_functions
{cmd
} {
90 foreach i
[array names all_functions
*,$cmd
] {
91 if {$all_functions
($i
) != ""} {
92 set idx
[string last
, $i
]
94 lappend result
[string range $i
0 [expr
{$idx
- 1}]]
99 return [lsort $result
]
102 # Some convenience variables
for this test
103 set DEC
{[0-9]}; # a decimal number
104 set HEX
{[0-9a
-fA
-F
]}; # a hexidecimal number
105 set CONVAR
"\\\$$DEC+"; # convenience variable regexp
106 set ADDR
"0x$HEX+"; # address
108 # An array of functions
/methods that we are testing...
109 # Each element consists is indexed by
NAME,COMMAND
, where
110 #
NAME is the function
name and COMMAND is the gdb command that
111 # we are testing. The value of the array
for any index pair is
112 # the expected result of running COMMAND with the
NAME as
argument.
114 # The array holding all functions
/methods to test. Valid subindexes
115 # are
(none need character escaping
-- "add" will take care of that):
117 # add
name type print_name list
118 #
NAME,type
: value is type of function
119 #
NAME,print
: value is print
name of function
(careful w
/inherited
/virtual
!)
120 #
NAME,list
: value is comment in source code
on first line of function
121 #
(without the leading
"//")
122 array
set all_functions
{}
124 #
"Normal" functions/methods
125 add
{test_function
} \
126 {int (int, char
**)} \
129 add
{derived
::a_function
} \
130 {void
(const derived
* const
)} \
133 add
{base1
::a_function
} \
134 {void
(const base1
* const
)} \
137 add
{base2
::a_function
} \
138 {void
(const base2
* const
)} \
144 #
On targets using the ARM EABI
, the constructor is expected to
return
146 proc ctor_ret
{ type
} {
147 if { [istarget arm
*-*eabi
*] } {
154 proc ctor_prefix
{ type
} {
155 set ret
[ctor_ret $type
]
156 return "${ret}($type * const"
159 proc ctor
{ type arglist
} {
160 if { $arglist
!= "" } {
161 set arglist
", $arglist"
163 return "[ctor_prefix $type]$arglist)"
166 add
{derived
::derived
} \
170 add_type_regexp
{base1
::base1
(void
)} \
171 "[string_to_regexp [ctor_prefix base1]], (const )?void \\*\\*( const)?\\)" \
174 add
{base1
::base1
(int)} \
178 add_type_regexp
{base2
::base2
} \
179 "[string_to_regexp [ctor_prefix base2]], (const )?void \\*\\*( const)?\\)" \
182 add
{base
::base
(void
)} \
186 add
{base
::base
(int)} \
193 #
On targets using the ARM EABI
, some destructors are expected
194 # to
return "this". Others are void. For internal reasons,
195 # GCC returns void
* instead of $type
*; RealView appears to
do
198 if { [istarget arm
*-*eabi
*] } {
203 return "${ret}($type * const)"
211 # Overloaded methods
(all are const
)
212 add
{base
::overload
(void
) const
} \
213 {int (const base
* const
)} \
215 {base
::overload
(void
) const
}
216 add
{base
::overload
(int) const
} \
217 {int (const base
* const
, int)} \
220 add
{base
::overload
(short
) const
} \
221 {int (const base
* const
, short
)} \
224 add
{base
::overload
(long
) const
} \
225 {int (const base
* const
, long
)} \
228 add
{base
::overload
(char
*) const
} \
229 {int (const base
* const
, char
*)} \
232 add
{base
::overload
(base
&) const
} \
233 {int (const base
* const
, base
&)} \
238 add
{base
::operator
+} \
239 {int (const base
* const
, const base
&)} \
242 add
{base
::operator
++} \
243 {base
(base
* const
)} \
246 add
{base
::operator
+=} \
247 {base
(base
* const
, const base
&)} \
250 add
{base
::operator
-} \
251 {int (const base
* const
, const base
&)} \
254 add
{base
::operator
--} \
255 {base
(base
* const
)} \
258 add
{base
::operator
-=} \
259 {base
(base
* const
, const base
&)} \
262 add
{base
::operator
*} \
263 {int (const base
* const
, const base
&)} \
266 add
{base
::operator
*=} \
267 {base
(base
* const
, const base
&)} \
270 add
{base
::operator
/} \
271 {int (const base
* const
, const base
&)} \
274 add
{base
::operator
/=} \
275 {base
(base
* const
, const base
&)} \
278 add
{base
::operator
%} \
279 {int (const base
* const
, const base
&)} \
282 add
{base
::operator
%=} \
283 {base
(base
* const
, const base
&)} \
286 add
{base
::operator
<} \
287 {bool (const base
* const
, const base
&)} \
290 add
{base
::operator
<=} \
291 {bool (const base
* const
, const base
&)} \
294 add
{base
::operator
>} \
295 {bool (const base
* const
, const base
&)} \
298 add
{base
::operator
>=} \
299 {bool (const base
* const
, const base
&)} \
302 add
{base
::operator
!=} \
303 {bool (const base
* const
, const base
&)} \
306 add
{base
::operator
==} \
307 {bool (const base
* const
, const base
&)} \
310 add
{base
::operator
!} \
311 {bool (const base
* const
)} \
314 add
{base
::operator
&&} \
315 {bool (const base
* const
, const base
&)} \
318 add
{base
::operator||
} \
319 {bool (const base
* const
, const base
&)} \
322 add
{base
::operator
<<} \
323 {int (const base
* const
, int)} \
326 add
{base
::operator
<<=} \
327 {base
(base
* const
, int)} \
330 add
{base
::operator
>>} \
331 {int (const base
* const
, int)} \
334 add
{base
::operator
>>=} \
335 {base
(base
* const
, int)} \
338 add
{base
::operator~
} \
339 {int (const base
* const
)} \
342 add
{base
::operator
&} \
343 {int (const base
* const
, const base
&)} \
346 add
{base
::operator
&=} \
347 {base
(base
* const
, const base
&)} \
350 add
{base
::operator|
} \
351 {int (const base
* const
, const base
&)} \
354 add
{base
::operator|
=} \
355 {base
(base
* const
, const base
&)} \
358 add
{base
::operator^
} \
359 {int (const base
* const
, const base
&)} \
362 add
{base
::operator^
=} \
363 {base
(base
* const
, const base
&)} \
366 add
{base
::operator
=} \
367 {base
(base
* const
, const base
&)} \
370 add
{base
::operator
()} \
371 {void
(const base
* const
)} \
374 add
{base
::operator
[]} \
375 {int (const base
* const
, int)} \
378 add
{base
::operator new
} \
382 add
{base
::operator
delete} \
386 add
{base
::operator new
[]} \
390 add
{base
::operator
delete[]} \
394 add
{base
::operator char
*} \
395 {char
*(const base
* const
)} \
398 add
{base
::operator fluff
*} \
399 {fluff
*(const base
* const
)} \
402 add
{base
::operator fluff
**} \
403 {fluff
**(const base
* const
)} \
406 add
{base
::operator
int} \
407 {int (const base
* const
)} \
412 add
{tclass
<char
>::do_something
} \
413 {void
(tclass
<char
> * const
)} \
416 add
{tclass
<int>::do_something
} \
417 {void
(tclass
<int> * const
)} \
420 add
{tclass
<long
>::do_something
} \
421 {void
(tclass
<long
> * const
)} \
424 add
{tclass
<short
>::do_something
} \
425 {void
(tclass
<short
> * const
)} \
428 add
{tclass
<base
>::do_something
} \
429 {void
(tclass
<base
> * const
)} \
432 add
{flubber
<int, int, int, int, int>} \
436 add
{flubber
<int, int, int, int, short
>} \
440 add
{flubber
<int, int, int, int, long
>} \
444 add
{flubber
<int, int, int, int, char
>} \
448 add
{flubber
<int, int, int, short
, int>} \
452 add
{flubber
<int, int, int, short
, short
>} \
456 add
{flubber
<int, int, int, short
, long
>} \
460 add
{flubber
<int, int, int, short
, char
>} \
464 add
{flubber
<int, int, int, long
, int>} \
468 add
{flubber
<int, int, int, long
, short
>} \
472 add
{flubber
<int, int, int, long
, long
>} \
476 add
{flubber
<int, int, int, long
, char
>} \
480 add
{flubber
<int, int, int, char
, int>} \
484 add
{flubber
<int, int, int, char
, short
>} \
488 add
{flubber
<int, int, int, char
, long
>} \
492 add
{flubber
<int, int, int, char
, char
>} \
496 add
{flubber
<int, int, short
, int, int>} \
500 add
{flubber
<int, int, short
, int, short
>} \
504 add
{flubber
<int, int, short
, int, long
>} \
508 add
{flubber
<int, int, short
, int, char
>} \
512 add
{flubber
<int, int, short
, short
, int>} \
516 add
{flubber
<short
, int, short
, int, short
>} \
520 add
{flubber
<long
, short
, long
, short
, long
>} \
524 add
{tclass
<base
>::do_something
} \
525 {void
(tclass
<base
> * const
)} \
527 {tclass
<T
>::do_something
}
528 add
{policy1
::policy
} \
529 [ctor
"policy<int, operation_1<void*> >" "int"] \
530 {policy
<int, operation_1
<void
*> >::policy
} \
531 {policy
<T
, Policy
>::policy
}
532 add
{policy2
::policy
} \
533 [ctor
"policy<int, operation_2<void*> >" int] \
534 {policy
<int, operation_2
<void
*> >::policy
} \
535 {policy
<T
, Policy
>::policy
}
536 add
{policy3
::policy
} \
537 [ctor
"policy<int, operation_3<void*> >" "int"] \
538 {policy
<int, operation_3
<void
*> >::policy
} \
539 {policy
<T
, Policy
>::policy
}
540 add
{policy4
::policy
} \
541 [ctor
"policy<int, operation_4<void*> >" "int"] \
542 {policy
<int, operation_4
<void
*> >::policy
} \
543 {policy
<T
, Policy
>::policy
}
544 add
{policy1
::function
} \
546 {operation_1
<void
*>::function
} \
547 {operation_1
<T
>::function
}
548 add
{policy2
::function
} \
550 {operation_2
<void
*>::function
} \
551 {operation_2
<T
>::function
}
552 add
{policy3
::function
} \
554 {operation_3
<void
*>::function
} \
555 {operation_3
<T
>::function
}
556 add
{policy4
::function
} \
558 {operation_4
<void
*>::function
} \
559 {operation_4
<T
>::function
}
560 add
{policyd
<int, operation_1
<int> >::policyd
} \
561 [ctor
"policyd<int, operation_1<int> >" "int"] \
563 {policyd
<T
, Policy
>::policyd
}
564 add
{policyd1
::policyd
} \
565 [ctor
"policyd<int, operation_1<int> >" "int"] \
566 {policyd
<int, operation_1
<int> >::policyd
} \
567 {policyd
<T
, Policy
>::policyd
}
568 add
{policyd
<int, operation_1
<int> >::~policyd
} \
569 [dtor
"policyd<int, operation_1<int> >"] \
571 {policyd
<T
, Policy
>::~policyd
}
572 add
{policyd1
::~policyd
} \
573 [dtor
"policyd<int, operation_1<int> >"] \
574 {policyd
<int, operation_1
<int> >::~policyd
} \
575 {policyd
<T
, Policy
>::~policyd
}
576 add
{policyd
<long
, operation_1
<long
> >::policyd
} \
577 [ctor
"policyd<long, operation_1<long> >" "long"] \
579 {policyd
<T
, Policy
>::policyd
}
580 add
{policyd2
::policyd
} \
581 [ctor
"policyd<long, operation_1<long> >" "long"] \
582 {policyd
<long
, operation_1
<long
> >::policyd
} \
583 {policyd
<T
, Policy
>::policyd
}
584 add
{policyd
<long
, operation_1
<long
> >::~policyd
} \
585 [dtor
"policyd<long, operation_1<long> >"] \
587 {policyd
<T
, Policy
>::~policyd
}
588 add
{policyd2
::~policyd
} \
589 [dtor
"policyd<long, operation_1<long> >"] \
590 {policyd
<long
, operation_1
<long
> >::~policyd
} \
591 {policyd
<T
, Policy
>::~policyd
}
592 add
{policyd
<char
, operation_1
<char
> >::policyd
} \
593 [ctor
"policyd<char, operation_1<char> >" "char"] \
595 {policyd
<T
, Policy
>::policyd
}
596 add
{policyd3
::policyd
} \
597 [ctor
"policyd<char, operation_1<char> >" "char"] \
598 {policyd
<char
, operation_1
<char
> >::policyd
} \
599 {policyd
<T
, Policy
>::policyd
}
600 add
{policyd
<char
, operation_1
<char
> >::~policyd
} \
601 [dtor
"policyd<char, operation_1<char> >"] \
603 {policyd
<T
, Policy
>::~policyd
}
604 add
{policyd3
::~policyd
} \
605 [dtor
"policyd<char, operation_1<char> >"] \
606 {policyd
<char
, operation_1
<char
> >::~policyd
} \
607 {policyd
<T
, Policy
>::~policyd
}
608 add
{policyd
<base
, operation_1
<base
> >::policyd
} \
609 [ctor
"policyd<base, operation_1<base> >" "base"] \
611 {policyd
<T
, Policy
>::policyd
}
612 add
{policyd4
::policyd
} \
613 [ctor
"policyd<base, operation_1<base> >" "base"] \
614 {policyd
<base
, operation_1
<base
> >::policyd
} \
615 {policyd
<T
, Policy
>::policyd
}
616 add
{policyd
<base
, operation_1
<base
> >::~policyd
} \
617 [dtor
"policyd<base, operation_1<base> >"] \
619 {policyd
<T
, Policy
>::~policyd
}
620 add
{policyd4
::~policyd
} \
621 [dtor
"policyd<base, operation_1<base> >"] \
622 {policyd
<base
, operation_1
<base
> >::~policyd
} \
623 {policyd
<T
, Policy
>::~policyd
}
624 add
{policyd
<tclass
<int>, operation_1
<tclass
<int> > >::policyd
} \
625 [ctor
"policyd<tclass<int>, operation_1<tclass<int> > >" "tclass<int>"] \
627 {policyd
<T
, Policy
>::policyd
}
628 add
{policyd5
::policyd
} \
629 [ctor
"policyd<tclass<int>, operation_1<tclass<int> > >" "tclass<int>"] \
630 {policyd
<tclass
<int>, operation_1
<tclass
<int> > >::policyd
} \
631 {policyd
<T
, Policy
>::policyd
}
632 add
{policyd
<tclass
<int>, operation_1
<tclass
<int> > >::~policyd
} \
633 [dtor
"policyd<tclass<int>, operation_1<tclass<int> > >"] \
635 {policyd
<T
, Policy
>::~policyd
}
636 add
{policyd5
::~policyd
} \
637 [dtor
"policyd<tclass<int>, operation_1<tclass<int> > >"] \
638 {policyd
<tclass
<int>, operation_1
<tclass
<int> > >::~policyd
} \
639 {policyd
<T
, Policy
>::~policyd
}
640 add
{policyd
<int, operation_1
<int> >::function
} \
642 {operation_1
<int>::function
}\
643 {operation_1
<T
>::function
}
644 add
{policyd1
::function
} \
646 {operation_1
<int>::function
} \
647 {operation_1
<T
>::function
}
648 add
{policyd2
::function
} \
650 {operation_1
<long
>::function
} \
651 {operation_1
<T
>::function
}
652 add
{policyd
<char
, operation_1
<char
> >::function
} \
654 {operation_1
<char
>::function
} \
655 {operation_1
<T
>::function
}
656 add
{policyd3
::function
} \
658 {operation_1
<char
>::function
} \
659 {operation_1
<T
>::function
}
660 add
{policyd
<base
, operation_1
<base
> >::function
} \
662 {operation_1
<base
>::function
} \
663 {operation_1
<T
>::function
}
664 add
{policyd4
::function
} \
666 {operation_1
<base
>::function
} \
667 {operation_1
<T
>::function
}
668 add
{policyd
<tclass
<int>, operation_1
<tclass
<int> > >::function
} \
670 {operation_1
<tclass
<int> >::function
} \
671 {operation_1
<T
>::function
}
672 add
{policyd5
::function
} \
674 {operation_1
<tclass
<int> >::function
} \
675 {operation_1
<T
>::function
}
678 if {[skip_cplus_tests
]} { continue }
680 #
On SPU this test fails because the executable exceeds local storage size.
681 if { [istarget
"spu*-*-*"] } {
686 # test running programs
689 standard_testfile .cc
691 if {[get_compiler_info
"c++"]} {
695 if {[prepare_for_testing $testfile.exp $testfile $srcfile
{debug c
++}]} {
700 perror
"couldn't run to breakpoint"
704 #
Set the listsize to one. This will help with testing
"list".
705 gdb_test
"set listsize 1"
708 foreach
name [get_functions print
] {
709 gdb_test
"print $name" [get $name print] "print $name"
713 foreach
name [get_functions list
] {
714 gdb_test
"list $name" [get $name list] "list $name"
717 # Running to breakpoint
-- use
any function we can
"list"
718 foreach
name [get_functions list
] {
719 # Skip
"test_function", since test_breakpoint uses it
720 if {[string compare $
name "test_function"] != 0} {
721 test_breakpoint $
name
725 # Test c
/v gets recognized even without quoting.
726 foreach cv
{{} { const
} { volatile
} { const volatile
}} {
727 set test
"p 'CV::m(int)$cv'"
728 gdb_test_multiple $test $test
{
729 -re
"( = {.*} 0x\[0-9a-f\]+ <CV::m.*>)\r\n$gdb_prompt $" {
730 #
= {void
(CV
* const
, CV
::t
)} 0x400944 <CV
::m
(int)>
731 set correct $expect_out
(1,string
)
736 setup_kfail c
++/14186 *-*-*
738 gdb_test
"p CV::m(int)$cv" [string_to_regexp $correct]
741 # Test TYPENAME
:: gets recognized even in parentheses.
742 gdb_test
"p CV_f(int)" { = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>}
743 gdb_test
"p CV_f(CV::t)" { = {int \(int\)} 0x[0-9a-f]+ <CV_f\(int\)>}
744 gdb_test
"p CV_f(CV::i)" " = 43"
746 gdb_test
"p CV_f('cpexprs.cc'::CV::t)" \
747 { = {int \
(int\
)} 0x
[0-9a
-f
]+ <CV_f\
(int\
)>}