pchify CXXTemporary, CXXBindTemporaryExpr, and 
CXXExprWithTemporaries.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103387 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp
index 2e03beb..5eef559 100644
--- a/lib/AST/ExprCXX.cpp
+++ b/lib/AST/ExprCXX.cpp
@@ -520,16 +520,24 @@
 CXXExprWithTemporaries::CXXExprWithTemporaries(Expr *subexpr,
                                                CXXTemporary **temps,
                                                unsigned numtemps)
-: Expr(CXXExprWithTemporariesClass, subexpr->getType(),
+  : Expr(CXXExprWithTemporariesClass, subexpr->getType(),
        subexpr->isTypeDependent(), subexpr->isValueDependent()),
-  SubExpr(subexpr), Temps(0), NumTemps(numtemps) {
-  if (NumTemps > 0) {
-    Temps = new CXXTemporary*[NumTemps];
-    for (unsigned i = 0; i < NumTemps; ++i)
+    SubExpr(subexpr), Temps(0), NumTemps(0) {
+  if (NumTemps) {
+    setNumTemporaries(numtemps);
+    for (unsigned i = 0; i != numtemps; ++i)
       Temps[i] = temps[i];
   }
 }
 
+void CXXExprWithTemporaries::setNumTemporaries(unsigned N) {
+  assert(Temps == 0 && "Cannot resize with this");
+  // FIXME: This is a memory leak in disable free mode.
+  Temps = new CXXTemporary*[NumTemps];
+  NumTemps = N;
+}
+
+
 CXXExprWithTemporaries *CXXExprWithTemporaries::Create(ASTContext &C,
                                                        Expr *SubExpr,
                                                        CXXTemporary **Temps,
@@ -544,6 +552,7 @@
 }
 
 CXXExprWithTemporaries::~CXXExprWithTemporaries() {
+  // FIXME: This is a memory leak in disable free mode.
   delete[] Temps;
 }