diff options
author | Stephan Tolksdorf <st@quanttec.com> | 2014-03-27 20:23:12 +0000 |
---|---|---|
committer | Stephan Tolksdorf <st@quanttec.com> | 2014-03-27 20:23:12 +0000 |
commit | d85fa23ad15a946072d0ffc14e68fa09a3509e8a (patch) | |
tree | 3ec2035427771c86ad10e85911acd6eabdbe52f4 | |
parent | 9cac6f5f04b9f4aabcf3c058d3e454e491c83449 (diff) | |
download | bcm5719-llvm-d85fa23ad15a946072d0ffc14e68fa09a3509e8a.tar.gz bcm5719-llvm-d85fa23ad15a946072d0ffc14e68fa09a3509e8a.zip |
Recognize simple cases of trivial explicitly defaulted public dtors as irrelevant
Reviewed in http://llvm-reviews.chandlerc.com/D3190
llvm-svn: 204953
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index d9208abc2da..d0ec4b9fe5a 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -527,8 +527,11 @@ void CXXRecordDecl::addedMember(Decl *D) { if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) { SMKind |= SMF_Destructor; - if (!DD->isImplicit()) + if (DD->isUserProvided()) data().HasIrrelevantDestructor = false; + // If the destructor is explicitly defaulted and not trivial or not public + // or if the destructor is deleted, we clear HasIrrelevantDestructor in + // finishedDefaultedOrDeletedMember. // C++11 [class.dtor]p5: // A destructor is trivial if [...] the destructor is not virtual. @@ -936,9 +939,11 @@ void CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) { else if (Constructor->isConstexpr()) // We may now know that the constructor is constexpr. data().HasConstexprNonCopyMoveConstructor = true; - } else if (isa<CXXDestructorDecl>(D)) + } else if (isa<CXXDestructorDecl>(D)) { SMKind |= SMF_Destructor; - else if (D->isCopyAssignmentOperator()) + if (!D->isTrivial() || D->getAccess() != AS_public || D->isDeleted()) + data().HasIrrelevantDestructor = false; + } else if (D->isCopyAssignmentOperator()) SMKind |= SMF_CopyAssignment; else if (D->isMoveAssignmentOperator()) SMKind |= SMF_MoveAssignment; |