In the MS C++ ABI, the complete destructor variant for a class with virtual bases is emitted whereever it is needed, instead of directly alongside the base destructor variant. The complete destructor calls the base destructor of the current class and the base destructors of each virtual base. In order for this to work reliably, translation units that use the destructor of a class also need to mark destructors of virtual bases of that class used. Fixes PR38521 Reviewed By: rsmith Differential Revision: https://reviews.llvm.org/D77081
26 lines
1.1 KiB
C++
26 lines
1.1 KiB
C++
// RUN: %clang_cc1 -std=c++17 -emit-llvm %s -triple x86_64-windows-msvc -o - | FileCheck %s
|
|
|
|
// Make sure virtual base base destructors get referenced and emitted if
|
|
// necessary when the complete ("vbase") destructor is emitted. In this case,
|
|
// clang previously did not emit ~DefaultedDtor.
|
|
struct HasDtor { ~HasDtor(); };
|
|
struct DefaultedDtor {
|
|
~DefaultedDtor() = default;
|
|
HasDtor o;
|
|
};
|
|
struct HasCompleteDtor : virtual DefaultedDtor {
|
|
~HasCompleteDtor();
|
|
};
|
|
void useCompleteDtor(HasCompleteDtor *p) { delete p; }
|
|
|
|
// CHECK-LABEL: define dso_local void @"?useCompleteDtor@@YAXPEAUHasCompleteDtor@@@Z"(%struct.HasCompleteDtor* %p)
|
|
// CHECK: call void @"??_DHasCompleteDtor@@QEAAXXZ"({{.*}})
|
|
|
|
// CHECK-LABEL: define linkonce_odr dso_local void @"??_DHasCompleteDtor@@QEAAXXZ"(%struct.HasCompleteDtor* %this)
|
|
// CHECK: call void @"??1HasCompleteDtor@@QEAA@XZ"({{.*}})
|
|
// CHECK: call void @"??1DefaultedDtor@@QEAA@XZ"({{.*}})
|
|
|
|
// CHECK-LABEL: define linkonce_odr dso_local void @"??1DefaultedDtor@@QEAA@XZ"(%struct.DefaultedDtor* %this)
|
|
// CHECK: call void @"??1HasDtor@@QEAA@XZ"(%struct.HasDtor* %{{.*}})
|
|
|