diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2014-08-10 11:40:51 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2014-08-10 11:40:51 +0000 |
commit | 16055e77b922695e2141b810a38508bc1aa00e0a (patch) | |
tree | 60b6caf7b87f51e6a4204aba0d16686c87d40678 /clang/test/CodeGenCXX/microsoft-abi-vtables-multiple-nonvirtual-inheritance-return-adjustment.cpp | |
parent | b696d460459e10c86d5edebddd420065a161cd5d (diff) | |
download | bcm5719-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.cpp | 43 |
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(); } +} |