diff options
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index d98a01d33fa..210ad28acac 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -4479,15 +4479,6 @@ void Sema::CheckCompletedCXXClass(CXXRecordDecl *Record) { } } } - - if (Record->hasUserDeclaredDestructor()) { - // The Microsoft ABI requires that we perform the destructor body - // checks (i.e. operator delete() lookup) in any translataion unit, as - // any translation unit may need to emit a deleting destructor. - if (Context.getTargetInfo().getCXXABI().isMicrosoft() && - !Record->getDestructor()->isDeleted()) - CheckDestructor(Record->getDestructor()); - } } // C++11 [dcl.constexpr]p8: A constexpr specifier for a non-static member @@ -12345,6 +12336,18 @@ void Sema::MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, // Otherwise, we can early exit. return; } + } else { + // The Microsoft ABI requires that we perform the destructor body + // checks (i.e. operator delete() lookup) when the vtable is marked used, as + // 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()) { + CheckDestructor(Class->getDestructor()); + } } // Local classes need to have their virtual members marked |

