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
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index f91c3d6..a36a83b 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -1358,6 +1358,20 @@
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 @@
return true;
break;
}
+ case CXXStaticCastExprClass:
case ImplicitCastExprClass:
case CStyleCastExprClass:
// Handle casts with a destination that's a struct or union; this