diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h index f7b5eb5fa168..5ac9be07f54a 100644 --- a/clang/include/clang/AST/DeclCXX.h +++ b/clang/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/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index fd7927a684a3..542a7dba4cac 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/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/clang/include/clang/AST/StmtNodes.def b/clang/include/clang/AST/StmtNodes.def index 211e6062866d..84ee6b3908ca 100644 --- a/clang/include/clang/AST/StmtNodes.def +++ b/clang/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/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp index d73ea370cfb4..0c9b6270a42f 100644 --- a/clang/lib/AST/ExprCXX.cpp +++ b/clang/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/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index 7f9c4cc8fba0..888c15ad24a2 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/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");