From: Anders Carlsson Date: Fri, 24 Apr 2009 22:47:04 +0000 (+0000) Subject: Add CXXExprWithCleanup X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=02bbfa33590dfe3107e801fb526b7ab0bdfd00ee;p=clang Add CXXExprWithCleanup git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70000 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h index c3e0181324..568a9f2a45 100644 --- a/include/clang/AST/ExprCXX.h +++ b/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(SubExpr); } + Expr *getSubExpr() { return cast(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/include/clang/AST/StmtNodes.def b/include/clang/AST/StmtNodes.def index b9c6aa28dd..5dbb6286ca 100644 --- a/include/clang/AST/StmtNodes.def +++ b/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/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index 5b4d4d330e..bab58a2f3f 100644 --- a/lib/AST/ExprCXX.cpp +++ b/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/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index 5e75a2eb61..1a74937be9 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/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");