diff options
Diffstat (limited to 'clang')
-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) |