diff options
author | Anders Carlsson <andersca@mac.com> | 2009-04-21 02:22:11 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-04-21 02:22:11 +0000 |
commit | 19d28a650ca6d98f7907ad891557fccca7baaea8 (patch) | |
tree | 6225ec55752a0230d67108cbaf76c967f38be973 | |
parent | 4bc11af9bed1d4a247e3db1fcb754d410ad99099 (diff) |
Add a CXXDestroyExpr. Add classof member functions to CXXTempVarDecl.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69654 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/AST/DeclCXX.h | 5 | ||||
-rw-r--r-- | include/clang/AST/ExprCXX.h | 24 | ||||
-rw-r--r-- | include/clang/AST/StmtNodes.def | 1 | ||||
-rw-r--r-- | lib/AST/ExprCXX.cpp | 14 | ||||
-rw-r--r-- | lib/AST/StmtPrinter.cpp | 4 |
5 files changed, 48 insertions, 0 deletions
diff --git a/include/clang/AST/DeclCXX.h b/include/clang/AST/DeclCXX.h index f7b5eb5fa1..5ac9be07f5 100644 --- a/include/clang/AST/DeclCXX.h +++ b/include/clang/AST/DeclCXX.h @@ -1064,6 +1064,11 @@ protected: public: static CXXTempVarDecl *Create(ASTContext &C, DeclContext *DC, QualType T); + + static bool classof(const Decl *D) { + return D->getKind() == Decl::CXXTempVar; + } + static bool classof(CXXTempVarDecl *D) { return true; } }; /// Insertion operator for diagnostics. This allows sending AccessSpecifier's diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h index fd7927a684..542a7dba4c 100644 --- a/include/clang/AST/ExprCXX.h +++ b/include/clang/AST/ExprCXX.h @@ -949,6 +949,30 @@ public: virtual StmtIterator child_end(); }; +class CXXDestroyExpr : public Expr { + VarDecl *VD; + +protected: + CXXDestroyExpr(VarDecl* vd, QualType T) + : Expr(CXXDestroyExprClass, T, false, vd->getType()->isDependentType()), + VD(vd) { } + +public: + static CXXDestroyExpr *Create(ASTContext &C, VarDecl *vd); + + virtual SourceRange getSourceRange() const { return SourceRange(); } + + // Implement isa/cast/dyncast/etc. + static bool classof(const Stmt *T) { + return T->getStmtClass() == CXXDestroyExprClass; + } + static bool classof(const CXXDestroyExpr *) { 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 211e606286..84ee6b3908 100644 --- a/include/clang/AST/StmtNodes.def +++ b/include/clang/AST/StmtNodes.def @@ -119,6 +119,7 @@ STMT(UnresolvedFunctionNameExpr , Expr) STMT(UnaryTypeTraitExpr , Expr) STMT(QualifiedDeclRefExpr , DeclRefExpr) STMT(UnresolvedDeclRefExpr , Expr) +STMT(CXXDestroyExpr , Expr) // Obj-C Expressions. STMT(ObjCStringLiteral , Expr) diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index d73ea370cf..0c9b6270a4 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -253,3 +253,17 @@ CXXTemporaryObjectExpr::CXXTemporaryObjectExpr(CXXConstructorDecl *Cons, CXXTemporaryObjectExpr::~CXXTemporaryObjectExpr() { delete [] Args; } + +CXXDestroyExpr *CXXDestroyExpr::Create(ASTContext &C, VarDecl *vd) { + assert(vd->getKind() == Decl::CXXTempVar || vd->getKind() == Decl::Var && + "Can only create a destroy expr with a temp var decl or a var decl!"); + + return new (C) CXXDestroyExpr(vd, C.VoidTy); +} + +Stmt::child_iterator CXXDestroyExpr::child_begin() { + return child_iterator(); +} +Stmt::child_iterator CXXDestroyExpr::child_end() { + return child_iterator(); +} diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index 7f9c4cc8fb..888c15ad24 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -1097,6 +1097,10 @@ void StmtPrinter::VisitUnresolvedFunctionNameExpr(UnresolvedFunctionNameExpr *E) OS << E->getName().getAsString(); } +void StmtPrinter::VisitCXXDestroyExpr(CXXDestroyExpr *E) { + // Nothing to print. +} + static const char *getTypeTraitName(UnaryTypeTrait UTT) { switch (UTT) { default: assert(false && "Unknown type trait"); |