summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Tolksdorf <st@quanttec.com>2014-03-27 20:23:12 +0000
committerStephan Tolksdorf <st@quanttec.com>2014-03-27 20:23:12 +0000
commitd85fa23ad15a946072d0ffc14e68fa09a3509e8a (patch)
tree3ec2035427771c86ad10e85911acd6eabdbe52f4
parent9cac6f5f04b9f4aabcf3c058d3e454e491c83449 (diff)
downloadbcm5719-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.cpp11
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;
OpenPOWER on IntegriCloud