aboutsummaryrefslogtreecommitdiff
path: root/test/CodeGenCXX/vtable-layout.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-02-28 01:43:58 +0000
committerAnders Carlsson <andersca@mac.com>2010-02-28 01:43:58 +0000
commit530c40c516427112f76a88958bf7c17769b5ca12 (patch)
tree4fef41fcb9f9144dfa2e7d2f861e51a545e4ddd9 /test/CodeGenCXX/vtable-layout.cpp
parentd68fc055e17e8b01ac824d8ab749bc169fc4b93d (diff)
More improvements to construction vtables; we know handle vbase offsets correctly (I hope).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97361 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/vtable-layout.cpp')
-rw-r--r--test/CodeGenCXX/vtable-layout.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/test/CodeGenCXX/vtable-layout.cpp b/test/CodeGenCXX/vtable-layout.cpp
index 58ce44fed7..335eb1cd49 100644
--- a/test/CodeGenCXX/vtable-layout.cpp
+++ b/test/CodeGenCXX/vtable-layout.cpp
@@ -855,6 +855,7 @@ struct V2 : virtual V1 {
// CHECK-NEXT: 5 | vbase_offset (-4)
// CHECK-NEXT: 6 | offset_to_top (-16)
// CHECK-NEXT: 7 | Test22::C RTTI
+// CHECK-NEXT: -- (Test22::V2, 16) vtable address --
// CHECK: Construction vtable for ('Test22::V2', 16) in 'Test22::C' (3 entries).
// CHECK-NEXT: 0 | vbase_offset (-4)
@@ -868,3 +869,55 @@ struct C : virtual V1, virtual V2 {
void C::f() { }
}
+
+namespace Test23 {
+
+struct A {
+ int a;
+};
+
+struct B : virtual A {
+ int b;
+};
+
+struct C : A, virtual B {
+ int c;
+};
+
+// CHECK: Vtable for 'Test23::D' (7 entries).
+// CHECK-NEXT: 0 | vbase_offset (20)
+// CHECK-NEXT: 1 | vbase_offset (24)
+// CHECK-NEXT: 2 | offset_to_top (0)
+// CHECK-NEXT: 3 | Test23::D RTTI
+// CHECK-NEXT: -- (Test23::C, 0) vtable address --
+// CHECK-NEXT: -- (Test23::D, 0) vtable address --
+// CHECK-NEXT: 4 | vbase_offset (-4)
+// CHECK-NEXT: 5 | offset_to_top (-24)
+// CHECK-NEXT: 6 | Test23::D RTTI
+// CHECK-NEXT: -- (Test23::B, 24) vtable address --
+
+// CHECK: Construction vtable for ('Test23::C', 0) in 'Test23::D' (7 entries).
+// CHECK-NEXT: 0 | vbase_offset (20)
+// CHECK-NEXT: 1 | vbase_offset (24)
+// CHECK-NEXT: 2 | offset_to_top (0)
+// CHECK-NEXT: 3 | Test23::C RTTI
+// CHECK-NEXT: -- (Test23::C, 0) vtable address --
+// CHECK-NEXT: 4 | vbase_offset (-4)
+// CHECK-NEXT: 5 | offset_to_top (-24)
+// CHECK-NEXT: 6 | Test23::C RTTI
+// CHECK-NEXT: -- (Test23::B, 24) vtable address --
+
+// CHECK: Construction vtable for ('Test23::B', 24) in 'Test23::D' (3 entries).
+// CHECK-NEXT: 0 | vbase_offset (-4)
+// CHECK-NEXT: 1 | offset_to_top (0)
+// CHECK-NEXT: 2 | Test23::B RTTI
+// CHECK-NEXT: -- (Test23::B, 24) vtable address --
+
+struct D : virtual A, virtual B, C {
+ int d;
+
+ void f();
+};
+void D::f() { }
+
+}