diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-04-24 22:47:04 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-04-24 22:47:04 +0000 |
| commit | defc644e065dd3d9adde7df7fdb658e271a37764 (patch) | |
| tree | 24b7e762d3cff5dedbf7ff99834989207e827f67 | |
| parent | cd2a8c5864fa506ca3d98c720c936c4be3cc6a53 (diff) | |
| download | bcm5719-llvm-defc644e065dd3d9adde7df7fdb658e271a37764.tar.gz bcm5719-llvm-defc644e065dd3d9adde7df7fdb658e271a37764.zip | |
Add CXXExprWithCleanup
llvm-svn: 70000
| -rw-r--r-- | clang/include/clang/AST/ExprCXX.h | 27 | ||||
| -rw-r--r-- | clang/include/clang/AST/StmtNodes.def | 1 | ||||
| -rw-r--r-- | clang/lib/AST/ExprCXX.cpp | 21 | ||||
| -rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 5 |
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"); |

