summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-04-28 18:53:55 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-04-28 18:53:55 +0000
commitfddbcfbec48f3e077baf5b925729001c4c222c4a (patch)
treeed83a6e7023c82def1e302d698efe8c1713fc561
parent33d87d97f639a5306ffd6abfa8d556159bea208e (diff)
downloadbcm5719-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.cpp12
-rw-r--r--clang/test/Index/initializer-memory.cpp2
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)
OpenPOWER on IntegriCloud