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