]> granicus.if.org Git - clang/commitdiff
Add CXXExprWithCleanup
authorAnders Carlsson <andersca@mac.com>
Fri, 24 Apr 2009 22:47:04 +0000 (22:47 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 24 Apr 2009 22:47:04 +0000 (22:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70000 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/ExprCXX.h
include/clang/AST/StmtNodes.def
lib/AST/ExprCXX.cpp
lib/AST/StmtPrinter.cpp

index c3e018132484f42a512651a1d48df1e40f1f10ed..568a9f2a4595ab8927cd8a518ada078e9be42dd5 100644 (file)
@@ -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
index b9c6aa28dd423930fcab7b02d67a4153d079ad03..5dbb6286ca3eaba81ebd9158cabab957c922280a 100644 (file)
@@ -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)
index 5b4d4d330e3a6524e60490e890cde1438cb0cfa4..bab58a2f3fc9aeae93c33859a54f6fd3c0e1f96e 100644 (file)
@@ -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; }
+
index 5e75a2eb615c6c131a20a4bd12df00028fae86ed..1a74937be94e70ffe5b10cfd545677ca143bd02e 100644 (file)
@@ -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");