summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp
diff options
context:
space:
mode:
authorTimur Iskhodzhanov <timurrrr@google.com>2014-08-10 11:40:51 +0000
committerTimur Iskhodzhanov <timurrrr@google.com>2014-08-10 11:40:51 +0000
commit16055e77b922695e2141b810a38508bc1aa00e0a (patch)
tree60b6caf7b87f51e6a4204aba0d16686c87d40678 /clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp
parentb696d460459e10c86d5edebddd420065a161cd5d (diff)
downloadbcm5719-llvm-16055e77b922695e2141b810a38508bc1aa00e0a.tar.gz
bcm5719-llvm-16055e77b922695e2141b810a38508bc1aa00e0a.zip
Fix PR20444 -- wrong number of vftable slots created when return adjustment thunks are needed
Reviewed at http://reviews.llvm.org/D4822 llvm-svn: 215312
Diffstat (limited to 'clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp')
-rw-r--r--clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp b/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp
index 2d0bf636229..2f46609d097 100644
--- a/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp
+++ b/clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp
@@ -295,3 +295,46 @@ struct X : E {
void build_vftable(X *obj) { obj->foo(); }
}
+
+namespace pr20444 {
+struct A {
+ virtual A* f();
+};
+struct B {
+ virtual B* f();
+};
+struct C : A, B {
+ virtual C* f();
+ // CHECK-LABEL: VFTable for 'pr20444::A' in 'pr20444::C' (1 entry).
+ // CHECK-NEXT: 0 | pr20444::C *pr20444::C::f()
+
+ // CHECK-LABEL: VFTable for 'pr20444::B' in 'pr20444::C' (2 entries).
+ // CHECK-NEXT: 0 | pr20444::C *pr20444::C::f()
+ // CHECK-NEXT: [return adjustment (to type 'struct pr20444::B *'): 4 non-virtual]
+ // CHECK-NEXT: [this adjustment: -4 non-virtual]
+ // CHECK-NEXT: 1 | pr20444::C *pr20444::C::f()
+ // CHECK-NEXT: [return adjustment (to type 'struct pr20444::C *'): 0 non-virtual]
+ // CHECK-NEXT: [this adjustment: -4 non-virtual]
+};
+
+void build_vftable(C *obj) { obj->f(); }
+
+struct D : C {
+ virtual D* f();
+ // CHECK-LABEL: VFTable for 'pr20444::A' in 'pr20444::C' in 'pr20444::D' (1 entry).
+ // CHECK-NEXT: 0 | pr20444::D *pr20444::D::f()
+
+ // CHECK-LABEL: VFTable for 'pr20444::B' in 'pr20444::C' in 'pr20444::D' (3 entries).
+ // CHECK-NEXT: 0 | pr20444::D *pr20444::D::f()
+ // CHECK-NEXT: [return adjustment (to type 'struct pr20444::B *'): 4 non-virtual]
+ // CHECK-NEXT: [this adjustment: -4 non-virtual]
+ // CHECK-NEXT: 1 | pr20444::D *pr20444::D::f()
+ // CHECK-NEXT: [return adjustment (to type 'struct pr20444::C *'): 0 non-virtual]
+ // CHECK-NEXT: [this adjustment: -4 non-virtual]
+ // CHECK-NEXT: 2 | pr20444::D *pr20444::D::f()
+ // CHECK-NEXT: [return adjustment (to type 'struct pr20444::D *'): 0 non-virtual]
+ // CHECK-NEXT: [this adjustment: -4 non-virtual]
+};
+
+void build_vftable(D *obj) { obj->f(); }
+}
OpenPOWER on IntegriCloud