diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-10-21 23:02:22 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-10-21 23:02:22 +0000 |
commit | d4590a5d5f3df292d8fd9c554f308ecfb48e3c91 (patch) | |
tree | 01634842b040c58f3d352a01574830e112bba32f /clang | |
parent | 43114f90844c5a502315f48331ffdb61f6971db9 (diff) | |
download | bcm5719-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.h | 4 | ||||
-rw-r--r-- | clang/lib/AST/Expr.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 5 |
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); } } |