]> granicus.if.org Git - clang/commitdiff
Don't waste memory if the initializer expression is empty.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 28 Apr 2011 18:53:55 +0000 (18:53 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Thu, 28 Apr 2011 18:53:55 +0000 (18:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130420 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaInit.cpp
test/Index/initializer-memory.cpp

index 0cf75464668b40d4c6c2281323334f51f49933d0..938ace851e62a67622f6fd69f3f958661205ed3e 100644 (file)
@@ -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>())
index d0f531fdd2f476e99f2a299254807456abd59fa2..f085c3562438b53c748dfd22cd25e32843cc2f36 100644 (file)
@@ -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)