aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/Expr.cpp
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-08-01 21:51:45 +0000
committerJohn McCall <rjmccall@apple.com>2010-08-01 21:51:45 +0000
commitb4b9b15c597a923a03ad0a33cdc49b67e5cc4450 (patch)
tree953044712bdb5e7d65a55208989e9be5e2823579 /lib/AST/Expr.cpp
parent626e96e2874698a6736fd33672fa9c28da91d77e (diff)
Kill off RequiresGlobalConstructor in favor of isConstantInitializer.
Note some obvious false positives in the test case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109986 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/AST/Expr.cpp')
-rw-r--r--lib/AST/Expr.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index f91c3d6ba1..a36a83ba99 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -1358,6 +1358,20 @@ bool Expr::isConstantInitializer(ASTContext &Ctx) const {
case ObjCStringLiteralClass:
case ObjCEncodeExprClass:
return true;
+ case CXXTemporaryObjectExprClass:
+ case CXXConstructExprClass: {
+ const CXXConstructExpr *CE = cast<CXXConstructExpr>(this);
+ if (!CE->getConstructor()->isTrivial()) return false;
+ for (CXXConstructExpr::const_arg_iterator
+ I = CE->arg_begin(), E = CE->arg_end(); I != E; ++I)
+ if (!(*I)->isConstantInitializer(Ctx))
+ return false;
+ return true;
+ }
+ case CXXBindReferenceExprClass: {
+ const CXXBindReferenceExpr *RE = cast<CXXBindReferenceExpr>(this);
+ return RE->getSubExpr()->isConstantInitializer(Ctx);
+ }
case CompoundLiteralExprClass: {
// This handles gcc's extension that allows global initializers like
// "struct x {int x;} x = (struct x) {};".
@@ -1397,6 +1411,7 @@ bool Expr::isConstantInitializer(ASTContext &Ctx) const {
return true;
break;
}
+ case CXXStaticCastExprClass:
case ImplicitCastExprClass:
case CStyleCastExprClass:
// Handle casts with a destination that's a struct or union; this