diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index 58776f4..fac6506 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -713,75 +713,40 @@
   return OverOps[Opc];
 }
 
-InitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
+InitListExpr::InitListExpr(SourceLocation lbraceloc,
                            Expr **initExprs, unsigned numInits,
                            SourceLocation rbraceloc)
   : Expr(InitListExprClass, QualType(), false, false),
-    InitExprs(0), NumInits(numInits), Capacity(numInits),
     LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0),
-    UnionFieldInit(0), HadArrayRangeDesignator(false)
-{
-  if (NumInits == 0)
-    return;
-
-  InitExprs = new (C) Stmt*[Capacity];
-
-  for (unsigned I = 0; I != NumInits; ++I) {
-    Expr *Ex = initExprs[I];
-    if (Ex->isTypeDependent())
+    UnionFieldInit(0), HadArrayRangeDesignator(false) 
+{      
+  for (unsigned I = 0; I != numInits; ++I) {
+    if (initExprs[I]->isTypeDependent())
       TypeDependent = true;
-    if (Ex->isValueDependent())
+    if (initExprs[I]->isValueDependent())
       ValueDependent = true;
-    InitExprs[I] = Ex;
   }
+      
+  InitExprs.insert(InitExprs.end(), initExprs, initExprs+numInits);
 }
 
-void InitListExpr::DoDestroy(ASTContext &C) {
-  DestroyChildren(C);
-  if (InitExprs)
-    C.Deallocate(InitExprs);
-  this->~InitListExpr();
-  C.Deallocate((void*) this);
+void InitListExpr::reserveInits(unsigned NumInits) {
+  if (NumInits > InitExprs.size())
+    InitExprs.reserve(NumInits);
 }
 
-void InitListExpr::reserveInits(ASTContext &C, unsigned newCapacity) {
-  if (newCapacity > Capacity) {
-    if (!Capacity)
-      Capacity = newCapacity;
-    else if ((Capacity *= 2) < newCapacity)
-      Capacity = newCapacity;
-
-    Stmt **newInits = new (C) Stmt*[Capacity];
-    if (InitExprs) {
-      memcpy(newInits, InitExprs, NumInits * sizeof(*InitExprs));
-      C.Deallocate(InitExprs);
-    }
-    InitExprs = newInits;
-  }
+void InitListExpr::resizeInits(ASTContext &Context, unsigned NumInits) {
+  for (unsigned Idx = NumInits, LastIdx = InitExprs.size();
+       Idx < LastIdx; ++Idx)
+    InitExprs[Idx]->Destroy(Context);
+  InitExprs.resize(NumInits, 0);
 }
 
-void InitListExpr::resizeInits(ASTContext &C, unsigned N) {
-  // If the new number of expressions is less than the old one, destroy
-  // the expressions that are beyond the new size.
-  for (unsigned i = N, LastIdx = NumInits; i < LastIdx; ++i)
-    InitExprs[i]->Destroy(C);
-
-  // If we are expanding the number of expressions, reserve space.
-  reserveInits(C, N);
-
-  // If we are expanding the number of expressions, zero out beyond our
-  // current capacity.
-  for (unsigned i = NumInits; i < N; ++i)
-    InitExprs[i] = 0;
-
-  NumInits = N;
-}
-
-Expr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
-  if (Init >= NumInits) {
-    // Resize the number of initializers.  This will adjust the amount
-    // of memory allocated as well as zero-pad the initializers.
-    resizeInits(C, Init+1);
+Expr *InitListExpr::updateInit(unsigned Init, Expr *expr) {
+  if (Init >= InitExprs.size()) {
+    InitExprs.insert(InitExprs.end(), Init - InitExprs.size() + 1, 0);
+    InitExprs.back() = expr;
+    return 0;
   }
 
   Expr *Result = cast_or_null<Expr>(InitExprs[Init]);
@@ -2621,8 +2586,12 @@
 Stmt::child_iterator VAArgExpr::child_end() { return &Val+1; }
 
 // InitListExpr
-Stmt::child_iterator InitListExpr::child_begin() { return begin(); }
-Stmt::child_iterator InitListExpr::child_end() { return end(); }
+Stmt::child_iterator InitListExpr::child_begin() {
+  return InitExprs.size() ? &InitExprs[0] : 0;
+}
+Stmt::child_iterator InitListExpr::child_end() {
+  return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0;
+}
 
 // DesignatedInitExpr
 Stmt::child_iterator DesignatedInitExpr::child_begin() {
diff --git a/lib/Frontend/PCHReaderStmt.cpp b/lib/Frontend/PCHReaderStmt.cpp
index c69a5dc..d123694 100644
--- a/lib/Frontend/PCHReaderStmt.cpp
+++ b/lib/Frontend/PCHReaderStmt.cpp
@@ -554,9 +554,9 @@
 unsigned PCHStmtReader::VisitInitListExpr(InitListExpr *E) {
   VisitExpr(E);
   unsigned NumInits = Record[Idx++];
-  E->reserveInits(*Reader.getContext(), NumInits);
+  E->reserveInits(NumInits);
   for (unsigned I = 0; I != NumInits; ++I)
-    E->updateInit(*Reader.getContext(), I,
+    E->updateInit(I,
                   cast<Expr>(StmtStack[StmtStack.size() - NumInits - 1 + I]));
   E->setSyntacticForm(cast_or_null<InitListExpr>(StmtStack.back()));
   E->setLBraceLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
diff --git a/lib/Frontend/RewriteObjC.cpp b/lib/Frontend/RewriteObjC.cpp
index 40d444d..fff8b54 100644
--- a/lib/Frontend/RewriteObjC.cpp
+++ b/lib/Frontend/RewriteObjC.cpp
@@ -2613,11 +2613,9 @@
                                             CastExpr::CK_Unknown, SuperRep);
       } else {
         // (struct objc_super) { <exprs from above> }
-        InitListExpr *ILE = new (Context) InitListExpr(*Context,
-                                                       SourceLocation(),
-                                                       &InitExprs[0],
-                                                       InitExprs.size(),
-                                                       SourceLocation());
+        InitListExpr *ILE = new (Context) InitListExpr(SourceLocation(),
+                                             &InitExprs[0], InitExprs.size(),
+                                             SourceLocation());
         TypeSourceInfo *superTInfo
           = Context->getTrivialTypeSourceInfo(superType);
         SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
@@ -2700,11 +2698,9 @@
                                  CastExpr::CK_Unknown, SuperRep);
       } else {
         // (struct objc_super) { <exprs from above> }
-        InitListExpr *ILE = new (Context) InitListExpr(*Context,
-                                                       SourceLocation(),
-                                                       &InitExprs[0],
-                                                       InitExprs.size(),
-                                                       SourceLocation());
+        InitListExpr *ILE = new (Context) InitListExpr(SourceLocation(),
+                                             &InitExprs[0], InitExprs.size(),
+                                             SourceLocation());
         TypeSourceInfo *superTInfo
           = Context->getTrivialTypeSourceInfo(superType);
         SuperRep = new (Context) CompoundLiteralExpr(SourceLocation(), superTInfo,
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 0d54a16..e950be0 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -3763,8 +3763,8 @@
   // Semantic analysis for initializers is done by ActOnDeclarator() and
   // CheckInitializer() - it requires knowledge of the object being intialized.
 
-  InitListExpr *E = new (Context) InitListExpr(Context, LBraceLoc, InitList,
-                                               NumInit, RBraceLoc);
+  InitListExpr *E = new (Context) InitListExpr(LBraceLoc, InitList, NumInit,
+                                               RBraceLoc);
   E->setType(Context.VoidTy); // FIXME: just a place holder for now.
   return Owned(E);
 }
@@ -4038,8 +4038,7 @@
     // FIXME: This means that pretty-printing the final AST will produce curly
     // braces instead of the original commas.
     Op.release();
-    InitListExpr *E = new (Context) InitListExpr(Context, LParenLoc,
-                                                 &initExprs[0],
+    InitListExpr *E = new (Context) InitListExpr(LParenLoc, &initExprs[0],
                                                  initExprs.size(), RParenLoc);
     E->setType(Ty);
     return BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, Owned(E));
@@ -4753,7 +4752,8 @@
                                       QualType UnionType, FieldDecl *Field) {
   // Build an initializer list that designates the appropriate member
   // of the transparent union.
-  InitListExpr *Initializer = new (C) InitListExpr(C, SourceLocation(), &E, 1,
+  InitListExpr *Initializer = new (C) InitListExpr(SourceLocation(),
+                                                   &E, 1,
                                                    SourceLocation());
   Initializer->setType(UnionType);
   Initializer->setInitializedFieldInUnion(Field);
diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp
index 1c4e2c8..7b4a417 100644
--- a/lib/Sema/SemaInit.cpp
+++ b/lib/Sema/SemaInit.cpp
@@ -280,7 +280,7 @@
       // extend the initializer list to include the constructor
       // call and make a note that we'll need to take another pass
       // through the initializer list.
-      ILE->updateInit(SemaRef.Context, Init, MemberInit.takeAs<Expr>());
+      ILE->updateInit(Init, MemberInit.takeAs<Expr>());
       RequiresSecondPass = true;
     }
   } else if (InitListExpr *InnerILE
@@ -390,7 +390,7 @@
         // extend the initializer list to include the constructor
         // call and make a note that we'll need to take another pass
         // through the initializer list.
-        ILE->updateInit(SemaRef.Context, Init, ElementInit.takeAs<Expr>());
+        ILE->updateInit(Init, ElementInit.takeAs<Expr>());
         RequiresSecondPass = true;
       }
     } else if (InitListExpr *InnerILE
@@ -1669,8 +1669,8 @@
   }
 
   InitListExpr *Result
-    = new (SemaRef.Context) InitListExpr(SemaRef.Context, InitRange.getBegin(),
-                                         0, 0, InitRange.getEnd());
+    = new (SemaRef.Context) InitListExpr(InitRange.getBegin(), 0, 0,
+                                         InitRange.getEnd());
 
   Result->setType(CurrentObjectType.getNonReferenceType());
 
@@ -1707,12 +1707,12 @@
   if (NumElements < NumInits)
     NumElements = IList->getNumInits();
 
-  Result->reserveInits(SemaRef.Context, NumElements);
+  Result->reserveInits(NumElements);
 
   // Link this new initializer list into the structured initializer
   // lists.
   if (StructuredList)
-    StructuredList->updateInit(SemaRef.Context, StructuredIndex, Result);
+    StructuredList->updateInit(StructuredIndex, Result);
   else {
     Result->setSyntacticForm(IList);
     SyntacticToSemantic[IList] = Result;
@@ -1730,8 +1730,7 @@
   if (!StructuredList)
     return;
 
-  if (Expr *PrevInit = StructuredList->updateInit(SemaRef.Context,
-                                                  StructuredIndex, expr)) {
+  if (Expr *PrevInit = StructuredList->updateInit(StructuredIndex, expr)) {
     // This initializer overwrites a previous initializer. Warn.
     SemaRef.Diag(expr->getSourceRange().getBegin(),
                   diag::warn_initializer_overrides)
