From: Ted Kremenek Date: Wed, 23 Dec 2009 23:38:34 +0000 (+0000) Subject: Add StmtIterator support for iterating over both the condition X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=35628d1f17c817f8c240208db7ba490e3109981b;p=clang Add StmtIterator support for iterating over both the condition variable initializer and the other expressions in an IfStmt. This change required adding a 'DoDestroy()' method for IfStmt that did not include destroying the initializer (since that is owned by the VarDecl). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92089 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index b58f30e319..41b890c14f 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -624,9 +624,9 @@ class IfStmt : public Stmt { SourceLocation ElseLoc; public: - IfStmt(SourceLocation IL, VarDecl *Var, Expr *cond, Stmt *then, + IfStmt(SourceLocation IL, VarDecl *var, Expr *cond, Stmt *then, SourceLocation EL = SourceLocation(), Stmt *elsev = 0) - : Stmt(IfStmtClass), Var(Var), IfLoc(IL), ElseLoc(EL) { + : Stmt(IfStmtClass), Var(var), IfLoc(IL), ElseLoc(EL) { SubExprs[COND] = reinterpret_cast(cond); SubExprs[THEN] = then; SubExprs[ELSE] = elsev; @@ -674,9 +674,13 @@ public: } static bool classof(const IfStmt *) { return true; } - // Iterators + // Iterators over subexpressions. The iterators will include iterating + // over the initialization expression referenced by the condition variable. virtual child_iterator child_begin(); virtual child_iterator child_end(); + +protected: + virtual void DoDestroy(ASTContext &Ctx); }; /// SwitchStmt - This represents a 'switch' stmt. diff --git a/include/clang/AST/StmtIterator.h b/include/clang/AST/StmtIterator.h index 0ed83fe4ec..a48f4e6946 100644 --- a/include/clang/AST/StmtIterator.h +++ b/include/clang/AST/StmtIterator.h @@ -66,7 +66,7 @@ protected: Stmt*& GetDeclExpr() const; StmtIteratorBase(Stmt **s) : stmt(s), decl(0), RawVAPtr(0) {} - StmtIteratorBase(Decl *d); + StmtIteratorBase(Decl *d, Stmt **s); StmtIteratorBase(VariableArrayType *t); StmtIteratorBase(Decl **dgi, Decl **dge); StmtIteratorBase() : stmt(0), decl(0), RawVAPtr(0) {} @@ -82,9 +82,9 @@ protected: StmtIteratorImpl(const StmtIteratorBase& RHS) : StmtIteratorBase(RHS) {} public: StmtIteratorImpl() {} - StmtIteratorImpl(Stmt** s) : StmtIteratorBase(s) {} - StmtIteratorImpl(Decl** dgi, Decl** dge) : StmtIteratorBase(dgi, dge) {} - StmtIteratorImpl(Decl* d) : StmtIteratorBase(d) {} + StmtIteratorImpl(Stmt **s) : StmtIteratorBase(s) {} + StmtIteratorImpl(Decl **dgi, Decl **dge) : StmtIteratorBase(dgi, dge) {} + StmtIteratorImpl(Decl *d, Stmt **s) : StmtIteratorBase(d, s) {} StmtIteratorImpl(VariableArrayType* t) : StmtIteratorBase(t) {} DERIVED& operator++() { @@ -125,11 +125,15 @@ struct StmtIterator : public StmtIteratorImpl { explicit StmtIterator() : StmtIteratorImpl() {} StmtIterator(Stmt** S) : StmtIteratorImpl(S) {} + StmtIterator(Decl** dgi, Decl** dge) : StmtIteratorImpl(dgi, dge) {} - StmtIterator(VariableArrayType* t):StmtIteratorImpl(t) {} - StmtIterator(Decl* D) : StmtIteratorImpl(D) {} + StmtIterator(VariableArrayType* t) + : StmtIteratorImpl(t) {} + + StmtIterator(Decl* D, Stmt **s = 0) + : StmtIteratorImpl(D, s) {} }; struct ConstStmtIterator : public StmtIteratorImplDestroy(C); + + this->~Stmt(); + C.Deallocate((void *)this); +} // SwitchStmt Stmt::child_iterator SwitchStmt::child_begin() { return &SubExprs[0]; } diff --git a/lib/AST/StmtIterator.cpp b/lib/AST/StmtIterator.cpp index 0f1d85c399..7fc7c96750 100644 --- a/lib/AST/StmtIterator.cpp +++ b/lib/AST/StmtIterator.cpp @@ -65,7 +65,7 @@ void StmtIteratorBase::NextDecl(bool ImmediateAdvance) { assert (getVAPtr() == NULL); if (inDecl()) { - assert (decl); + assert(decl); // FIXME: SIMPLIFY AWAY. if (ImmediateAdvance) @@ -74,7 +74,7 @@ void StmtIteratorBase::NextDecl(bool ImmediateAdvance) { return; } else { - assert (inDeclGroup()); + assert(inDeclGroup()); if (ImmediateAdvance) ++DGI; @@ -113,10 +113,10 @@ bool StmtIteratorBase::HandleDecl(Decl* D) { return false; } -StmtIteratorBase::StmtIteratorBase(Decl* d) - : stmt(0), decl(d), RawVAPtr(DeclMode) { - assert (decl); - NextDecl(false); +StmtIteratorBase::StmtIteratorBase(Decl *d, Stmt **s) + : stmt(s), decl(d), RawVAPtr(d ? DeclMode : 0) { + if (decl) + NextDecl(false); } StmtIteratorBase::StmtIteratorBase(Decl** dgi, Decl** dge)