summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-04-16 00:08:20 +0000
committerAnders Carlsson <andersca@mac.com>2009-04-16 00:08:20 +0000
commitfe63dc52f9f8f4a39222a541670d4aff326c45ad (patch)
tree94fa3f48fec002d032ed66395bf7df084adca814 /clang/lib/AST
parenta3c5590ec21c6c872ee366e4d2d6058607d5bfdc (diff)
downloadbcm5719-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.cpp6
-rw-r--r--clang/lib/AST/ExprCXX.cpp4
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;
}
}
OpenPOWER on IntegriCloud