Index: clang/include/clang/AST/Stmt.h =================================================================== --- clang/include/clang/AST/Stmt.h +++ clang/include/clang/AST/Stmt.h @@ -1188,6 +1188,11 @@ child_iterator(DG.end(), DG.end())); } + const_child_range children() const { + auto Children = const_cast(this)->children(); + return const_child_range(Children.begin(), Children.end()); + } + using decl_iterator = DeclGroupRef::iterator; using const_decl_iterator = DeclGroupRef::const_iterator; using decl_range = llvm::iterator_range; @@ -1245,6 +1250,10 @@ child_range children() { return child_range(child_iterator(), child_iterator()); } + + const_child_range children() const { + return const_child_range(const_child_iterator(), const_child_iterator()); + } }; /// CompoundStmt - This represents a group of statements like { stmt stmt }. @@ -1549,6 +1558,12 @@ getTrailingObjects() + numTrailingObjects(OverloadToken())); } + + const_child_range children() const { + return const_child_range(getTrailingObjects(), + getTrailingObjects() + + numTrailingObjects(OverloadToken())); + } }; class DefaultStmt : public SwitchCase { @@ -1580,6 +1595,10 @@ // Iterators child_range children() { return child_range(&SubStmt, &SubStmt + 1); } + + const_child_range children() const { + return const_child_range(&SubStmt, &SubStmt + 1); + } }; SourceLocation SwitchCase::getEndLoc() const { @@ -1654,6 +1673,10 @@ child_range children() { return child_range(&SubStmt, &SubStmt + 1); } + const_child_range children() const { + return const_child_range(&SubStmt, &SubStmt + 1); + } + static bool classof(const Stmt *T) { return T->getStmtClass() == LabelStmtClass; } @@ -1711,6 +1734,10 @@ child_range children() { return child_range(&SubStmt, &SubStmt + 1); } + const_child_range children() const { + return const_child_range(&SubStmt, &SubStmt + 1); + } + static bool classof(const Stmt *T) { return T->getStmtClass() == AttributedStmtClass; } @@ -1910,6 +1937,12 @@ numTrailingObjects(OverloadToken())); } + const_child_range children() const { + return const_child_range(getTrailingObjects(), + getTrailingObjects() + + numTrailingObjects(OverloadToken())); + } + static bool classof(const Stmt *T) { return T->getStmtClass() == IfStmtClass; } @@ -2087,6 +2120,12 @@ numTrailingObjects(OverloadToken())); } + const_child_range children() const { + return const_child_range(getTrailingObjects(), + getTrailingObjects() + + numTrailingObjects(OverloadToken())); + } + static bool classof(const Stmt *T) { return T->getStmtClass() == SwitchStmtClass; } @@ -2212,6 +2251,12 @@ getTrailingObjects() + numTrailingObjects(OverloadToken())); } + + const_child_range children() const { + return const_child_range(getTrailingObjects(), + getTrailingObjects() + + numTrailingObjects(OverloadToken())); + } }; /// DoStmt - This represents a 'do/while' stmt. @@ -2262,6 +2307,10 @@ child_range children() { return child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); } + + const_child_range children() const { + return const_child_range(&SubExprs[0], &SubExprs[0] + END_EXPR); + } }; /// ForStmt - This represents a 'for (init;cond;inc)' stmt. Note that any of @@ -2331,6 +2380,10 @@ child_range children() { return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); } + + const_child_range children() const { + return const_child_range(&SubExprs[0], &SubExprs[0]+END_EXPR); + } }; /// GotoStmt - This represents a direct goto. @@ -2366,6 +2419,10 @@ child_range children() { return child_range(child_iterator(), child_iterator()); } + + const_child_range children() const { + return const_child_range(const_child_iterator(), const_child_iterator()); + } }; /// IndirectGotoStmt - This represents an indirect goto. @@ -2411,6 +2468,8 @@ // Iterators child_range children() { return child_range(&Target, &Target + 1); } + + const_child_range children() const { return const_child_range(&Target, &Target + 1); } }; /// ContinueStmt - This represents a continue. @@ -2437,6 +2496,10 @@ child_range children() { return child_range(child_iterator(), child_iterator()); } + + const_child_range children() const { + return const_child_range(const_child_iterator(), const_child_iterator()); + } }; /// BreakStmt - This represents a break. @@ -2463,6 +2526,10 @@ child_range children() { return child_range(child_iterator(), child_iterator()); } + + const_child_range children() const { + return const_child_range(const_child_iterator(), const_child_iterator()); + } }; /// ReturnStmt - This represents a return, optionally of an expression: @@ -2547,6 +2614,12 @@ return child_range(&RetExpr, &RetExpr + 1); return child_range(child_iterator(), child_iterator()); } + + const_child_range children() const { + if (RetExpr) + return const_child_range(&RetExpr, &RetExpr + 1); + return const_child_range(const_child_iterator(), const_child_iterator()); + } }; /// AsmStmt is the base class for GCCAsmStmt and MSAsmStmt. @@ -2702,6 +2775,10 @@ child_range children() { return child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs); } + + const_child_range children() const { + return const_child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs); + } }; /// This represents a GCC inline-assembly statement extension. @@ -2978,6 +3055,10 @@ child_range children() { return child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]); } + + const_child_range children() const { + return const_child_range(&Exprs[0], &Exprs[NumInputs + NumOutputs]); + } }; class SEHExceptStmt : public Stmt { @@ -3015,6 +3096,10 @@ return child_range(Children, Children+2); } + const_child_range children() const { + return const_child_range(Children, Children+2); + } + static bool classof(const Stmt *T) { return T->getStmtClass() == SEHExceptStmtClass; } @@ -3046,6 +3131,10 @@ return child_range(&Block,&Block+1); } + const_child_range children() const { + return const_child_range(&Block, &Block+1); + } + static bool classof(const Stmt *T) { return T->getStmtClass() == SEHFinallyStmtClass; } @@ -3094,6 +3183,10 @@ return child_range(Children, Children+2); } + const_child_range children() const { + return const_child_range(Children, Children+2); + } + static bool classof(const Stmt *T) { return T->getStmtClass() == SEHTryStmtClass; } @@ -3124,6 +3217,10 @@ child_range children() { return child_range(child_iterator(), child_iterator()); } + + const_child_range children() const { + return const_child_range(const_child_iterator(), const_child_iterator()); + } }; /// This captures a statement into a function. For example, the following @@ -3344,6 +3441,8 @@ } child_range children(); + + const_child_range children() const; }; } // namespace clang Index: clang/lib/AST/Stmt.cpp =================================================================== --- clang/lib/AST/Stmt.cpp +++ clang/lib/AST/Stmt.cpp @@ -1254,6 +1254,10 @@ return child_range(getStoredStmts(), getStoredStmts() + NumCaptures); } +Stmt::const_child_range CapturedStmt::children() const { + return const_child_range(getStoredStmts(), getStoredStmts() + NumCaptures); +} + CapturedDecl *CapturedStmt::getCapturedDecl() { return CapDeclAndKind.getPointer(); }