]> granicus.if.org Git - clang/commitdiff
A few small tweaks to isConstantInitializer. (No test because this
authorEli Friedman <eli.friedman@gmail.com>
Fri, 20 Feb 2009 02:36:22 +0000 (02:36 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 20 Feb 2009 02:36:22 +0000 (02:36 +0000)
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

lib/AST/Expr.cpp

index d9db13338530e5cab4259ef3872cee3def9ae7af..b613492f1453c070cde5cddc5aa5b6a1af418522 100644 (file)
@@ -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);