From 345f514a9388b68188a5e3dcc28cbdb6e6a70b04 Mon Sep 17 00:00:00 2001 From: Keith Seitz Date: Mon, 15 Oct 2012 22:32:50 +0000 Subject: [PATCH] * lib/cp-support.exp (cp_test_ptype_class): Add support for class typedefs. * gdb.cp/derivation.exp: Add tests for g_instance. --- gdb/testsuite/ChangeLog | 7 +++++++ gdb/testsuite/gdb.cp/derivation.exp | 16 ++++++++++++++++ gdb/testsuite/lib/cp-support.exp | 28 ++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index db61c62627..7203ad2822 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2012-10-15 Keith Seitz + + * 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 Fix entry values resolving in inlined frames. diff --git a/gdb/testsuite/gdb.cp/derivation.exp b/gdb/testsuite/gdb.cp/derivation.exp index a4210d9d42..f4b4888137 100644 --- a/gdb/testsuite/gdb.cp/derivation.exp +++ b/gdb/testsuite/gdb.cp/derivation.exp @@ -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" diff --git a/gdb/testsuite/lib/cp-support.exp b/gdb/testsuite/lib/cp-support.exp index 8829f97df2..467a25e04c 100644 --- a/gdb/testsuite/lib/cp-support.exp +++ b/gdb/testsuite/lib/cp-support.exp @@ -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]