diff options
Diffstat (limited to 'gdb/testsuite/gdb.cp')
-rw-r--r-- | gdb/testsuite/gdb.cp/class2.cc | 19 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/class2.exp | 16 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/classes.cc | 18 | ||||
-rw-r--r-- | gdb/testsuite/gdb.cp/classes.exp | 9 |
4 files changed, 61 insertions, 1 deletions
diff --git a/gdb/testsuite/gdb.cp/class2.cc b/gdb/testsuite/gdb.cp/class2.cc index 617a8fa..409fb29 100644 --- a/gdb/testsuite/gdb.cp/class2.cc +++ b/gdb/testsuite/gdb.cp/class2.cc @@ -46,6 +46,23 @@ struct C : public B A *c2; }; +/* Use a typedef for the baseclass, with a virtual method, to exercise + gnu-v3-abi.c:gnuv3_dynamic_class recursion. It's important that the + class itself have no name to make sure the typedef makes it through + to the recursive call. */ +typedef class { + public: + /* This class has no members as gcc 4.9.x doesn't emit the debug info + for them. */ + virtual int get () { return 42; } +} Dbase; + +class D : public Dbase +{ + public: + int d1; +}; + // Stop the compiler from optimizing away data. void refer (A *) { @@ -65,12 +82,14 @@ int main (void) A alpha, *aap, *abp, *acp; B beta, *bbp; C gamma; + D delta; empty e; A &aref (alpha); alpha.a1 = 100; beta.a1 = 200; beta.b1 = 201; beta.b2 = 202; gamma.c1 = 0; gamma.c2 = (A *) ~0UL; + delta.d1 = 400; aap = α refer (aap); abp = β refer (abp); diff --git a/gdb/testsuite/gdb.cp/class2.exp b/gdb/testsuite/gdb.cp/class2.exp index 7fedc58..81b3561 100644 --- a/gdb/testsuite/gdb.cp/class2.exp +++ b/gdb/testsuite/gdb.cp/class2.exp @@ -101,17 +101,31 @@ gdb_test "print * (B *) abp" \ "= {.*a1 = 200.*b1 = 201.*b2 = 202}" \ "print * (B *) abp at marker return 0" +# Print the "D" object. + +gdb_test "print delta" \ + "= {.*d1 = 400}" \ + "print delta with \"print object\" off" + # Printing the value of an object containing no data fields: gdb_test "p e" "= \{<No data fields>\}" "print object with no data fields" -# Printing NULL pointers with "set print object on" +# Printing NULL pointers with "set print object on". gdb_test_no_output "set print object on" gdb_test "p acp" "= \\(C \\*\\) ${hex}" gdb_test "p acp->c1" "\\(A \\*\\) 0x0" gdb_test "p acp->c2" "\\(A \\*\\) ${hex}f" +# Print the "D" object with "set print object on". +# There's no difference in output, but this exercises vtable lookup +# with a typedef'd baseclass. + +gdb_test "print delta" \ + "= {.*d1 = 400}" \ + "print delta with \"print object\" on" + # Regression test for PR c++/15401. # Check that the type printed is a reference. gdb_test "p aref" " = \\(A \\&\\) .*" diff --git a/gdb/testsuite/gdb.cp/classes.cc b/gdb/testsuite/gdb.cp/classes.cc index e7b7c14..648452c 100644 --- a/gdb/testsuite/gdb.cp/classes.cc +++ b/gdb/testsuite/gdb.cp/classes.cc @@ -434,6 +434,24 @@ Foo::operator int() { return x; } ByAnyOtherName foo(10, 11); Bar bar(20, 21, 22); +/* Use a typedef for the baseclass to exercise gnu-v3-abi.c:gnuv3_dynamic_class + recursion. It's important that the class itself have no name to make sure + the typedef makes it through to the recursive call. */ +typedef class { + public: + int x; + virtual int get_x () { return x; } +} DynamicBase2; + +class DynamicBar : public DynamicBase2 +{ + public: + DynamicBar (int i, int j) { x = i; y = j; } + int y; +}; + +DynamicBar dynbar (23, 24); + class ClassWithEnum { public: enum PrivEnum { red, green, blue, yellow = 42 }; diff --git a/gdb/testsuite/gdb.cp/classes.exp b/gdb/testsuite/gdb.cp/classes.exp index 7b658d5..1d714d3 100644 --- a/gdb/testsuite/gdb.cp/classes.exp +++ b/gdb/testsuite/gdb.cp/classes.exp @@ -307,6 +307,15 @@ proc test_ptype_class_objects {} { { method public "Bar(int, int, int);" } } + # Derived class with typedef'd baseclass with virtual methods. + + cp_test_ptype_class \ + "class DynamicBar" "" "class" "DynamicBar" \ + { + { base "public DynamicBase2" } + { field public "int y;" } + { method public "DynamicBar(int, int);" } + } } # Test simple access to class members. |