// RUN: %clang_cc1 -emit-llvm -fms-extensions %s -triple=x86_64-pc-windows-msvc -o - | FileCheck %s // Test that vector deleting destructors are emitted when new[] is used, // even when the destructor definition is in another translation unit. struct ForwardDeclared { ForwardDeclared(); virtual ~ForwardDeclared(); }; struct DefinedInTU { virtual ~DefinedInTU(); }; struct NonVirtualDtor { ~NonVirtualDtor(); }; struct NoDtor { virtual void foo(); int x; }; struct DeclDerived : ForwardDeclared { ~DeclDerived() override; }; struct InlineDefaulted { virtual ~InlineDefaulted() = default; }; struct OutOfLineDefaulted { virtual ~OutOfLineDefaulted(); }; OutOfLineDefaulted::~OutOfLineDefaulted() = default; template struct Container { T data; virtual ~Container(); }; extern template class Container; Container *arr = new Container[5]; struct ImplicitVDtorDerived : ForwardDeclared{ int data; }; struct __declspec(dllimport) DllImported { virtual ~DllImported(); }; struct VirtualDerived : virtual ForwardDeclared { ~VirtualDerived() override; }; struct DeclaredCtorDefinedDtor { DeclaredCtorDefinedDtor(); virtual ~DeclaredCtorDefinedDtor() {} }; struct TemplateNotAllocated { TemplateNotAllocated(); virtual ~TemplateNotAllocated(); }; struct TemplateAllocated { TemplateAllocated(); virtual ~TemplateAllocated(); }; template void allocate() { TemplateNotAllocated *arr = new TemplateNotAllocated[T]; } template void actuallyAllocate() { T *arr = new T[10]; delete[] arr; } void cases() { ForwardDeclared *arr = new ForwardDeclared[5]; DefinedInTU *arr1 = new DefinedInTU[5]; NonVirtualDtor *arr2 = new NonVirtualDtor[5]; NoDtor *arr3 = new NoDtor[5]; ForwardDeclared *arr4 = new DeclDerived[5]; InlineDefaulted *arr5 = new InlineDefaulted[5]; OutOfLineDefaulted *arr6 = new OutOfLineDefaulted[5]; ImplicitVDtorDerived *arr7 = new ImplicitVDtorDerived[5]; DllImported *arr8 = new DllImported[5]; VirtualDerived *arr9 = new VirtualDerived[3]; DeclaredCtorDefinedDtor *arr10 = new DeclaredCtorDefinedDtor[5]; actuallyAllocate(); } // CHECK-DAG: declare dso_local void @"??1ForwardDeclared@@UEAA@XZ"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EForwardDeclared@@UEAAPEAXI@Z"( // CHECK-DAG: define dso_local void @"??1DefinedInTU@@UEAA@XZ"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EDefinedInTU@@UEAAPEAXI@Z"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EDeclDerived@@UEAAPEAXI@Z"( // CHECK-DAG: declare dso_local void @"??1DeclDerived@@UEAA@XZ"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EInlineDefaulted@@UEAAPEAXI@Z"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EOutOfLineDefaulted@@UEAAPEAXI@Z"( // CHECK-DAG: declare dso_local void @"??1?$Container@H@@UEAA@XZ"( // CHECK-DAG: define weak dso_local noundef ptr @"??_E?$Container@H@@UEAAPEAXI@Z"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EImplicitVDtorDerived@@UEAAPEAXI@Z"( // CHECK-DAG: declare dllimport void @"??1DllImported@@UEAA@XZ"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EDllImported@@UEAAPEAXI@Z"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EVirtualDerived@@UEAAPEAXI@Z"( // CHECK-DAG: define weak dso_local noundef ptr @"??_EDeclaredCtorDefinedDtor@@UEAAPEAXI@Z"( // CHECK-DAG: declare dso_local void @"??1TemplateAllocated@@UEAA@XZ"( // CHECK-DAG: define weak dso_local noundef ptr @"??_ETemplateAllocated@@UEAAPEAXI@Z"( // CHECK-NOT: @"??_ETemplateNotAllocated@@ // CHECK-NOT: @"??_ENonVirtualDtor@@ // CHECK-NOT: @"??_ENoDtor@@ DefinedInTU::~DefinedInTU() {}