diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-04-16 00:08:20 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-04-16 00:08:20 +0000 |
| commit | fe63dc52f9f8f4a39222a541670d4aff326c45ad (patch) | |
| tree | 94fa3f48fec002d032ed66395bf7df084adca814 /clang/lib/AST | |
| parent | a3c5590ec21c6c872ee366e4d2d6058607d5bfdc (diff) | |
| download | bcm5719-llvm-fe63dc52f9f8f4a39222a541670d4aff326c45ad.tar.gz bcm5719-llvm-fe63dc52f9f8f4a39222a541670d4aff326c45ad.zip | |
Add support for the __has_trivial_constructor type trait.
llvm-svn: 69245
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 4 |
2 files changed, 10 insertions, 0 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index ffc35fe1f74..78ed3fcf4d7 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -29,6 +29,7 @@ CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, DeclContext *DC, UserDeclaredConstructor(false), UserDeclaredCopyConstructor(false), UserDeclaredCopyAssignment(false), UserDeclaredDestructor(false), Aggregate(true), PlainOldData(true), Polymorphic(false), Abstract(false), + HasTrivialConstructor(true), Bases(0), NumBases(0), Conversions(DC, DeclarationName()), TemplateOrInstantiation() { } @@ -138,6 +139,11 @@ CXXRecordDecl::addedConstructor(ASTContext &Context, // A POD-struct is an aggregate class [...] PlainOldData = false; + // C++ [class.ctor]p5: + // A constructor is trivial if it is an implicitly-declared default + // constructor. + HasTrivialConstructor = false; + // Note when we have a user-declared copy constructor, which will // suppress the implicit declaration of a copy constructor. if (ConDecl->isCopyConstructor(Context)) diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index c2fcc5f9ee4..3634c203566 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/lib/AST/ExprCXX.cpp @@ -170,6 +170,10 @@ bool UnaryTypeTraitExpr::EvaluateTrait() const { if (const RecordType *RT = QueriedType->getAsRecordType()) return cast<CXXRecordDecl>(RT->getDecl())->isAbstract(); return false; + case UTT_HasTrivialConstructor: + if (const RecordType *RT = QueriedType->getAsRecordType()) + return cast<CXXRecordDecl>(RT->getDecl())->hasTrivialConstructor(); + return false; } } |

