From 5a937fdefff41fed5f00ea6b191b4e200cf17107 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Sat, 18 Jul 2015 17:09:36 +0000 Subject: [PATCH] [AST] Remove StmtRange in favor of an iterator_range. StmtRange was just a convenient wrapper for two StmtIterators before we had real range support. This removes some of the implicit conversions StmtRange had leading to slightly more verbose code but also should make more obvious what's going on. No functional change intended. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242615 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Expr.h | 51 +++++-- include/clang/AST/ExprCXX.h | 70 +++++++--- include/clang/AST/ExprObjC.h | 18 ++- include/clang/AST/OpenMPClause.h | 136 +++++++++++-------- include/clang/AST/Stmt.h | 40 ++++-- include/clang/AST/StmtIterator.h | 80 ----------- include/clang/AST/StmtOpenMP.h | 2 +- lib/ARCMigrate/TransRetainReleaseDealloc.cpp | 8 +- lib/AST/Expr.cpp | 4 +- lib/AST/Stmt.cpp | 2 +- lib/AST/StmtPrinter.cpp | 11 +- lib/Analysis/CFG.cpp | 3 +- lib/Sema/SemaOpenMP.cpp | 8 +- 13 files changed, 228 insertions(+), 205 deletions(-) diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 24d09fb9af..5ff0e7083a 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -857,7 +857,9 @@ public: return Loc; } - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } /// The source expression of an opaque value expression is the /// expression which originally generated the value. This is @@ -1169,7 +1171,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } friend class ASTStmtReader; friend class ASTStmtWriter; @@ -1315,7 +1319,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; class CharacterLiteral : public Expr { @@ -1362,7 +1368,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; class FloatingLiteral : public Expr, private APFloatStorage { @@ -1424,7 +1432,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// ImaginaryLiteral - We support imaginary integer and floating point literals, @@ -1619,7 +1629,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// ParenExpr - This represents a parethesized expression, e.g. "(1)". This @@ -3397,7 +3409,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}). @@ -3676,7 +3690,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// VAArgExpr, used for the builtin function __builtin_va_arg. @@ -3929,7 +3945,8 @@ public: // Iterators child_range children() { // FIXME: This does not include the array filler expression. - if (InitExprs.empty()) return child_range(); + if (InitExprs.empty()) + return child_range(child_iterator(), child_iterator()); return child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size()); } @@ -4306,7 +4323,9 @@ public: SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; // In cases like: @@ -4380,7 +4399,9 @@ public: SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; @@ -4646,7 +4667,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] @@ -4948,7 +4971,9 @@ public: assert(T->isDependentType() && "TypoExpr given a non-dependent type"); } - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } SourceLocation getLocStart() const LLVM_READONLY { return SourceLocation(); } SourceLocation getLocEnd() const LLVM_READONLY { return SourceLocation(); } }; diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h index cc185303ed..b89508ed89 100644 --- a/include/clang/AST/ExprCXX.h +++ b/include/clang/AST/ExprCXX.h @@ -457,7 +457,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief The null pointer literal (C++11 [lex.nullptr]) @@ -484,7 +486,9 @@ public: return T->getStmtClass() == CXXNullPtrLiteralExprClass; } - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief Implicit construction of a std::initializer_list object from an @@ -607,7 +611,8 @@ public: // Iterators child_range children() { - if (isTypeOperand()) return child_range(); + if (isTypeOperand()) + return child_range(child_iterator(), child_iterator()); Stmt **begin = reinterpret_cast(&Operand); return child_range(begin, begin + 1); } @@ -749,7 +754,8 @@ public: // Iterators child_range children() { - if (isTypeOperand()) return child_range(); + if (isTypeOperand()) + return child_range(child_iterator(), child_iterator()); Stmt **begin = reinterpret_cast(&Operand); return child_range(begin, begin + 1); } @@ -797,7 +803,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief A C++ throw-expression (C++ [except.throw]). @@ -935,7 +943,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } friend class ASTStmtReader; friend class ASTStmtWriter; @@ -991,7 +1001,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } friend class ASTReader; friend class ASTStmtReader; @@ -1652,7 +1664,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief Represents a new-expression for memory allocation and constructor @@ -2201,8 +2215,10 @@ public: } // Iterators - child_range children() { return child_range(); } - + child_range children() { + return child_range(child_iterator(), child_iterator()); + } + friend class ASTStmtReader; friend class ASTStmtWriter; @@ -2274,7 +2290,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } friend class ASTStmtReader; }; @@ -2331,7 +2349,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } friend class ASTStmtReader; }; @@ -2622,7 +2642,9 @@ public: return getNameInfo().getLocEnd(); } - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } static bool classof(const Stmt *T) { return T->getStmtClass() == UnresolvedLookupExprClass; @@ -2785,7 +2807,9 @@ public: return T->getStmtClass() == DependentScopeDeclRefExprClass; } - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } friend class ASTStmtReader; friend class ASTStmtWriter; @@ -3222,7 +3246,8 @@ public: // Iterators child_range children() { - if (isImplicitAccess()) return child_range(); + if (isImplicitAccess()) + return child_range(child_iterator(), child_iterator()); return child_range(&Base, &Base + 1); } @@ -3365,7 +3390,8 @@ public: // Iterators child_range children() { - if (isImplicitAccess()) return child_range(); + if (isImplicitAccess()) + return child_range(child_iterator(), child_iterator()); return child_range(&Base, &Base + 1); } }; @@ -3592,7 +3618,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief Represents a reference to a non-type template parameter @@ -3695,7 +3723,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief Represents a reference to a function parameter pack that has been @@ -3762,7 +3792,9 @@ public: return T->getStmtClass() == FunctionParmPackExprClass; } - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief Represents a prvalue temporary that is written into memory so that diff --git a/include/clang/AST/ExprObjC.h b/include/clang/AST/ExprObjC.h index a7e82f9d93..09ffc397c5 100644 --- a/include/clang/AST/ExprObjC.h +++ b/include/clang/AST/ExprObjC.h @@ -82,7 +82,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// ObjCBoxedExpr - used for generalized expression boxing. @@ -391,7 +393,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// ObjCSelectorExpr used for \@selector in Objective-C. @@ -426,7 +430,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// ObjCProtocolExpr used for protocol expression in Objective-C. @@ -466,7 +472,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } friend class ASTStmtReader; friend class ASTStmtWriter; @@ -715,7 +723,7 @@ public: Stmt **begin = reinterpret_cast(&Receiver); // hack! return child_range(begin, begin+1); } - return child_range(); + return child_range(child_iterator(), child_iterator()); } private: diff --git a/include/clang/AST/OpenMPClause.h b/include/clang/AST/OpenMPClause.h index fcfa1dd475..7d3fcf0423 100644 --- a/include/clang/AST/OpenMPClause.h +++ b/include/clang/AST/OpenMPClause.h @@ -57,9 +57,15 @@ public: bool isImplicit() const { return StartLoc.isInvalid(); } - StmtRange children(); - ConstStmtRange children() const { - return const_cast(this)->children(); + typedef StmtIterator child_iterator; + typedef ConstStmtIterator const_child_iterator; + typedef llvm::iterator_range child_range; + typedef llvm::iterator_range const_child_range; + + child_range children(); + const_child_range children() const { + auto Children = const_cast(this)->children(); + return const_child_range(Children.begin(), Children.end()); } static bool classof(const OMPClause *) { return true; } }; @@ -193,7 +199,7 @@ public: return T->getClauseKind() == OMPC_if; } - StmtRange children() { return StmtRange(&Condition, &Condition + 1); } + child_range children() { return child_range(&Condition, &Condition + 1); } }; /// \brief This represents 'final' clause in the '#pragma omp ...' directive. @@ -246,7 +252,7 @@ public: return T->getClauseKind() == OMPC_final; } - StmtRange children() { return StmtRange(&Condition, &Condition + 1); } + child_range children() { return child_range(&Condition, &Condition + 1); } }; /// \brief This represents 'num_threads' clause in the '#pragma omp ...' @@ -300,7 +306,7 @@ public: return T->getClauseKind() == OMPC_num_threads; } - StmtRange children() { return StmtRange(&NumThreads, &NumThreads + 1); } + child_range children() { return child_range(&NumThreads, &NumThreads + 1); } }; /// \brief This represents 'safelen' clause in the '#pragma omp ...' @@ -356,7 +362,7 @@ public: return T->getClauseKind() == OMPC_safelen; } - StmtRange children() { return StmtRange(&Safelen, &Safelen + 1); } + child_range children() { return child_range(&Safelen, &Safelen + 1); } }; /// \brief This represents 'collapse' clause in the '#pragma omp ...' @@ -412,7 +418,7 @@ public: return T->getClauseKind() == OMPC_collapse; } - StmtRange children() { return StmtRange(&NumForLoops, &NumForLoops + 1); } + child_range children() { return child_range(&NumForLoops, &NumForLoops + 1); } }; /// \brief This represents 'default' clause in the '#pragma omp ...' directive. @@ -481,7 +487,9 @@ public: return T->getClauseKind() == OMPC_default; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'proc_bind' clause in the '#pragma omp ...' @@ -552,7 +560,9 @@ public: return T->getClauseKind() == OMPC_proc_bind; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'schedule' clause in the '#pragma omp ...' directive. @@ -676,8 +686,8 @@ public: return T->getClauseKind() == OMPC_schedule; } - StmtRange children() { - return StmtRange(&ChunkSizes[CHUNK_SIZE], &ChunkSizes[CHUNK_SIZE] + 1); + child_range children() { + return child_range(&ChunkSizes[CHUNK_SIZE], &ChunkSizes[CHUNK_SIZE] + 1); } }; @@ -707,7 +717,9 @@ public: return T->getClauseKind() == OMPC_ordered; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'nowait' clause in the '#pragma omp ...' directive. @@ -736,7 +748,9 @@ public: return T->getClauseKind() == OMPC_nowait; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'untied' clause in the '#pragma omp ...' directive. @@ -765,7 +779,9 @@ public: return T->getClauseKind() == OMPC_untied; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'mergeable' clause in the '#pragma omp ...' @@ -795,7 +811,9 @@ public: return T->getClauseKind() == OMPC_mergeable; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'read' clause in the '#pragma omp atomic' directive. @@ -823,7 +841,9 @@ public: return T->getClauseKind() == OMPC_read; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'write' clause in the '#pragma omp atomic' directive. @@ -852,7 +872,9 @@ public: return T->getClauseKind() == OMPC_write; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'update' clause in the '#pragma omp atomic' @@ -882,7 +904,9 @@ public: return T->getClauseKind() == OMPC_update; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'capture' clause in the '#pragma omp atomic' @@ -912,7 +936,9 @@ public: return T->getClauseKind() == OMPC_capture; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents 'seq_cst' clause in the '#pragma omp atomic' @@ -942,7 +968,9 @@ public: return T->getClauseKind() == OMPC_seq_cst; } - StmtRange children() { return StmtRange(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This represents clause 'private' in the '#pragma omp ...' directives. @@ -1026,9 +1054,9 @@ public: getPrivateCopies().end()); } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -1147,9 +1175,9 @@ public: return inits_const_range(getInits().begin(), getInits().end()); } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -1332,9 +1360,9 @@ public: getAssignmentOps().end()); } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -1391,9 +1419,9 @@ public: /// static OMPSharedClause *CreateEmpty(const ASTContext &C, unsigned N); - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -1571,9 +1599,9 @@ public: getReductionOps().end()); } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -1750,9 +1778,9 @@ public: return finals_const_range(getFinals().begin(), getFinals().end()); } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -1835,9 +1863,9 @@ public: /// \brief Returns alignment. const Expr *getAlignment() const { return *varlist_end(); } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -1993,9 +2021,9 @@ public: getAssignmentOps().end()); } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -2138,9 +2166,9 @@ public: getAssignmentOps().end()); } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -2202,9 +2230,9 @@ public: /// static OMPFlushClause *CreateEmpty(const ASTContext &C, unsigned N); - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { @@ -2290,9 +2318,9 @@ public: /// \brief Get colon location. SourceLocation getColonLoc() const { return ColonLoc; } - StmtRange children() { - return StmtRange(reinterpret_cast(varlist_begin()), - reinterpret_cast(varlist_end())); + child_range children() { + return child_range(reinterpret_cast(varlist_begin()), + reinterpret_cast(varlist_end())); } static bool classof(const OMPClause *T) { diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 7ab698b4bd..eb0bfd3bb5 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -394,19 +394,20 @@ public: typedef StmtIterator child_iterator; typedef ConstStmtIterator const_child_iterator; - typedef StmtRange child_range; - typedef ConstStmtRange const_child_range; + typedef llvm::iterator_range child_range; + typedef llvm::iterator_range const_child_range; child_range children(); const_child_range children() const { - return const_cast(this)->children(); + auto Children = const_cast(this)->children(); + return const_child_range(Children.begin(), Children.end()); } - child_iterator child_begin() { return children().first; } - child_iterator child_end() { return children().second; } + child_iterator child_begin() { return children().begin(); } + child_iterator child_end() { return children().end(); } - const_child_iterator child_begin() const { return children().first; } - const_child_iterator child_end() const { return children().second; } + const_child_iterator child_begin() const { return children().begin(); } + const_child_iterator child_end() const { return children().end(); } /// \brief Produce a unique representation of the given statement. /// @@ -527,7 +528,9 @@ public: return T->getStmtClass() == NullStmtClass; } - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } friend class ASTStmtReader; friend class ASTStmtWriter; @@ -626,7 +629,8 @@ public: } const_child_range children() const { - return child_range(Body, Body + CompoundStmtBits.NumStmts); + return const_child_range(child_iterator(Body), + child_iterator(Body + CompoundStmtBits.NumStmts)); } }; @@ -1222,7 +1226,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// IndirectGotoStmt - This represents an indirect goto. @@ -1290,7 +1296,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// BreakStmt - This represents a break. @@ -1318,7 +1326,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; @@ -1373,7 +1383,7 @@ public: // Iterators child_range children() { if (RetExpr) return child_range(&RetExpr, &RetExpr+1); - return child_range(); + return child_range(child_iterator(), child_iterator()); } }; @@ -1957,7 +1967,9 @@ public: } // Iterators - child_range children() { return child_range(); } + child_range children() { + return child_range(child_iterator(), child_iterator()); + } }; /// \brief This captures a statement into a function. For example, the following diff --git a/include/clang/AST/StmtIterator.h b/include/clang/AST/StmtIterator.h index a5a57af523..81f8ad4344 100644 --- a/include/clang/AST/StmtIterator.h +++ b/include/clang/AST/StmtIterator.h @@ -139,86 +139,6 @@ struct ConstStmtIterator : public StmtIteratorImpl(RHS) {} }; -/// A range of statement iterators. -/// -/// This class provides some extra functionality beyond std::pair -/// in order to allow the following idiom: -/// for (StmtRange range = stmt->children(); range; ++range) -struct StmtRange : std::pair { - StmtRange() {} - StmtRange(const StmtIterator &begin, const StmtIterator &end) - : std::pair(begin, end) {} - - bool empty() const { return first == second; } - explicit operator bool() const { return !empty(); } - - Stmt *operator->() const { return first.operator->(); } - Stmt *&operator*() const { return first.operator*(); } - - StmtRange &operator++() { - assert(!empty() && "incrementing on empty range"); - ++first; - return *this; - } - - StmtRange operator++(int) { - assert(!empty() && "incrementing on empty range"); - StmtRange copy = *this; - ++first; - return copy; - } - - friend const StmtIterator &begin(const StmtRange &range) { - return range.first; - } - friend const StmtIterator &end(const StmtRange &range) { - return range.second; - } -}; - -/// A range of const statement iterators. -/// -/// This class provides some extra functionality beyond std::pair -/// in order to allow the following idiom: -/// for (ConstStmtRange range = stmt->children(); range; ++range) -struct ConstStmtRange : std::pair { - ConstStmtRange() {} - ConstStmtRange(const ConstStmtIterator &begin, - const ConstStmtIterator &end) - : std::pair(begin, end) {} - ConstStmtRange(const StmtRange &range) - : std::pair(range.first, range.second) - {} - ConstStmtRange(const StmtIterator &begin, const StmtIterator &end) - : std::pair(begin, end) {} - - bool empty() const { return first == second; } - explicit operator bool() const { return !empty(); } - - const Stmt *operator->() const { return first.operator->(); } - const Stmt *operator*() const { return first.operator*(); } - - ConstStmtRange &operator++() { - assert(!empty() && "incrementing on empty range"); - ++first; - return *this; - } - - ConstStmtRange operator++(int) { - assert(!empty() && "incrementing on empty range"); - ConstStmtRange copy = *this; - ++first; - return copy; - } - - friend const ConstStmtIterator &begin(const ConstStmtRange &range) { - return range.first; - } - friend const ConstStmtIterator &end(const ConstStmtRange &range) { - return range.second; - } -}; - } // end namespace clang #endif diff --git a/include/clang/AST/StmtOpenMP.h b/include/clang/AST/StmtOpenMP.h index b412daaf28..be00116526 100644 --- a/include/clang/AST/StmtOpenMP.h +++ b/include/clang/AST/StmtOpenMP.h @@ -195,7 +195,7 @@ public: child_range children() { if (!hasAssociatedStmt()) - return child_range(); + return child_range(child_iterator(), child_iterator()); Stmt **ChildStorage = reinterpret_cast(getClauses().end()); return child_range(ChildStorage, ChildStorage + NumChildren); } diff --git a/lib/ARCMigrate/TransRetainReleaseDealloc.cpp b/lib/ARCMigrate/TransRetainReleaseDealloc.cpp index 7db1a1c378..fbbd0bf641 100644 --- a/lib/ARCMigrate/TransRetainReleaseDealloc.cpp +++ b/lib/ARCMigrate/TransRetainReleaseDealloc.cpp @@ -359,16 +359,16 @@ private: return; Stmt::child_range StmtExprChild = StmtE->children(); - if (!StmtExprChild) + if (StmtExprChild.begin() == StmtExprChild.end()) return; - CompoundStmt *CompS = dyn_cast_or_null(*StmtExprChild); + auto *CompS = dyn_cast_or_null(*StmtExprChild.begin()); if (!CompS) return; Stmt::child_range CompStmtChild = CompS->children(); - if (!CompStmtChild) + if (CompStmtChild.begin() == CompStmtChild.end()) return; - DeclStmt *DeclS = dyn_cast_or_null(*CompStmtChild); + auto *DeclS = dyn_cast_or_null(*CompStmtChild.begin()); if (!DeclS) return; if (!DeclS->isSingleDecl()) diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 5ee06b3666..55fc6a3f91 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -3891,7 +3891,7 @@ DesignatedInitExpr::DesignatedInitExpr(const ASTContext &C, QualType Ty, this->Designators = new (C) Designator[NumDesignators]; // Record the initializer itself. - child_range Child = children(); + child_iterator Child = child_begin(); *Child++ = Init; // Copy the designators and their subexpressions, computing @@ -4175,7 +4175,7 @@ Stmt::child_range UnaryExprOrTypeTraitExpr::children() { if (const VariableArrayType* T = dyn_cast( getArgumentType().getTypePtr())) return child_range(child_iterator(T), child_iterator()); - return child_range(); + return child_range(child_iterator(), child_iterator()); } return child_range(&Argument.Ex, &Argument.Ex + 1); } diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index 80b6be88a3..78cbc7d793 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -1171,7 +1171,7 @@ bool CapturedStmt::capturesVariable(const VarDecl *Var) const { return false; } -StmtRange OMPClause::children() { +OMPClause::child_range OMPClause::children() { switch(getClauseKind()) { default : break; #define OPENMP_CLAUSE(Name, Class) \ diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp index 8870c67c74..df21d7bad6 100644 --- a/lib/AST/StmtPrinter.cpp +++ b/lib/AST/StmtPrinter.cpp @@ -2129,14 +2129,11 @@ void StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { void StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { OS << "@[ "; - StmtRange ch = E->children(); - if (ch.first != ch.second) { - while (1) { - Visit(*ch.first); - ++ch.first; - if (ch.first == ch.second) break; + ObjCArrayLiteral::child_range Ch = E->children(); + for (auto I = Ch.begin(), E = Ch.end(); I != E; ++I) { + if (I != Ch.begin()) OS << ", "; - } + Visit(*I); } OS << " ]"; } diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 54d15bd232..73b6fc6c3c 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -4128,7 +4128,8 @@ static void print_elem(raw_ostream &OS, StmtPrinterHelper &Helper, if (const StmtExpr *SE = dyn_cast(S)) { const CompoundStmt *Sub = SE->getSubStmt(); - if (Sub->children()) { + auto Children = Sub->children(); + if (Children.begin() != Children.end()) { OS << "({ ... ; "; Helper.handledStmt(*SE->getSubStmt()->body_rbegin(),OS); OS << " })\n"; diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index e11ab82f88..90b8f712af 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -3377,11 +3377,11 @@ StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef Clauses, BaseStmt = CS->getCapturedStmt(); if (auto C = dyn_cast_or_null(BaseStmt)) { auto S = C->children(); - if (!S) + if (S.begin() == S.end()) return StmtError(); // All associated statements must be '#pragma omp section' except for // the first one. - for (Stmt *SectionStmt : ++S) { + for (Stmt *SectionStmt : llvm::make_range(std::next(S.begin()), S.end())) { if (!SectionStmt || !isa(SectionStmt)) { if (SectionStmt) Diag(SectionStmt->getLocStart(), @@ -3535,11 +3535,11 @@ Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef Clauses, BaseStmt = CS->getCapturedStmt(); if (auto C = dyn_cast_or_null(BaseStmt)) { auto S = C->children(); - if (!S) + if (S.begin() == S.end()) return StmtError(); // All associated statements must be '#pragma omp section' except for // the first one. - for (Stmt *SectionStmt : ++S) { + for (Stmt *SectionStmt : llvm::make_range(std::next(S.begin()), S.end())) { if (!SectionStmt || !isa(SectionStmt)) { if (SectionStmt) Diag(SectionStmt->getLocStart(), -- 2.40.0