| Index: gdb/testsuite/gdb.cp/virtfunc.exp
|
| diff --git a/gdb/testsuite/gdb.cp/virtfunc.exp b/gdb/testsuite/gdb.cp/virtfunc.exp
|
| index ab8ecebad786092e8c4b9a6d8aaddf317f52d2b8..4621a7471aafdb7657b72f9421b914ece98f90bf 100644
|
| --- a/gdb/testsuite/gdb.cp/virtfunc.exp
|
| +++ b/gdb/testsuite/gdb.cp/virtfunc.exp
|
| @@ -19,21 +19,14 @@
|
|
|
| set nl "\[\r\n\]+"
|
|
|
| -if $tracelevel then {
|
| - strace $tracelevel
|
| -}
|
| -
|
| if { [skip_cplus_tests] } { continue }
|
|
|
| load_lib "cp-support.exp"
|
|
|
| -set testfile "virtfunc"
|
| -set srcfile ${testfile}.cc
|
| -set binfile ${objdir}/${subdir}/${testfile}
|
| +standard_testfile .cc
|
|
|
| -if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {c++ debug}] != "" } {
|
| - untested virtfunc.exp
|
| - return -1
|
| +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
|
| + return -1
|
| }
|
|
|
| proc test_ptype_of_classes {} {
|
| @@ -230,16 +223,55 @@ proc test_virtual_calls {} {
|
| }
|
| }
|
|
|
| -proc do_tests {} {
|
| - global srcdir subdir binfile
|
| - global gdb_prompt
|
| +# A helper proc that creates a regular expression matching a
|
| +# particular vtable. NAME is the type name. Each element of ARGS is
|
| +# the name of a function in the vtable.
|
| +
|
| +proc make_one_vtable_result {name args} {
|
| + global hex
|
|
|
| + set nls "\[\r\n\]+"
|
|
|
| - gdb_exit
|
| - gdb_start
|
| - gdb_reinitialize_dir $srcdir/$subdir
|
| - gdb_load $binfile
|
| + set result "vtable for '${name}' @ $hex .subobject @ $hex.:$nls"
|
| + set count 0
|
| + foreach func $args {
|
| + append result ".${count}.: $hex <$func..>${nls}"
|
| + incr count
|
| + }
|
|
|
| + return $result
|
| +}
|
| +
|
| +# Test "info vtbl".
|
| +
|
| +proc test_info_vtbl {} {
|
| + global hex
|
| +
|
| + set nls "\[\r\n\]+"
|
| +
|
| + set vt_A [make_one_vtable_result A A::f]
|
| + set vt_B [make_one_vtable_result B B::f]
|
| + set vt_V [make_one_vtable_result V VB::vvb V::vv]
|
| + set vt_V2 [make_one_vtable_result V VB::vvb "virtual thunk to E::vv"]
|
| + set vt_D [make_one_vtable_result D D::vg D::vd]
|
| + set vt_D2 [make_one_vtable_result D "non-virtual thunk to E::vg" D::vd]
|
| + set vt_E [make_one_vtable_result E E::f E::vg E::vv]
|
| +
|
| + gdb_test "info vtbl a" "${vt_A}${vt_V}"
|
| + gdb_test "info vtbl b" "${vt_B}${vt_V}"
|
| + gdb_test "info vtbl c" "${vt_V}"
|
| + gdb_test "info vtbl d" "${vt_D}${vt_V}"
|
| + gdb_test "info vtbl e" "${vt_E}${vt_D2}${vt_V2}"
|
| + gdb_test "info vtbl pEe" "${vt_E}${vt_D2}${vt_V2}"
|
| +
|
| + gdb_test "info vtbl" "Argument required.*"
|
| + gdb_test "info vtbl va" \
|
| + "This object does not have a virtual function table.*"
|
| + gdb_test "info vtbl all_count" \
|
| + "This object does not have a virtual function table.*"
|
| +}
|
| +
|
| +proc do_tests {} {
|
| gdb_test_no_output "set language c++" ""
|
| gdb_test_no_output "set width 0" ""
|
|
|
| @@ -248,6 +280,7 @@ proc do_tests {} {
|
| return
|
| }
|
| test_ptype_of_classes
|
| + test_info_vtbl
|
|
|
| gdb_breakpoint test_calls
|
| gdb_test "continue" ".*Breakpoint .* test_calls.*" ""
|
|
|