// 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* {{[^,]*}} %{{.*}})