* lib/cp-support.exp (cp_test_ptype_class): Add support

for class typedefs.

	* gdb.cp/derivation.exp: Add tests for g_instance.
This commit is contained in:
Keith Seitz 2012-10-15 22:32:50 +00:00
parent 07540c156d
commit 345f514a93
3 changed files with 51 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2012-10-15 Keith Seitz <keiths@redhat.com>
* lib/cp-support.exp (cp_test_ptype_class): Add support
for class typedefs.
* gdb.cp/derivation.exp: Add tests for g_instance.
2012-10-15 Jan Kratochvil <jan.kratochvil@redhat.com>
Fix entry values resolving in inlined frames.

View File

@ -134,6 +134,22 @@ cp_test_ptype_class \
{ method public "int foo();" }
}
# class G
cp_test_ptype_class \
"ptype g_instance" "" "class" "G" \
{
{ base "private A" }
{ base "public B" }
{ base "protected C" }
{ field public "int g;" }
{ field public "int gg;" }
{ field public "int a;" }
{ field public "int b;" }
{ field public "int c;" }
{ method public "int gfoo();" }
{ method public "int foo();" }
}
# Print individual fields.
gdb_test "print d_instance.a" "\\$\[0-9\]+ = 1" "print value of d_instance.a"

View File

@ -81,6 +81,11 @@ proc cp_check_errata { expected_string actual_string errata_table } {
# the class has a member function with the given access type
# and the given declaration.
#
# { typedef "access" "declaration" }
#
# the class has a typedef with the given access type and the
# given declaration.
#
# If you test the same class declaration more than once, you can specify
# IN_CLASS_TABLE as "ibid". "ibid" means: look for a previous class
# table that had the same IN_KEY and IN_TAG, and re-use that table.
@ -199,6 +204,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table {
set list_vbases { }
set list_fields { }
set list_methods { }
set list_typedefs { }
foreach class_line $in_class_table {
switch [lindex $class_line 0] {
@ -206,6 +212,7 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table {
"vbase" { lappend list_vbases [lindex $class_line 1] }
"field" { lappend list_fields [lrange $class_line 1 2] }
"method" { lappend list_methods [lrange $class_line 1 2] }
"typedef" { lappend list_typedefs [lrange $class_line 1 2] }
default { fail "$in_testname // bad line in class table: $class_line"; return; }
}
}
@ -381,6 +388,22 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table {
}
}
# Typedef
if {[llength $list_typedefs] > 0} {
set typedef_access [lindex [lindex $list_typedefs 0] 0]
set typedef_decl [lindex [lindex $list_typedefs 0] 1]
if {[string equal $actual_line $typedef_decl]} {
if {![string equal $access $typedef_access]} {
cp_check_errata $typedef_access $access $in_errata_table
fail "$in_testname // wrong access specifier for typedef: $access"
return
}
set list_typedefs [lreplace $list_typedefs 0 0]
continue
}
}
# Synthetic operators. These are optional and can be mixed in
# with the methods in any order, but duplicates are wrong.
#
@ -452,6 +475,11 @@ proc cp_test_ptype_class { in_command in_testname in_key in_tag in_class_table {
return
}
if {[llength $list_typedefs] > 0} {
fail "$in_testname // missing typedefs"
return
}
# Check the tail.
set actual_tail [string trim $actual_tail]