summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-12-16 06:10:22 +0000
committerAnders Carlsson <andersca@mac.com>2009-12-16 06:10:22 +0000
commita5ca598ce6fa5cf018e1f6a29abbe28adc458c9b (patch)
tree40d7d2facfa6e7f669867f6566936df43f47f524 /clang/lib/AST
parent9bcc264494b76ee6af5c435ce9829a8d694fadce (diff)
downloadbcm5719-llvm-a5ca598ce6fa5cf018e1f6a29abbe28adc458c9b.tar.gz
bcm5719-llvm-a5ca598ce6fa5cf018e1f6a29abbe28adc458c9b.zip
More work on the FullExpr class.
llvm-svn: 91513
Diffstat (limited to 'clang/lib/AST')
-rw-r--r--clang/lib/AST/FullExpr.cpp52
1 files changed, 34 insertions, 18 deletions
diff --git a/clang/lib/AST/FullExpr.cpp b/clang/lib/AST/FullExpr.cpp
index 39c3bad0a77..f47284f3d06 100644
--- a/clang/lib/AST/FullExpr.cpp
+++ b/clang/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;
-
- 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());
+ 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());
- 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);
}
OpenPOWER on IntegriCloud