diff options
author | Hans Wennborg <hans@hanshq.net> | 2013-12-17 17:49:22 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2013-12-17 17:49:22 +0000 |
commit | e955e3998ffccf7d4f8cca3370f04a35e5ab3d8b (patch) | |
tree | 3facf22b6a2ee118ddc168b1e77e73f2eab0944f /clang/lib/Sema/SemaDeclCXX.cpp | |
parent | b4c44d239c95f81777403fd89f39cb7b415c7f48 (diff) | |
download | bcm5719-llvm-e955e3998ffccf7d4f8cca3370f04a35e5ab3d8b.tar.gz bcm5719-llvm-e955e3998ffccf7d4f8cca3370f04a35e5ab3d8b.zip |
[ms-cxxabi] Don't do destructor check on declarations if the dtor is deleted
We would previously emit redundant diagnostics for the following code:
struct S {
virtual ~S() = delete;
void operator delete(void*, int);
void operator delete(void*, double);
} s;
First we would check on ~S() and error about the ambigous delete functions,
and then we would error about using the deleted destructor.
If the destructor is deleted, there's no need to check it.
Also, move the check from Sema::ActOnFields to CheckCompleteCXXClass. These
are run at almost the same time, called from ActOnFinishCXXMemberSpecification.
However, CHeckCompleteCXXClass may mark a defaulted destructor as deleted, and
if that's the case we don't want to check it.
Differential Revision: http://llvm-reviews.chandlerc.com/D2421
llvm-svn: 197509
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 76623a90d56..117c37b636e 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -4469,6 +4469,15 @@ 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 |