forked from OSchip/llvm-project
parent
cd2a8c5864
commit
defc644e06
|
@ -21,6 +21,7 @@
|
||||||
namespace clang {
|
namespace clang {
|
||||||
|
|
||||||
class CXXConstructorDecl;
|
class CXXConstructorDecl;
|
||||||
|
class CXXTempVarDecl;
|
||||||
|
|
||||||
//===--------------------------------------------------------------------===//
|
//===--------------------------------------------------------------------===//
|
||||||
// C++ Expressions.
|
// C++ Expressions.
|
||||||
|
@ -946,6 +947,32 @@ public:
|
||||||
virtual child_iterator child_end();
|
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
|
} // end namespace clang
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -121,6 +121,7 @@ STMT(QualifiedDeclRefExpr , DeclRefExpr)
|
||||||
STMT(UnresolvedDeclRefExpr , Expr)
|
STMT(UnresolvedDeclRefExpr , Expr)
|
||||||
STMT(CXXDestroyExpr , Expr)
|
STMT(CXXDestroyExpr , Expr)
|
||||||
STMT(CXXConstructExpr , Expr)
|
STMT(CXXConstructExpr , Expr)
|
||||||
|
STMT(CXXExprWithCleanup , Expr)
|
||||||
|
|
||||||
// Obj-C Expressions.
|
// Obj-C Expressions.
|
||||||
STMT(ObjCStringLiteral , Expr)
|
STMT(ObjCStringLiteral , Expr)
|
||||||
|
|
|
@ -274,6 +274,22 @@ CXXDestroyExpr *CXXDestroyExpr::Create(ASTContext &C, VarDecl *vd) {
|
||||||
return new (C) CXXDestroyExpr(vd, C.VoidTy);
|
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
|
// CXXConstructExpr
|
||||||
Stmt::child_iterator CXXConstructExpr::child_begin() {
|
Stmt::child_iterator CXXConstructExpr::child_begin() {
|
||||||
return &Args[0];
|
return &Args[0];
|
||||||
|
@ -289,3 +305,8 @@ Stmt::child_iterator CXXDestroyExpr::child_begin() {
|
||||||
Stmt::child_iterator CXXDestroyExpr::child_end() {
|
Stmt::child_iterator CXXDestroyExpr::child_end() {
|
||||||
return child_iterator();
|
return child_iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CXXExprWithCleanup
|
||||||
|
Stmt::child_iterator CXXExprWithCleanup::child_begin() { return &SubExpr; }
|
||||||
|
Stmt::child_iterator CXXExprWithCleanup::child_end() { return &SubExpr + 1; }
|
||||||
|
|
||||||
|
|
|
@ -1105,6 +1105,11 @@ void StmtPrinter::VisitCXXDestroyExpr(CXXDestroyExpr *E) {
|
||||||
// Nothing to print.
|
// Nothing to print.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StmtPrinter::VisitCXXExprWithCleanup(CXXExprWithCleanup *E) {
|
||||||
|
// Just forward to the sub expression.
|
||||||
|
PrintExpr(E->getSubExpr());
|
||||||
|
}
|
||||||
|
|
||||||
static const char *getTypeTraitName(UnaryTypeTrait UTT) {
|
static const char *getTypeTraitName(UnaryTypeTrait UTT) {
|
||||||
switch (UTT) {
|
switch (UTT) {
|
||||||
default: assert(false && "Unknown type trait");
|
default: assert(false && "Unknown type trait");
|
||||||
|
|
Loading…
Reference in New Issue