aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-02-20 02:36:22 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-02-20 02:36:22 +0000
commit1f4a6db271f389d6ab3cb1bc28cb5c23a7828602 (patch)
tree09d9241a562173b4d4318f749bf0bc78b52f2235
parent8d1d62f6b5bb1a31210e56bcd85c12b65dff1149 (diff)
A few small tweaks to isConstantInitializer. (No test because this
isn't getting used by Sema or CodeGen at the moment...) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65107 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AST/Expr.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index d9db133385..b613492f14 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -794,15 +794,24 @@ bool Expr::isConstantInitializer(ASTContext &Ctx) const {
// expressions, and it can't deal with aggregates; we deal with those here,
// and fall back to isEvaluatable for the other cases.
+ // FIXME: This function assumes the variable being assigned to
+ // isn't a reference type!
+
switch (getStmtClass()) {
default: break;
case StringLiteralClass:
return true;
case CompoundLiteralExprClass: {
+ // This handles gcc's extension that allows global initializers like
+ // "struct x {int x;} x = (struct x) {};".
+ // FIXME: This accepts other cases it shouldn't!
const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer();
return Exp->isConstantInitializer(Ctx);
}
case InitListExprClass: {
+ // FIXME: This doesn't deal with fields with reference types correctly.
+ // FIXME: This incorrectly allows pointers cast to integers to be assigned
+ // to bitfields.
const InitListExpr *Exp = cast<InitListExpr>(this);
unsigned numInits = Exp->getNumInits();
for (unsigned i = 0; i < numInits; i++) {
@@ -829,9 +838,6 @@ bool Expr::isConstantInitializer(ASTContext &Ctx) const {
if (getType()->isRecordType())
return cast<CastExpr>(this)->getSubExpr()->isConstantInitializer(Ctx);
break;
- case DesignatedInitExprClass:
- return cast<DesignatedInitExpr>(this)->
- getInit()->isConstantInitializer(Ctx);
}
return isEvaluatable(Ctx);