diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2013-10-30 11:55:43 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2013-10-30 11:55:43 +0000 |
commit | 0201432a5e742b9c690679511a02ecb7102b246a (patch) | |
tree | 28dc74ba9d17886772c92a6feb523e3d062f0045 /clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp | |
parent | 580da276161ee8b2aa7bc6bd4631cd8261fb9bfb (diff) | |
download | bcm5719-llvm-0201432a5e742b9c690679511a02ecb7102b246a.tar.gz bcm5719-llvm-0201432a5e742b9c690679511a02ecb7102b246a.zip |
Make thunk this/return adjustment ABI-specific. Also, fix the return adjustment when using -cxx-abi microsoft
Reviewed at http://llvm-reviews.chandlerc.com/D2026
llvm-svn: 193679
Diffstat (limited to 'clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp b/clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp index cfbdad941ac..781e4adbc56 100644 --- a/clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp +++ b/clang/test/CodeGenCXX/microsoft-abi-vtables-virtual-inheritance.cpp @@ -22,6 +22,7 @@ // RUN: FileCheck --check-prefix=VDTORS-P %s < %t // RUN: FileCheck --check-prefix=RET-W %s < %t // RUN: FileCheck --check-prefix=RET-T %s < %t +// RUN: FileCheck --check-prefix=RET-V %s < %t // RUN: FileCheck --check-prefix=MANGLING %s < %t @@ -152,7 +153,7 @@ struct X: virtual C { // TEST4: VFTable for 'A' in 'C' in 'Test4::X' (2 entries). // TEST4-NEXT: 0 | void C::f() - // TEST4-NEXT: [this adjustment: 8 non-virtual] + // TEST4-NEXT: [this adjustment: 8 non-virtual] // TEST4-NEXT: 1 | void A::z() // TEST4-NOT: VFTable indices for 'Test4::X' @@ -223,7 +224,7 @@ struct Y : virtual X { // TEST7-NEXT: 1 | void A::z() // TEST7: Thunks for 'void C::f()' (1 entry). - // TEST7-NEXT: 0 | this adjustment: 8 non-virtual + // TEST7-NEXT: 0 | [this adjustment: 8 non-virtual] // TEST7-NOT: VFTable indices for 'Test7::Y' @@ -338,7 +339,7 @@ struct W : Z, D, virtual A, virtual B { // TEST9-W-NEXT: 1 | void A::z() // TEST9-W: Thunks for 'void D::f()' (1 entry). - // TEST9-W-NEXT: 0 | this adjustment: -8 non-virtual + // TEST9-W-NEXT: 0 | [this adjustment: -8 non-virtual] // TEST9-W-NOT: VFTable indices for 'Test9::W' @@ -371,7 +372,7 @@ struct T : Z, D, virtual A, virtual B { // TEST9-T-NEXT: [this adjustment: -8 non-virtual] // TEST9-T: Thunks for 'void Test9::T::h()' (1 entry). - // TEST9-T-NEXT: 0 | this adjustment: -8 non-virtual + // TEST9-T-NEXT: 0 | [this adjustment: -8 non-virtual] // TEST9-T: VFTable for 'A' in 'D' in 'Test9::T' (2 entries). // TEST9-T-NEXT: 0 | void Test9::T::f() @@ -380,10 +381,10 @@ struct T : Z, D, virtual A, virtual B { // TEST9-T-NEXT: [this adjustment: -8 non-virtual] // TEST9-T: Thunks for 'void Test9::T::f()' (1 entry). - // TEST9-T-NEXT: 0 | this adjustment: -8 non-virtual + // TEST9-T-NEXT: 0 | [this adjustment: -8 non-virtual] // TEST9-T: Thunks for 'void Test9::T::z()' (1 entry). - // TEST9-T-NEXT: 0 | this adjustment: -8 non-virtual + // TEST9-T-NEXT: 0 | [this adjustment: -8 non-virtual] // TEST9-T: VFTable indices for 'Test9::T' (4 entries). // TEST9-T-NEXT: via vfptr at offset 0 @@ -464,7 +465,7 @@ struct U : virtual W { // VDTORS-U-NEXT: 1 | void vdtors::X::zzz() // VDTORS-U: Thunks for 'vdtors::W::~W()' (1 entry). - // VDTORS-U-NEXT: 0 | this adjustment: -4 non-virtual + // VDTORS-U-NEXT: 0 | [this adjustment: -4 non-virtual] // VDTORS-U: VFTable indices for 'vdtors::U' (1 entries). // VDTORS-U-NEXT: -- accessible via vbtable index 1, vfptr at offset 4 -- @@ -484,7 +485,7 @@ struct V : virtual W { // VDTORS-V-NEXT: 1 | void vdtors::X::zzz() // VDTORS-V: Thunks for 'vdtors::W::~W()' (1 entry). - // VDTORS-V-NEXT: 0 | this adjustment: -4 non-virtual + // VDTORS-V-NEXT: 0 | [this adjustment: -4 non-virtual] // VDTORS-V: VFTable indices for 'vdtors::V' (1 entries). // VDTORS-V-NEXT: -- accessible via vbtable index 1, vfptr at offset 4 -- @@ -553,4 +554,22 @@ struct T : W { }; T t; + +struct U : virtual A { + virtual void g(); // adds a vfptr +}; + +struct V : Z { + // RET-V: VFTable for 'return_adjustment::Z' in 'return_adjustment::V' (2 entries). + // RET-V-NEXT: 0 | return_adjustment::U *return_adjustment::V::foo() + // RET-V-NEXT: [return adjustment: vbptr at offset 4, vbase #1, 0 non-virtual] + // RET-V-NEXT: 1 | return_adjustment::U *return_adjustment::V::foo() + + // RET-V: VFTable indices for 'return_adjustment::V' (1 entries). + // RET-V-NEXT: 1 | return_adjustment::U *return_adjustment::V::foo() + + virtual U* foo(); +}; + +V v; } |