]> granicus.if.org Git - clang/commitdiff
Use the ArrayFiller to fill out "holes" in the array initializer due to designated...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 21 Apr 2011 20:03:38 +0000 (20:03 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 21 Apr 2011 20:03:38 +0000 (20:03 +0000)
avoiding to create separate Exprs for each one.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@129933 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
lib/AST/Expr.cpp
lib/Sema/SemaInit.cpp

index 74204082264c6cc8cabadf819213aeb7db6787be..d8d006440c9971c8bb77e14846ec5b7657305d69 100644 (file)
@@ -3246,9 +3246,7 @@ public:
   Expr *getArrayFiller() {
     return ArrayFillerOrUnionFieldInit.dyn_cast<Expr *>();
   }
-  void setArrayFiller(Expr *filler) {
-    ArrayFillerOrUnionFieldInit = filler;
-  }
+  void setArrayFiller(Expr *filler);
 
   /// \brief If this initializes a union, specifies which field in the
   /// union to initialize.
index 9b978e843958b66ca8671257e0014a729361ca9b..dd1a317f4a17be0ddfb8928427b7a3790ad73091 100644 (file)
@@ -1289,6 +1289,15 @@ Expr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
   return Result;
 }
 
+void InitListExpr::setArrayFiller(Expr *filler) {
+  ArrayFillerOrUnionFieldInit = filler;
+  // Fill out any "holes" in the array due to designated initializers.
+  Expr **inits = getInits();
+  for (unsigned i = 0, e = getNumInits(); i != e; ++i)
+    if (inits[i] == 0)
+      inits[i] = filler;
+}
+
 SourceRange InitListExpr::getSourceRange() const {
   if (SyntacticForm)
     return SyntacticForm->getSourceRange();
index 307db14b58824f70e0a68ae5e69341ad77464406..2acb482c41e3ad979299614ad9ff811202c6c19b 100644 (file)
@@ -404,7 +404,12 @@ InitListChecker::FillInValueInitializations(const InitializedEntity &Entity,
       if (hadError) {
         // Do nothing
       } else if (Init < NumInits) {
-        ILE->setInit(Init, ElementInit.takeAs<Expr>());
+        // For arrays, just set the expression used for value-initialization
+        // of the "holes" in the array.
+        if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement)
+          ILE->setArrayFiller(ElementInit.takeAs<Expr>());
+        else
+          ILE->setInit(Init, ElementInit.takeAs<Expr>());
       } else {
         // For arrays, just set the expression used for value-initialization
         // of the rest of elements and exit.