summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-10-21 23:02:22 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-10-21 23:02:22 +0000
commitd4590a5d5f3df292d8fd9c554f308ecfb48e3c91 (patch)
tree01634842b040c58f3d352a01574830e112bba32f /clang
parent43114f90844c5a502315f48331ffdb61f6971db9 (diff)
downloadbcm5719-llvm-d4590a5d5f3df292d8fd9c554f308ecfb48e3c91.tar.gz
bcm5719-llvm-d4590a5d5f3df292d8fd9c554f308ecfb48e3c91.zip
Don't try to set the "array filler" in a InitListExpr twice.
llvm-svn: 142695
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/AST/Expr.h4
-rw-r--r--clang/lib/AST/Expr.cpp1
-rw-r--r--clang/lib/Sema/SemaInit.cpp5
3 files changed, 8 insertions, 2 deletions
diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h
index 9dda1e72dab..e7b1a0593ff 100644
--- a/clang/include/clang/AST/Expr.h
+++ b/clang/include/clang/AST/Expr.h
@@ -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.
///
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 427c331ed04..96a8125e18a 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -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();
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp
index 454a4016652..59901cb11b0 100644
--- a/clang/lib/Sema/SemaInit.cpp
+++ b/clang/lib/Sema/SemaInit.cpp
@@ -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);
}
}
OpenPOWER on IntegriCloud