5624293aaa
gdb.c++/userdef.exp: If GDB fails to restore the selected frame after an inferior function call, report the failure, but allow the test to continue.
337 lines
13 KiB
Text
337 lines
13 KiB
Text
# Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
# Please email any bugs, comments, and/or additions to this file to:
|
|
# bug-gdb@prep.ai.mit.edu
|
|
|
|
# This file was written by Elena Zannoni (ezannoni@cygnus.com)
|
|
|
|
# This file is part of the gdb testsuite
|
|
#
|
|
|
|
#
|
|
# tests for inheritance, with several derivations types combinations (private,
|
|
# public, protected)
|
|
# classes have simple members and member functions.
|
|
#
|
|
|
|
|
|
if $tracelevel then {
|
|
strace $tracelevel
|
|
}
|
|
|
|
#
|
|
# test running programs
|
|
#
|
|
set prms_id 0
|
|
set bug_id 0
|
|
|
|
if { [skip_cplus_tests] } { continue }
|
|
|
|
set testfile "derivation"
|
|
set srcfile ${testfile}.cc
|
|
set binfile ${objdir}/${subdir}/${testfile}
|
|
|
|
# Create and source the file that provides information about the compiler
|
|
# used to compile the test case.
|
|
|
|
if [get_compiler_info ${binfile} "c++"] {
|
|
return -1
|
|
}
|
|
|
|
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
|
|
gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
|
|
}
|
|
|
|
gdb_exit
|
|
gdb_start
|
|
gdb_reinitialize_dir $srcdir/$subdir
|
|
gdb_load ${binfile}
|
|
|
|
#
|
|
# set it up at a breakpoint so we can play with the variable values
|
|
#
|
|
if ![runto_main] then {
|
|
perror "couldn't run to breakpoint"
|
|
continue
|
|
}
|
|
|
|
if ![runto 'marker1'] then {
|
|
perror "couldn't run to marker1"
|
|
continue
|
|
}
|
|
|
|
gdb_test "up" ".*main.*" "up from marker1"
|
|
|
|
|
|
|
|
send_gdb "print a_instance\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = \{a = 1, aa = 2\}\r\n$gdb_prompt $" {
|
|
pass "print value of a_instance"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of a_instance" }
|
|
timeout { fail "(timeout) print value of a_instance" }
|
|
}
|
|
|
|
|
|
send_gdb "ptype a_instance\n"
|
|
gdb_expect {
|
|
-re "type = class A \{\r\n\[\t \]*public:\r\n\[\t \]*int a;\r\n\[\t \]*int aa;\[\r\n\t ]+A & operator=\\(A const ?&\\);\[\r\n\t ]+A\\((A const|const A) ?&\\);\[\r\n\t ]+A\\((void|)\\);\r\n\[\t \]*int afoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype a_instance (with synth ops)" }
|
|
-re "type = class A \{\r\n\[\t \]*public:\r\n\[\t \]*int a;\r\n\[\t \]*int aa;\[\r\n\t \]+A\\(void\\);\r\n\[\t \]*int afoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype a_instance (no synth ops)" }
|
|
-re ".*$gdb_prompt $" { fail "ptype a_instance" }
|
|
timeout { fail "(timeout) ptype a_instance" }
|
|
}
|
|
|
|
|
|
send_gdb "print d_instance\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = \{<A> = \{a = 1, aa = 2\}, <B> = \{b = 3, bb = 4\}, <C> = \{c = 5, cc = 6\}, d = 7, dd = 8\}\r\n$gdb_prompt $" {
|
|
pass "print value of d_instance"
|
|
}
|
|
-re ".\[0-9\]* = \{<class A> = \{a = 1, aa = 2\}, <class B> = \{b = 3, bb = 4\}, <class C> = \{c = 5, cc = 6\}, d = 7, dd = 8\}\r\n$gdb_prompt $" {
|
|
pass "print value of d_instance"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance" }
|
|
timeout { fail "(timeout) print value of d_instance" }
|
|
}
|
|
|
|
if {$gcc_compiled} then {
|
|
send_gdb "ptype d_instance\n"
|
|
gdb_expect {
|
|
-re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t ]+D & operator=\\(D const ?&\\);\[\r\n\t ]+D\\((D const|const D) ?&\\);\[\r\n\t \]+D\\((void|)\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" }
|
|
-re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t ]+D & operator=\\(D const ?&\\);\[\r\n\t ]+D\\((D const|const D) ?&\\);\[\r\n\t \]+D\\((void|)\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" }
|
|
-re "type = class D : private A, public B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t \]+D\\(void\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" }
|
|
-re ".*$gdb_prompt $" { fail "ptype d_instance" }
|
|
timeout { fail "(timeout) ptype d_instance" }
|
|
}
|
|
} else {
|
|
send_gdb "ptype d_instance\n"
|
|
gdb_expect {
|
|
-re "type = class D : private A, public B, protected C \{\r\n\[\t \]*public:\r\n\[\t \]*int d;\r\n\[\t \]*int dd;\[\r\n\t \]+D\\(void\\);\r\n\[\t \]*int dfoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype d_instance" }
|
|
-re ".*$gdb_prompt $" { fail "ptype d_instance" }
|
|
timeout { fail "(timeout) ptype d_instance" }
|
|
}
|
|
}
|
|
|
|
|
|
send_gdb "print e_instance\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = \{<A> = \{a = 1, aa = 2\}, <B> = \{b = 3, bb = 4\}, <C> = \{c = 5, cc = 6\}, e = 9, ee = 10\}\r\n$gdb_prompt $" {
|
|
pass "print value of e_instance"
|
|
}
|
|
-re ".\[0-9\]* = \{<class A> = \{a = 1, aa = 2\}, <class B> = \{b = 3, bb = 4\}, <class C> = \{c = 5, cc = 6\}, e = 9, ee = 10\}\r\n$gdb_prompt $" {
|
|
pass "print value of e_instance"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of e_instance" }
|
|
timeout { fail "(timeout) print value of e_instance" }
|
|
}
|
|
|
|
if {$gcc_compiled} {
|
|
send_gdb "ptype e_instance\n"
|
|
gdb_expect {
|
|
-re "type = class E : public A, private B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t ]+E & operator=\\(E const ?&\\);\[\r\n\t ]+E\\((E const|const E) ?&\\);\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" }
|
|
-re "type = class E : public A, private B, (protected|private) C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" }
|
|
-re ".*$gdb_prompt $" { fail "ptype e_instance" }
|
|
timeout { fail "(timeout) ptype e_instance" }
|
|
}
|
|
} else {
|
|
send_gdb "ptype e_instance\n"
|
|
gdb_expect {
|
|
-re "type = class E : public A, private B, protected C \{\r\n\[\t \]*public:\r\n\[\t \]*int e;\r\n\[\t \]*int ee;\[\r\n\t \]+E\\((void|)\\);\r\n\[\t \]*int efoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype e_instance" }
|
|
-re ".*$gdb_prompt $" { fail "ptype e_instance" }
|
|
timeout { fail "(timeout) ptype e_instance" }
|
|
}
|
|
}
|
|
|
|
|
|
send_gdb "print f_instance\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = \{<A> = \{a = 1, aa = 2\}, <B> = \{b = 3, bb = 4\}, <C> = \{c = 5, cc = 6\}, f = 11, ff = 12\}\r\n$gdb_prompt $" {
|
|
pass "print value of f_instance"
|
|
}
|
|
-re ".\[0-9\]* = \{<class A> = \{a = 1, aa = 2\}, <class B> = \{b = 3, bb = 4\}, <class C> = \{c = 5, cc = 6\}, f = 11, ff = 12\}\r\n$gdb_prompt $" {
|
|
pass "print value of f_instance"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of f_instance" }
|
|
timeout { fail "(timeout) print value of f_instance" }
|
|
}
|
|
|
|
send_gdb "ptype f_instance\n"
|
|
gdb_expect {
|
|
-re "type = class F : private A, public B, private C \{\r\n\[\t \]*public:\r\n\[\t \]*int f;\r\n\[\t \]*int ff;\[\r\n\t ]+F & operator=\\(F const ?&\\);\[\r\n\t ]+F\\((F const|const F) ?&\\);\[\r\n\t \]+F\\((void|)\\);\r\n\[\t \]*int ffoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype f_instance" }
|
|
-re "type = class F : private A, public B, private C \{\r\n\[\t \]*public:\r\n\[\t \]*int f;\r\n\[\t \]*int ff;\[\r\n\t \]+F\\((void|)\\);\r\n\[\t \]*int ffoo\\((void|)\\);\r\n\[\t \]*int foo\\((void|)\\);\r\n\}.*$gdb_prompt $" { pass "ptype f_instance" }
|
|
-re ".*$gdb_prompt $" { fail "ptype f_instance" }
|
|
timeout { fail "(timeout) ptype f_instance" }
|
|
}
|
|
|
|
|
|
|
|
send_gdb "print d_instance.a\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 1.*$gdb_prompt $" {
|
|
pass "print value of d_instance.a"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance.a" }
|
|
timeout { fail "(timeout) print value of d_instance.a" }
|
|
}
|
|
|
|
send_gdb "print d_instance.aa\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 2.*$gdb_prompt $" {
|
|
pass "print value of d_instance.aa"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance.aa" }
|
|
timeout { fail "(timeout) print value of d_instance.aa" }
|
|
}
|
|
|
|
send_gdb "print d_instance.b\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 3.*$gdb_prompt $" {
|
|
pass "print value of d_instance.b"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance.b" }
|
|
timeout { fail "(timeout) print value of d_instance.b" }
|
|
}
|
|
|
|
send_gdb "print d_instance.bb\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 4.*$gdb_prompt $" {
|
|
pass "print value of d_instance.bb"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance.bb" }
|
|
timeout { fail "(timeout) print value of d_instance.bb" }
|
|
}
|
|
|
|
send_gdb "print d_instance.c\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 5.*$gdb_prompt $" {
|
|
pass "print value of d_instance.c"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance.c" }
|
|
timeout { fail "(timeout) print value of d_instance.c" }
|
|
}
|
|
|
|
send_gdb "print d_instance.cc\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 6.*$gdb_prompt $" {
|
|
pass "print value of d_instance.cc"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance.cc" }
|
|
timeout { fail "(timeout) print value of d_instance.cc" }
|
|
}
|
|
|
|
send_gdb "print d_instance.d\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 7.*$gdb_prompt $" {
|
|
pass "print value of d_instance.d"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance.d" }
|
|
timeout { fail "(timeout) print value of d_instance.d" }
|
|
}
|
|
|
|
send_gdb "print d_instance.dd\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 8.*$gdb_prompt $" {
|
|
pass "print value of d_instance.dd"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of d_instance.dd" }
|
|
timeout { fail "(timeout) print value of d_instance.dd" }
|
|
}
|
|
|
|
send_gdb "print g_instance.a\n"
|
|
gdb_expect {
|
|
-re "warning.*$gdb_prompt $" {
|
|
# The compiler doesn't think this is ambiguous.
|
|
fail "print value of g_instance.a"
|
|
}
|
|
-re ".\[0-9\]* = 15.*$gdb_prompt $" {
|
|
pass "print value of g_instance.a"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of g_instance.a" }
|
|
timeout { fail "(timeout) print value of g_instance.a" }
|
|
}
|
|
|
|
send_gdb "print g_instance.b\n"
|
|
gdb_expect {
|
|
-re "warning.*$gdb_prompt $" {
|
|
# The compiler doesn't think this is ambiguous.
|
|
fail "print value of g_instance.b"
|
|
}
|
|
-re ".\[0-9\]* = 16.*$gdb_prompt $" {
|
|
pass "print value of g_instance.b"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of g_instance.b" }
|
|
timeout { fail "(timeout) print value of g_instance.b" }
|
|
}
|
|
|
|
send_gdb "print g_instance.c\n"
|
|
gdb_expect {
|
|
-re "warning.*$gdb_prompt $" {
|
|
# The compiler doesn't think this is ambiguous.
|
|
fail "print value of g_instance.c"
|
|
}
|
|
-re ".\[0-9\]* = 17.*$gdb_prompt $" {
|
|
pass "print value of g_instance.c"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of g_instance.c" }
|
|
timeout { fail "(timeout) print value of g_instance.c" }
|
|
}
|
|
|
|
send_gdb "print g_instance.afoo()\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 1.*$gdb_prompt $" {
|
|
pass "print value of g_instance.afoo()"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of g_instance.afoo()" }
|
|
timeout { fail "(timeout) print value of g_instance.afoo()" }
|
|
}
|
|
|
|
|
|
# If GDB fails to restore the selected frame properly after the
|
|
# inferior function call above (see GDB PR 1155 for an explanation of
|
|
# why this might happen), all the subsequent tests will fail. We
|
|
# should detect report that failure, but let the marker call finish so
|
|
# that the rest of the tests can run undisturbed.
|
|
gdb_test_multiple "frame" "re-selected 'main' frame after inferior call" {
|
|
-re "#0 marker1.*$gdb_prompt $" {
|
|
setup_kfail "gdb/1155" s390-*-linux-gnu
|
|
fail "re-selected 'main' frame after inferior call"
|
|
gdb_test "finish" ".*main.*at .*derivation.cc:21\[79\].*" \
|
|
"finish call to marker1"
|
|
}
|
|
-re "#1 ($hex in )?main.*$gdb_prompt $" {
|
|
pass "re-selected 'main' frame after inferior call"
|
|
}
|
|
}
|
|
|
|
send_gdb "print g_instance.bfoo()\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 2.*$gdb_prompt $" {
|
|
pass "print value of g_instance.bfoo()"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of g_instance.bfoo()" }
|
|
timeout { fail "(timeout) print value of g_instance.bfoo()" }
|
|
}
|
|
|
|
send_gdb "print g_instance.cfoo()\n"
|
|
gdb_expect {
|
|
-re ".\[0-9\]* = 3.*$gdb_prompt $" {
|
|
pass "print value of g_instance.cfoo()"
|
|
}
|
|
-re ".*$gdb_prompt $" { fail "print value of g_instance.cfoo()" }
|
|
timeout { fail "(timeout) print value of g_instance.cfoo()" }
|
|
}
|