More work on the FullExpr class.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91513 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/FullExpr.cpp b/lib/AST/FullExpr.cpp
index 39c3bad..f47284f 100644
--- a/lib/AST/FullExpr.cpp
+++ b/lib/AST/FullExpr.cpp
@@ -16,27 +16,43 @@
 
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/FullExpr.h"
+#include "clang/AST/Expr.h"
+#include "clang/AST/ExprCXX.h"
 #include "llvm/Support/AlignOf.h"
 using namespace clang;
 
-FullExpr FullExpr::Create(ASTContext &Context, Expr *SubExpr, 
+FullExpr FullExpr::Create(ASTContext &Context, Expr *SubExpr,
                           CXXTemporary **Temporaries, unsigned NumTemporaries) {
-    FullExpr E;
+  FullExpr E;
+
+  if (!NumTemporaries) {
+      E.SubExpr = SubExpr;
+      return E;
+  }
+
+  unsigned Size = sizeof(FullExpr) 
+      + sizeof(CXXTemporary *) * NumTemporaries;
+
+  unsigned Align = llvm::AlignOf<ExprAndTemporaries>::Alignment;
+  ExprAndTemporaries *ET = 
+      static_cast<ExprAndTemporaries *>(Context.Allocate(Size, Align));
+
+  ET->SubExpr = SubExpr;
+  std::copy(Temporaries, Temporaries + NumTemporaries, ET->temps_begin());
     
-    if (!NumTemporaries) {
-        E.SubExpr = SubExpr;
-        return E;
-    }
-    
-    unsigned Size = sizeof(FullExpr) 
-        + sizeof(CXXTemporary *) * NumTemporaries;
-    
-    unsigned Align = llvm::AlignOf<ExprAndTemporaries>::Alignment;
-    ExprAndTemporaries *ET = 
-        static_cast<ExprAndTemporaries *>(Context.Allocate(Size, Align));
-    
-    ET->SubExpr = SubExpr;
-    std::copy(Temporaries, Temporaries + NumTemporaries, ET->begin());
-    
-    return E;
+  return E;
+}
+
+void FullExpr::Destroy(ASTContext &Context) {
+  if (Expr *E = SubExpr.dyn_cast<Expr *>()) {
+    E->Destroy(Context);
+    return;
+  }
+  
+  ExprAndTemporaries *ET = SubExpr.get<ExprAndTemporaries *>();
+  for (ExprAndTemporaries::temps_iterator i = ET->temps_begin(), 
+       e = ET->temps_end(); i != e; ++i)
+    (*i)->Destroy(Context);
+
+  Context.Deallocate(ET);
 }