blob: fca4e38634083acaa06007d2887d084fe44b2f92 [file] [log] [blame]
# Copyright 2003 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.
# This file was written by Jim Ingham <jingham@apple.com>
# This file tests some aspects of the APPLE LOCAL var-path-expression
# commands, particularly with classes & base classes.
# This file is part of the gdb testsuite
load_lib mi-support.exp
set MIFLAGS "-i=mi1"
if $tracelevel then {
strace $tracelevel
}
gdb_exit
if [mi_gdb_start] {
continue
}
set notQuote {\[^"\]*}
proc compare_var_and_expression {varObj value {type {}} {typecode {}}} {
global expect_out hex notQuote
if {[string equal $type ""]} { set type $notQuote }
if {[string equal $typecode ""]} { set typecode $notQuote }
mi_gdb_test "-var-evaluate-expression $varObj" \
"\\^done,value=(\"$value\")" \
"get the value of $varObj"
set originalValue $expect_out(2,string)
mi_gdb_test "-var-info-path-expression $varObj" \
{\^done,path_expr=("[^"]*")} \
"get path expression for $varObj"
set expression $expect_out(2,string)
mi_gdb_test "-var-create - * $expression" \
"\\^done,name=\"(\[^\"\]*)\",numchild=\"0\",type=\"$type\",typecode=\"$typecode\",dynamic_type=\"\[^\"\]*\",resolved_type=\"$type\",in_scope=\"true\",block_start_addr=\"$hex\",block_end_addr=\"$hex\"" \
"Create varobj for $varObj expression"
set exprVar $expect_out(2,string)
mi_gdb_test "-var-evaluate-expression $exprVar" \
"\\^done,value=(\"$value\")" \
"Get value for $varObj expression"
set exprValue $expect_out(2,string)
if {[string equal $originalValue $exprValue]} {
pass "varobj and expression have same value for $varObj"
} else {
fail "varobj and expression have same value for $varObj"
}
}
set testfile "var-path-expr"
set srcfile ${testfile}.cpp
set binfile ${objdir}/${subdir}/${testfile}
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."
}
mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}
mi_run_to_main
set lineNum 99
mi_gdb_test "-break-insert $lineNum" \
"\\^done,bkpt=\{number=\"$decimal\",.*func=\"main\",.*file=\".*$srcfile\".*\}" \
"breakpoint in main after all the work's done"
mi_continue_to 2 main {} var-path-expr.cpp $lineNum {run to break in main}
# In this section we drill down to a class member that is a polymorphic object, and make sure
# we can print a member from the real dynamic type of the object.
mi_gdb_test {-var-create fooVar * myFoo} \
{\^done,name="fooVar",.*numchild="1",.*type="Foo".*} \
"create varobj for fooVar"
mi_gdb_test {-var-list-children fooVar} \
{\^done,numchild="1",children=\[child={name="fooVar.private",.*exp="private",.*type="",typecode="FAKE_CHILD",.*dynamic_type="",resolved_type=""}\]} \
"list children of fooVar"
mi_gdb_test {-var-list-children fooVar.private} \
{\^done,numchild="1",children=\[child={name="fooVar.private.contents",exp="contents",numchild="2",type="class Container \*",typecode="PTR",dynamic_type="FancyIntContainer \*",resolved_type="class Container \*"}\]} \
"list children of fooVar.private"
mi_gdb_test {-var-list-children fooVar.private.contents} \
{\^done,numchild="2",children=\[child={name="fooVar.private.contents.IntContainer",exp="IntContainer",numchild="3",type="IntContainer \*",typecode="PTR",dynamic_type="",resolved_type="IntContainer \*"},child={name="fooVar.private.contents.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \
"list children of fooVar.private.contents"
mi_gdb_test {-var-list-children fooVar.private.contents.private} \
{\^done,numchild="1",children=\[child={name="fooVar.private.contents.private.multiplier",exp="multiplier",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int"}\]} \
"list children of fooVar.private.contents.private"
compare_var_and_expression fooVar.private.contents.private.multiplier 10 int INT
# Now we'll look at the base classes of this polymorphic object, and make sure we get the expressions
# for them right as well.
mi_gdb_test {-var-list-children fooVar.private.contents.IntContainer} \
{\^done,numchild="3",children=\[child={name="fooVar.private.contents.IntContainer.Container",exp="Container",numchild="1",type="Container \*",typecode="PTR",dynamic_type="",resolved_type="Container \*"},child={name="fooVar.private.contents.IntContainer.SomeOtherStuff",exp="SomeOtherStuff",numchild="1",type="SomeOtherStuff \*",typecode="PTR",dynamic_type="",resolved_type="SomeOtherStuff \*"},child={name="fooVar.private.contents.IntContainer.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \
"Create varobj for IntContainerfooVar.private.contents.IntContainer"
mi_gdb_test {-var-list-children fooVar.private.contents.IntContainer.SomeOtherStuff} \
{\^done,numchild="1",children=\[child={name="fooVar.private.contents.IntContainer.SomeOtherStuff.private",exp="private",numchild="2",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \
"Create varobj for fooVar.private.contents.IntContainer.SomeOtherStuff"
mi_gdb_test {-var-list-children fooVar.private.contents.IntContainer.SomeOtherStuff.private} \
{\^done,numchild="2",children=\[child={name="fooVar.private.contents.IntContainer.SomeOtherStuff.private.myInt",exp="myInt",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int"},child={name="fooVar.private.contents.IntContainer.SomeOtherStuff.private.myDouble",exp="myDouble",numchild="0",type="double",typecode="FLT",dynamic_type="",resolved_type="double"}\]} \
"Create varobj for fooVar.private.contents.IntContainer.SomeOtherStuff.private"
compare_var_and_expression fooVar.private.contents.IntContainer.SomeOtherStuff.private.myDouble 5 double FLT
# Now chase through the class heirarchy where we have an object, not a pointer to an object.
mi_gdb_test {-var-create contVar * myContainer} \
"\\^done,name=\"contVar\",numchild=\"2\",type=\"FancyIntContainer\",typecode=\"STRUCT\",dynamic_type=\"\",resolved_type=\"FancyIntContainer\",in_scope=\"true\",block_start_addr=\"$hex\",block_end_addr=\"$hex\"" \
"Create myContainer varobj"
mi_gdb_test {-var-list-children contVar} \
{\^done,numchild="2",children=\[child={name="contVar.IntContainer",exp="IntContainer",numchild="3",type="IntContainer",typecode="STRUCT",dynamic_type="",resolved_type="IntContainer"},child={name="contVar.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \
"List children of contVar"
mi_gdb_test {-var-list-children contVar.IntContainer} \
{\^done,numchild="3",children=\[child={name="contVar.IntContainer.Container",exp="Container",numchild="1",type="Container",typecode="STRUCT",dynamic_type="",resolved_type="Container"},child={name="contVar.IntContainer.SomeOtherStuff",exp="SomeOtherStuff",numchild="1",type="SomeOtherStuff",typecode="STRUCT",dynamic_type="",resolved_type="SomeOtherStuff"},child={name="contVar.IntContainer.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \
"List children of contVar.intContainer"
mi_gdb_test {-var-list-children contVar.IntContainer.private} \
{\^done,numchild="1",children=\[child={name="contVar.IntContainer.private.intValue",exp="intValue",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int"}\]} \
"List children of contVar.IntContainer.private"
compare_var_and_expression contVar.IntContainer.private.intValue 5 int INT
mi_gdb_test {-var-list-children contVar.IntContainer.Container} \
{\^done,numchild="1",children=\[child={name="contVar.IntContainer.Container.private",exp="private",numchild="1",type="",typecode="FAKE_CHILD",dynamic_type="",resolved_type=""}\]} \
"List children of contVar.IntContainer.Container"
mi_gdb_test {-var-list-children contVar.IntContainer.Container.private} \
{\^done,numchild="1",children=\[child={name="contVar.IntContainer.Container.private.errorNo",exp="errorNo",numchild="0",type="int",typecode="INT",dynamic_type="",resolved_type="int"}\]} \
"List children of contVar.IntContainer.Container.private"
compare_var_and_expression contVar.IntContainer.Container.private.errorNo -1 int INT