Extend InitListExpr API/IMPL to support arbitrary add/remove (in support of the initializer rewrite I am doing).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50511 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 264ef7b..67e39b6 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -254,14 +254,11 @@
 InitListExpr::InitListExpr(SourceLocation lbraceloc, 
                            Expr **initexprs, unsigned numinits,
                            SourceLocation rbraceloc)
-  : Expr(InitListExprClass, QualType())
-  , NumInits(numinits)
-  , LBraceLoc(lbraceloc)
-  , RBraceLoc(rbraceloc)
+  : Expr(InitListExprClass, QualType()),
+    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc)
 {
-  InitExprs = new Expr*[numinits];
   for (unsigned i = 0; i != numinits; i++)
-    InitExprs[i] = initexprs[i];
+    InitExprs.push_back(initexprs[i]);
 }
 
 //===----------------------------------------------------------------------===//
@@ -1368,7 +1365,7 @@
   return reinterpret_cast<Stmt**>(&InitExprs[0]);
 }
 Stmt::child_iterator InitListExpr::child_end() {
-  return reinterpret_cast<Stmt**>(&InitExprs[NumInits]);
+  return reinterpret_cast<Stmt**>(&InitExprs[getNumInits()]);
 }
 
 // ObjCStringLiteral
diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp
index 7058c0c..3bec743 100644
--- a/lib/AST/StmtSerialization.cpp
+++ b/lib/AST/StmtSerialization.cpp
@@ -647,18 +647,20 @@
 void InitListExpr::EmitImpl(Serializer& S) const {
   S.Emit(LBraceLoc);
   S.Emit(RBraceLoc);
-  S.EmitInt(NumInits);
-  S.BatchEmitOwnedPtrs(NumInits,InitExprs);
+  S.EmitInt(InitExprs.size());
+  if (!InitExprs.empty()) S.BatchEmitOwnedPtrs(InitExprs.size(), &InitExprs[0]);
 }
 
 InitListExpr* InitListExpr::CreateImpl(Deserializer& D, ASTContext& C) {
   InitListExpr* expr = new InitListExpr();
   expr->LBraceLoc = SourceLocation::ReadVal(D);
   expr->RBraceLoc = SourceLocation::ReadVal(D);
-  expr->NumInits = D.ReadInt();
-  assert(expr->NumInits);
-  expr->InitExprs = new Expr*[expr->NumInits];
-  D.BatchReadOwnedPtrs(expr->NumInits, expr->InitExprs, C);
+  unsigned size = D.ReadInt();
+  assert(size);
+  expr->InitExprs.reserve(size);
+  for (unsigned i = 0 ; i < size; ++i) expr->InitExprs.push_back(0);
+
+  D.BatchReadOwnedPtrs(size, &expr->InitExprs[0], C);
   return expr;
 }