forked from OSchip/llvm-project
Don't waste memory if the initializer expression is empty.
llvm-svn: 130420
This commit is contained in:
parent
33d87d97f6
commit
fddbcfbec4
|
@ -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>())
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue