Make sure CheckDestructor gets called on dllimported classes if the vtable is used (PR27319)
llvm-svn: 266242
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 995378c..40be8d6 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -13314,13 +13314,20 @@
// the deleting destructor is emitted with the vtable, not with the
// destructor definition as in the Itanium ABI.
// If it has a definition, we do the check at that point instead.
- if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
- Class->hasUserDeclaredDestructor() &&
- !Class->getDestructor()->isDefined() &&
- !Class->getDestructor()->isDeleted()) {
- CXXDestructorDecl *DD = Class->getDestructor();
- ContextRAII SavedContext(*this, DD);
- CheckDestructor(DD);
+ if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
+ if (Class->hasUserDeclaredDestructor() &&
+ !Class->getDestructor()->isDefined() &&
+ !Class->getDestructor()->isDeleted()) {
+ CXXDestructorDecl *DD = Class->getDestructor();
+ ContextRAII SavedContext(*this, DD);
+ CheckDestructor(DD);
+ } else if (Class->hasAttr<DLLImportAttr>()) {
+ // We always synthesize vtables on the import side. To make sure
+ // CheckDestructor gets called, mark the destructor referenced.
+ assert(Class->getDestructor() &&
+ "The destructor has always been declared on a dllimport class");
+ MarkFunctionReferenced(Loc, Class->getDestructor());
+ }
}
}