diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-04-21 00:27:41 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-04-21 00:27:41 +0000 |
| commit | b2ed28ea4b61f359354b2f62c44177f77b55bc9d (patch) | |
| tree | d92ce2acee6a2910008e26c3eacf43df5cbdc4cd /clang/lib/Sema/SemaInit.cpp | |
| parent | 21b2b7db76cff2f4d276a66050357c15e41e1e08 (diff) | |
| download | bcm5719-llvm-b2ed28ea4b61f359354b2f62c44177f77b55bc9d.tar.gz bcm5719-llvm-b2ed28ea4b61f359354b2f62c44177f77b55bc9d.zip | |
For
double data[20000000] = {0};
we would blow out the memory by creating 20M Exprs to fill out the initializer.
To fix this, if the initializer list initializes an array with more elements than
there are initializers in the list, have InitListExpr store a single 'ArrayFiller' expression
that specifies an expression to be used for value initialization of the rest of the elements.
Fixes rdar://9275920.
llvm-svn: 129896
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 84ab23e584c..307db14b588 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -405,14 +405,23 @@ InitListChecker::FillInValueInitializations(const InitializedEntity &Entity, // Do nothing } else if (Init < NumInits) { ILE->setInit(Init, ElementInit.takeAs<Expr>()); - } else if (InitSeq.getKind() + } else { + // For arrays, just set the expression used for value-initialization + // of the rest of elements and exit. + if (ElementEntity.getKind() == InitializedEntity::EK_ArrayElement) { + ILE->setArrayFiller(ElementInit.takeAs<Expr>()); + return; + } + + if (InitSeq.getKind() == InitializationSequence::ConstructorInitialization) { - // Value-initialization requires a constructor call, so - // extend the initializer list to include the constructor - // call and make a note that we'll need to take another pass - // through the initializer list. - ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); - RequiresSecondPass = true; + // Value-initialization requires a constructor call, so + // extend the initializer list to include the constructor + // call and make a note that we'll need to take another pass + // through the initializer list. + ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>()); + RequiresSecondPass = true; + } } } else if (InitListExpr *InnerILE = dyn_cast<InitListExpr>(ILE->getInit(Init))) |

