diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-04-28 18:53:55 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-04-28 18:53:55 +0000 |
| commit | fddbcfbec48f3e077baf5b925729001c4c222c4a (patch) | |
| tree | ed83a6e7023c82def1e302d698efe8c1713fc561 | |
| parent | 33d87d97f639a5306ffd6abfa8d556159bea208e (diff) | |
| download | bcm5719-llvm-fddbcfbec48f3e077baf5b925729001c4c222c4a.tar.gz bcm5719-llvm-fddbcfbec48f3e077baf5b925729001c4c222c4a.zip | |
Don't waste memory if the initializer expression is empty.
llvm-svn: 130420
| -rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 12 | ||||
| -rw-r--r-- | clang/test/Index/initializer-memory.cpp | 2 |
2 files changed, 10 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 0cf75464668..938ace851e6 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -1795,11 +1795,15 @@ InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, // Pre-allocate storage for the structured initializer list. unsigned NumElements = 0; unsigned NumInits = 0; - if (!StructuredList) + bool GotNumInits = false; + if (!StructuredList) { NumInits = IList->getNumInits(); - else if (Index < IList->getNumInits()) { - if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) + GotNumInits = true; + } else if (Index < IList->getNumInits()) { + if (InitListExpr *SubList = dyn_cast<InitListExpr>(IList->getInit(Index))) { NumInits = SubList->getNumInits(); + GotNumInits = true; + } } if (const ArrayType *AType @@ -1808,7 +1812,7 @@ InitListChecker::getStructuredSubobjectInit(InitListExpr *IList, unsigned Index, NumElements = CAType->getSize().getZExtValue(); // Simple heuristic so that we don't allocate a very large // initializer with many empty entries at the end. - if (NumInits && NumElements > NumInits) + if (GotNumInits && NumElements > NumInits) NumElements = 0; } } else if (const VectorType *VType = CurrentObjectType->getAs<VectorType>()) diff --git a/clang/test/Index/initializer-memory.cpp b/clang/test/Index/initializer-memory.cpp index d0f531fdd2f..f085c356243 100644 --- a/clang/test/Index/initializer-memory.cpp +++ b/clang/test/Index/initializer-memory.cpp @@ -3,6 +3,7 @@ // rdar://9275920 - We would create millions of Exprs to fill out the initializer. double data[1000000] = {0}; +double data_empty_init[1000000] = {}; struct S { S(int); @@ -10,5 +11,6 @@ struct S { }; S data2[1000000] = {0}; +S data_empty_init2[1000000] = {}; // CHECK: TOTAL = {{.*}} (0.{{.*}} MBytes) |

