diff options
author | Anders Carlsson <andersca@mac.com> | 2009-04-17 02:34:54 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-04-17 02:34:54 +0000 |
commit | 072abefcddea5fb65e435cea60921b3c21c1279d (patch) | |
tree | ccbbe619641b2fb59dd63d8bf4667eee5b349308 /lib/Sema/SemaDeclCXX.cpp | |
parent | 27ae53665f8b00fe4ba21da0fa79a4ce6e0b6cd5 (diff) |
Add support for the __has_trivial_destructor type trait.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69345 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index e3195a9b28..9fd62269f2 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -380,6 +380,12 @@ Sema::CheckBaseSpecifier(CXXRecordDecl *Class, Class->setHasTrivialConstructor(cast<CXXRecordDecl>(BaseDecl)-> hasTrivialConstructor()); } + + // C++ [class.ctor]p3: + // A destructor is trivial if all the direct base classes of its class + // have trivial destructors. + Class->setHasTrivialDestructor(cast<CXXRecordDecl>(BaseDecl)-> + hasTrivialDestructor()); // Create the base specifier. // FIXME: Allocate via ASTContext? @@ -952,7 +958,7 @@ void Sema::ActOnFinishCXXMemberSpecification(Scope* S, SourceLocation RLoc, if (RD->isAbstract()) AbstractClassUsageDiagnoser(*this, RD); - if (RD->hasTrivialConstructor()) { + if (RD->hasTrivialConstructor() || RD->hasTrivialDestructor()) { for (RecordDecl::field_iterator i = RD->field_begin(Context), e = RD->field_end(Context); i != e; ++i) { // All the nonstatic data members must have trivial constructors. @@ -962,10 +968,16 @@ void Sema::ActOnFinishCXXMemberSpecification(Scope* S, SourceLocation RLoc, if (const RecordType *RT = FTy->getAsRecordType()) { CXXRecordDecl *FieldRD = cast<CXXRecordDecl>(RT->getDecl()); - if (!FieldRD->hasTrivialConstructor()) { + + if (!FieldRD->hasTrivialConstructor()) RD->setHasTrivialConstructor(false); + if (!FieldRD->hasTrivialDestructor()) + RD->setHasTrivialDestructor(false); + + // If RD has neither a trivial constructor nor a trivial destructor + // we don't need to continue checking. + if (!RD->hasTrivialConstructor() && !RD->hasTrivialDestructor()) break; - } } } } |