diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2014-03-20 20:38:34 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2014-03-20 20:38:34 +0000 |
commit | dad9d115806048b723a08155cfa495f063710ee0 (patch) | |
tree | cc89a123f7ba37da27c88e4c565c2ac6112e1355 /test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp | |
parent | aeef5e23df0b28af557b01e4e8e2bac1f210eed2 (diff) | |
download | clang-dad9d115806048b723a08155cfa495f063710ee0.tar.gz |
Fix PR19172 - wrong this adjustment calculated for virtual destructor in a class with complex inheritance
Reviewed at http://llvm-reviews.chandlerc.com/D3128
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204394 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp')
-rw-r--r-- | test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp b/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp index 22e1fa71ec..23cc70994b 100644 --- a/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp +++ b/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp @@ -377,3 +377,45 @@ void D::bar() { // CHECK: ret } } + +namespace test4{ +// PR19172: We used to merge method vftable locations wrong. + +struct A { + virtual ~A() {} +}; + +struct B { + virtual ~B() {} +}; + +struct C : virtual A, B { + virtual ~C(); +}; + +void foo(void*); + +C::~C() { + // CHECK-LABEL: define x86_thiscallcc void @"\01??1C@test4@@UAE@XZ"(%"struct.test4::C"* %this) + + // In this case "this" points to the most derived class, so no GEPs needed. + // CHECK-NOT: getelementptr + // CHECK-NOT: bitcast + // CHECK: %[[VFPTR_i8:.*]] = bitcast %"struct.test4::C"* %{{.*}} to [1 x i8*]** + // CHECK: store [1 x i8*]* @"\01??_7C@test4@@6BB@1@@", [1 x i8*]** %[[VFPTR_i8]] + + foo(this); +} + +void destroy(C *obj) { + // CHECK-LABEL: define void @"\01?destroy@test4@@YAXPAUC@1@@Z"(%"struct.test4::C"* %obj) + + delete obj; + // CHECK: %[[VPTR:.*]] = bitcast %"struct.test4::C"* %[[OBJ:.*]] to void (%"struct.test4::C"*, i32)*** + // CHECK: %[[VFTABLE:.*]] = load void (%"struct.test4::C"*, i32)*** %[[VPTR]] + // CHECK: %[[VFTENTRY:.*]] = getelementptr inbounds void (%"struct.test4::C"*, i32)** %[[VFTABLE]], i64 0 + // CHECK: %[[VFUN:.*]] = load void (%"struct.test4::C"*, i32)** %[[VFTENTRY]] + // CHECK: call x86_thiscallcc void %[[VFUN]](%"struct.test4::C"* %[[OBJ]], i32 1) +} + +} |