summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-04-24 22:47:04 +0000
committerAnders Carlsson <andersca@mac.com>2009-04-24 22:47:04 +0000
commitdefc644e065dd3d9adde7df7fdb658e271a37764 (patch)
tree24b7e762d3cff5dedbf7ff99834989207e827f67
parentcd2a8c5864fa506ca3d98c720c936c4be3cc6a53 (diff)
downloadbcm5719-llvm-defc644e065dd3d9adde7df7fdb658e271a37764.tar.gz
bcm5719-llvm-defc644e065dd3d9adde7df7fdb658e271a37764.zip
Add CXXExprWithCleanup
llvm-svn: 70000
-rw-r--r--clang/include/clang/AST/ExprCXX.h27
-rw-r--r--clang/include/clang/AST/StmtNodes.def1
-rw-r--r--clang/lib/AST/ExprCXX.cpp21
-rw-r--r--clang/lib/AST/StmtPrinter.cpp5
4 files changed, 54 insertions, 0 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h
index c3e01813248..568a9f2a459 100644
--- a/clang/include/clang/AST/ExprCXX.h
+++ b/clang/include/clang/AST/ExprCXX.h
@@ -21,6 +21,7 @@
namespace clang {
class CXXConstructorDecl;
+ class CXXTempVarDecl;
//===--------------------------------------------------------------------===//
// C++ Expressions.
@@ -946,6 +947,32 @@ public:
virtual child_iterator child_end();
};
+class CXXExprWithCleanup : public Expr {
+ Stmt *SubExpr;
+
+ CXXTempVarDecl **Decls;
+ unsigned NumDecls;
+
+public:
+ CXXExprWithCleanup(Expr *subexpr, CXXTempVarDecl **decls, unsigned numdecls);
+ ~CXXExprWithCleanup();
+
+ const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
+ Expr *getSubExpr() { return cast<Expr>(SubExpr); }
+
+ virtual SourceRange getSourceRange() const { return SourceRange(); }
+
+ // Implement isa/cast/dyncast/etc.
+ static bool classof(const Stmt *T) {
+ return T->getStmtClass() == CXXExprWithCleanupClass;
+ }
+ static bool classof(const CXXExprWithCleanup *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
+};
+
} // end namespace clang
#endif
diff --git a/clang/include/clang/AST/StmtNodes.def b/clang/include/clang/AST/StmtNodes.def
index b9c6aa28dd4..5dbb6286ca3 100644
--- a/clang/include/clang/AST/StmtNodes.def
+++ b/clang/include/clang/AST/StmtNodes.def
@@ -121,6 +121,7 @@ STMT(QualifiedDeclRefExpr , DeclRefExpr)
STMT(UnresolvedDeclRefExpr , Expr)
STMT(CXXDestroyExpr , Expr)
STMT(CXXConstructExpr , Expr)
+STMT(CXXExprWithCleanup , Expr)
// Obj-C Expressions.
STMT(ObjCStringLiteral , Expr)
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp
index 5b4d4d330e3..bab58a2f3fc 100644
--- a/clang/lib/AST/ExprCXX.cpp
+++ b/clang/lib/AST/ExprCXX.cpp
@@ -274,6 +274,22 @@ CXXDestroyExpr *CXXDestroyExpr::Create(ASTContext &C, VarDecl *vd) {
return new (C) CXXDestroyExpr(vd, C.VoidTy);
}
+CXXExprWithCleanup::CXXExprWithCleanup(Expr *subexpr, CXXTempVarDecl **decls,
+ unsigned numdecls)
+: Expr(CXXExprWithCleanupClass, subexpr->getType(),
+ subexpr->isTypeDependent(), subexpr->isValueDependent()),
+ SubExpr(subexpr), Decls(0), NumDecls(numdecls) {
+ if (NumDecls > 0) {
+ Decls = new CXXTempVarDecl*[NumDecls];
+ for (unsigned i = 0; i < NumDecls; ++i)
+ Decls[i] = decls[i];
+ }
+}
+
+CXXExprWithCleanup::~CXXExprWithCleanup() {
+ delete[] Decls;
+}
+
// CXXConstructExpr
Stmt::child_iterator CXXConstructExpr::child_begin() {
return &Args[0];
@@ -289,3 +305,8 @@ Stmt::child_iterator CXXDestroyExpr::child_begin() {
Stmt::child_iterator CXXDestroyExpr::child_end() {
return child_iterator();
}
+
+// CXXExprWithCleanup
+Stmt::child_iterator CXXExprWithCleanup::child_begin() { return &SubExpr; }
+Stmt::child_iterator CXXExprWithCleanup::child_end() { return &SubExpr + 1; }
+
diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp
index 5e75a2eb615..1a74937be94 100644
--- a/clang/lib/AST/StmtPrinter.cpp
+++ b/clang/lib/AST/StmtPrinter.cpp
@@ -1105,6 +1105,11 @@ void StmtPrinter::VisitCXXDestroyExpr(CXXDestroyExpr *E) {
// Nothing to print.
}
+void StmtPrinter::VisitCXXExprWithCleanup(CXXExprWithCleanup *E) {
+ // Just forward to the sub expression.
+ PrintExpr(E->getSubExpr());
+}
+
static const char *getTypeTraitName(UnaryTypeTrait UTT) {
switch (UTT) {
default: assert(false && "Unknown type trait");
OpenPOWER on IntegriCloud