]> granicus.if.org Git - clang/commitdiff
Don't try to set the "array filler" in a InitListExpr twice.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 21 Oct 2011 23:02:22 +0000 (23:02 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 21 Oct 2011 23:02:22 +0000 (23:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@142695 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 9dda1e72dabae347bdd3cbbd1e638e1cc6b1d4f6..e7b1a0593ffe9f59ddda6beb56ec4aaa1a779252 100644 (file)
@@ -3400,6 +3400,10 @@ public:
   }
   void setArrayFiller(Expr *filler);
 
+  /// \brief Return true if this is an array initializer and its array "filler"
+  /// has been set.
+  bool hasArrayFiller() const { return getArrayFiller(); }
+
   /// \brief If this initializes a union, specifies which field in the
   /// union to initialize.
   ///
index 427c331ed04bd46a0e142ca769e8905e77d398c6..96a8125e18a4f1303730e8683610f3185b609a3c 100644 (file)
@@ -1394,6 +1394,7 @@ Expr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
 }
 
 void InitListExpr::setArrayFiller(Expr *filler) {
+  assert(!hasArrayFiller() && "Filler already set!");
   ArrayFillerOrUnionFieldInit = filler;
   // Fill out any "holes" in the array due to designated initializers.
   Expr **inits = getInits();
index 454a40166528108c28a9a3d306278896c48dbd72..59901cb11b02bedfda92b9a74624e979203bc102 100644 (file)
@@ -416,7 +416,8 @@ InitListChecker::FillInValueInitializations(const InitializedEntity &Entity,
         ElementEntity.getKind() == InitializedEntity::EK_VectorElement)
       ElementEntity.setElementIndex(Init);
 
-    if (Init >= NumInits || !ILE->getInit(Init)) {
+    Expr *InitExpr = (Init < NumInits ? ILE->getInit(Init) : 0);
+    if (!InitExpr && !ILE->hasArrayFiller()) {
       InitializationKind Kind = InitializationKind::CreateValue(Loc, Loc, Loc,
                                                                 true);
       InitializationSequence InitSeq(SemaRef, ElementEntity, Kind, 0, 0);
@@ -460,7 +461,7 @@ InitListChecker::FillInValueInitializations(const InitializedEntity &Entity,
         }
       }
     } else if (InitListExpr *InnerILE
-                 = dyn_cast<InitListExpr>(ILE->getInit(Init)))
+                 = dyn_cast_or_null<InitListExpr>(InitExpr))
       FillInValueInitializations(ElementEntity, InnerILE, RequiresSecondPass);
   }
 }