[cfe-commits] r125183 - in /cfe/trunk: include/clang/AST/ include/clang/Basic/ lib/AST/ lib/CodeGen/ lib/Sema/ lib/StaticAnalyzer/Checkers/ tools/libclang/

Ted Kremenek kremenek at apple.com
Wed Feb 9 15:56:21 PST 2011


Was there a noticeable impact on compile-time?  Memory use?

On Feb 9, 2011, at 12:16 AM, John McCall wrote:

> Author: rjmccall
> Date: Wed Feb  9 02:16:59 2011
> New Revision: 125183
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=125183&view=rev
> Log:
> Remove vtables from the Stmt hierarchy;  this was pretty easy as
> there were only three virtual methods of any significance.
> 
> The primary way to grab child iterators now is with
>  Stmt::child_range children();
>  Stmt::const_child_range children() const;
> where a child_range is just a std::pair of iterators suitable for
> being llvm::tie'd to some locals.  I've left the old child_begin()
> and child_end() accessors in place, but it's probably a substantial
> penalty to grab the iterators individually now, since the
> switch-based dispatch is kindof inherently slower than vtable
> dispatch.  Grabbing them together is probably a slight win over the
> status quo, although of course we could've achieved that with vtables, too.
> 
> I also reclassified SwitchCase (correctly) as an abstract Stmt
> class, which (as the first such class that wasn't an Expr subclass)
> required some fiddling in a few places.
> 
> There are somewhat gross metaprogramming hooks in place to ensure
> that new statements/expressions continue to implement
> getSourceRange() and children().  I had to work around a recent clang
> bug;  dgregor actually fixed it already, but I didn't want to
> introduce a selfhosting dependency on ToT.
> 
> Modified:
>    cfe/trunk/include/clang/AST/Expr.h
>    cfe/trunk/include/clang/AST/ExprCXX.h
>    cfe/trunk/include/clang/AST/ExprObjC.h
>    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>    cfe/trunk/include/clang/AST/Stmt.h
>    cfe/trunk/include/clang/AST/StmtCXX.h
>    cfe/trunk/include/clang/AST/StmtIterator.h
>    cfe/trunk/include/clang/AST/StmtObjC.h
>    cfe/trunk/include/clang/Basic/StmtNodes.td
>    cfe/trunk/lib/AST/Expr.cpp
>    cfe/trunk/lib/AST/ExprCXX.cpp
>    cfe/trunk/lib/AST/ExprClassification.cpp
>    cfe/trunk/lib/AST/ExprConstant.cpp
>    cfe/trunk/lib/AST/ItaniumMangle.cpp
>    cfe/trunk/lib/AST/Stmt.cpp
>    cfe/trunk/lib/AST/StmtPrinter.cpp
>    cfe/trunk/lib/CodeGen/CGStmt.cpp
>    cfe/trunk/lib/Sema/TreeTransform.h
>    cfe/trunk/lib/StaticAnalyzer/Checkers/ExprEngine.cpp
>    cfe/trunk/tools/libclang/CXCursor.cpp
> 
> Modified: cfe/trunk/include/clang/AST/Expr.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Expr.h (original)
> +++ cfe/trunk/include/clang/AST/Expr.h Wed Feb  9 02:16:59 2011
> @@ -54,8 +54,6 @@
> class Expr : public Stmt {
>   QualType TR;
> 
> -  virtual void ANCHOR(); // key function.
> -
> protected:
>   Expr(StmtClass SC, QualType T, ExprValueKind VK, ExprObjectKind OK,
>        bool TD, bool VD, bool ContainsUnexpandedParameterPack) : Stmt(SC) {
> @@ -138,14 +136,9 @@
>     ExprBits.ContainsUnexpandedParameterPack = PP;
>   }
> 
> -  /// SourceLocation tokens are not useful in isolation - they are low level
> -  /// value objects created/interpreted by SourceManager. We assume AST
> -  /// clients will have a pointer to the respective SourceManager.
> -  virtual SourceRange getSourceRange() const = 0;
> -
>   /// getExprLoc - Return the preferred location for the arrow when diagnosing
>   /// a problem with a generic expression.
> -  virtual SourceLocation getExprLoc() const { return getLocStart(); }
> +  SourceLocation getExprLoc() const;
> 
>   /// isUnusedResultAWarning - Return true if this immediate expression should
>   /// be warned about if the result is unused.  If so, fill in Loc and Ranges
> @@ -682,7 +675,7 @@
> 
>   SourceLocation getLocation() const { return Loc; }
>   void setLocation(SourceLocation L) { Loc = L; }
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   /// \brief Determine whether this declaration reference was preceded by a
>   /// C++ nested-name-specifier, e.g., \c N::foo.
> @@ -786,8 +779,7 @@
>   static bool classof(const DeclRefExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> 
>   friend class ASTStmtReader;
>   friend class ASTStmtWriter;
> @@ -827,7 +819,7 @@
> 
>   static std::string ComputeName(IdentType IT, const Decl *CurrentDecl);
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
> +  SourceRange getSourceRange() const { return SourceRange(Loc); }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == PredefinedExprClass;
> @@ -835,8 +827,7 @@
>   static bool classof(const PredefinedExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// \brief Used by IntegerLiteral/FloatingLiteral to store the numeric without
> @@ -913,7 +904,7 @@
>   static IntegerLiteral *Create(ASTContext &C, EmptyShell Empty);
> 
>   llvm::APInt getValue() const { return Num.getValue(); }
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
> +  SourceRange getSourceRange() const { return SourceRange(Loc); }
> 
>   /// \brief Retrieve the location of the literal.
>   SourceLocation getLocation() const { return Loc; }
> @@ -927,8 +918,7 @@
>   static bool classof(const IntegerLiteral *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> class CharacterLiteral : public Expr {
> @@ -949,7 +939,7 @@
>   SourceLocation getLocation() const { return Loc; }
>   bool isWide() const { return IsWide; }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
> +  SourceRange getSourceRange() const { return SourceRange(Loc); }
> 
>   unsigned getValue() const { return Value; }
> 
> @@ -963,8 +953,7 @@
>   static bool classof(const CharacterLiteral *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> class FloatingLiteral : public Expr {
> @@ -1005,7 +994,7 @@
>   SourceLocation getLocation() const { return Loc; }
>   void setLocation(SourceLocation L) { Loc = L; }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
> +  SourceRange getSourceRange() const { return SourceRange(Loc); }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == FloatingLiteralClass;
> @@ -1013,8 +1002,7 @@
>   static bool classof(const FloatingLiteral *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// ImaginaryLiteral - We support imaginary integer and floating point literals,
> @@ -1038,15 +1026,14 @@
>   Expr *getSubExpr() { return cast<Expr>(Val); }
>   void setSubExpr(Expr *E) { Val = E; }
> 
> -  virtual SourceRange getSourceRange() const { return Val->getSourceRange(); }
> +  SourceRange getSourceRange() const { return Val->getSourceRange(); }
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == ImaginaryLiteralClass;
>   }
>   static bool classof(const ImaginaryLiteral *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Val, &Val+1); }
> };
> 
> /// StringLiteral - This represents a string literal expression, e.g. "foo"
> @@ -1139,7 +1126,7 @@
>   tokloc_iterator tokloc_begin() const { return TokLocs; }
>   tokloc_iterator tokloc_end() const { return TokLocs+NumConcatenated; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(TokLocs[0], TokLocs[NumConcatenated-1]);
>   }
>   static bool classof(const Stmt *T) {
> @@ -1148,8 +1135,7 @@
>   static bool classof(const StringLiteral *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// ParenExpr - This represents a parethesized expression, e.g. "(1)".  This
> @@ -1173,7 +1159,7 @@
>   Expr *getSubExpr() { return cast<Expr>(Val); }
>   void setSubExpr(Expr *E) { Val = E; }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(L, R); }
> +  SourceRange getSourceRange() const { return SourceRange(L, R); }
> 
>   /// \brief Get the location of the left parentheses '('.
>   SourceLocation getLParen() const { return L; }
> @@ -1189,8 +1175,7 @@
>   static bool classof(const ParenExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Val, &Val+1); }
> };
> 
> 
> @@ -1271,13 +1256,13 @@
>   /// the given unary opcode.
>   static OverloadedOperatorKind getOverloadedOperator(Opcode Opc);
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     if (isPostfix())
>       return SourceRange(Val->getLocStart(), Loc);
>     else
>       return SourceRange(Loc, Val->getLocEnd());
>   }
> -  virtual SourceLocation getExprLoc() const { return Loc; }
> +  SourceLocation getExprLoc() const { return Loc; }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == UnaryOperatorClass;
> @@ -1285,8 +1270,7 @@
>   static bool classof(const UnaryOperator *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Val, &Val+1); }
> };
> 
> /// OffsetOfExpr - [C99 7.17] - This represents an expression of the form
> @@ -1473,7 +1457,7 @@
>     return NumExprs;
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(OperatorLoc, RParenLoc);
>   }
> 
> @@ -1484,8 +1468,12 @@
>   static bool classof(const OffsetOfExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    Stmt **begin =
> +      reinterpret_cast<Stmt**>(reinterpret_cast<OffsetOfNode*>(this + 1)
> +                               + NumComps);
> +    return child_range(begin, begin + NumExprs);
> +  }
> };
> 
> /// SizeOfAlignOfExpr - [C99 6.5.3.4] - This is for sizeof/alignof, both of
> @@ -1565,7 +1553,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(OpLoc, RParenLoc);
>   }
> 
> @@ -1575,8 +1563,7 @@
>   static bool classof(const SizeOfAlignOfExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children();
> };
> 
> //===----------------------------------------------------------------------===//
> @@ -1639,14 +1626,14 @@
>     return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS());
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(getLHS()->getLocStart(), RBracketLoc);
>   }
> 
>   SourceLocation getRBracketLoc() const { return RBracketLoc; }
>   void setRBracketLoc(SourceLocation L) { RBracketLoc = L; }
> 
> -  virtual SourceLocation getExprLoc() const { return getBase()->getExprLoc(); }
> +  SourceLocation getExprLoc() const { return getBase()->getExprLoc(); }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == ArraySubscriptExprClass;
> @@ -1654,8 +1641,9 @@
>   static bool classof(const ArraySubscriptExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> };
> 
> 
> @@ -1775,7 +1763,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(getCallee()->getLocStart(), RParenLoc);
>   }
> 
> @@ -1786,8 +1774,10 @@
>   static bool classof(const CallExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0],
> +                       &SubExprs[0]+NumArgs+getNumPreArgs()+PREARGS_START);
> +  }
> };
> 
> /// MemberExpr - [C99 6.5.2.3] Structure and Union Members.  X->F and X.F.
> @@ -2007,7 +1997,7 @@
>   SourceLocation getMemberLoc() const { return MemberLoc; }
>   void setMemberLoc(SourceLocation L) { MemberLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     // If we have an implicit base (like a C++ implicit this),
>     // make sure not to return its location
>     SourceLocation EndLoc = (HasExplicitTemplateArgumentList)
> @@ -2019,7 +2009,7 @@
>     return SourceRange(BaseLoc, EndLoc);
>   }
> 
> -  virtual SourceLocation getExprLoc() const { return MemberLoc; }
> +  SourceLocation getExprLoc() const { return MemberLoc; }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == MemberExprClass;
> @@ -2027,8 +2017,7 @@
>   static bool classof(const MemberExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Base, &Base+1); }
> 
>   friend class ASTReader;
>   friend class ASTStmtWriter;
> @@ -2073,7 +2062,7 @@
>   TypeSourceInfo *getTypeSourceInfo() const { return TInfo; }
>   void setTypeSourceInfo(TypeSourceInfo* tinfo) { TInfo = tinfo; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     // FIXME: Init should never be null.
>     if (!Init)
>       return SourceRange();
> @@ -2088,8 +2077,7 @@
>   static bool classof(const CompoundLiteralExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Init, &Init+1); }
> };
> 
> /// CastExpr - Base class for type casts, including both implicit
> @@ -2228,8 +2216,7 @@
>   static bool classof(const CastExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Op, &Op+1); }
> };
> 
> /// ImplicitCastExpr - Allows us to explicitly represent implicit type
> @@ -2277,7 +2264,7 @@
> 
>   static ImplicitCastExpr *CreateEmpty(ASTContext &Context, unsigned PathSize);
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return getSubExpr()->getSourceRange();
>   }
> 
> @@ -2367,7 +2354,7 @@
>   SourceLocation getRParenLoc() const { return RPLoc; }
>   void setRParenLoc(SourceLocation L) { RPLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(LPLoc, getSubExpr()->getSourceRange().getEnd());
>   }
>   static bool classof(const Stmt *T) {
> @@ -2436,7 +2423,7 @@
>   Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
>   void setRHS(Expr *E) { SubExprs[RHS] = E; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(getLHS()->getLocStart(), getRHS()->getLocEnd());
>   }
> 
> @@ -2503,8 +2490,9 @@
>   static bool classof(const BinaryOperator *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> 
> protected:
>   BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy,
> @@ -2636,7 +2624,7 @@
>   SourceLocation getColonLoc() const { return ColonLoc; }
>   void setColonLoc(SourceLocation L) { ColonLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd());
>   }
>   static bool classof(const Stmt *T) {
> @@ -2645,8 +2633,9 @@
>   static bool classof(const ConditionalOperator *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> };
> 
> /// AddrLabelExpr - The GNU address of label extension, representing &&label.
> @@ -2668,7 +2657,7 @@
>   SourceLocation getLabelLoc() const { return LabelLoc; }
>   void setLabelLoc(SourceLocation L) { LabelLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AmpAmpLoc, LabelLoc);
>   }
> 
> @@ -2681,8 +2670,7 @@
>   static bool classof(const AddrLabelExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
> @@ -2709,7 +2697,7 @@
>   const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); }
>   void setSubStmt(CompoundStmt *S) { SubStmt = S; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(LParenLoc, RParenLoc);
>   }
> 
> @@ -2724,8 +2712,7 @@
>   static bool classof(const StmtExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&SubStmt, &SubStmt+1); }
> };
> 
> 
> @@ -2760,7 +2747,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(BuiltinLoc, RParenLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -2794,8 +2781,9 @@
>   }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+NumExprs);
> +  }
> };
> 
> /// ChooseExpr - GNU builtin-in function __builtin_choose_expr.
> @@ -2851,7 +2839,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(BuiltinLoc, RParenLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -2860,8 +2848,9 @@
>   static bool classof(const ChooseExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> };
> 
> /// GNUNullExpr - Implements the GNU __null extension, which is a name
> @@ -2886,7 +2875,7 @@
>   SourceLocation getTokenLocation() const { return TokenLoc; }
>   void setTokenLocation(SourceLocation L) { TokenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(TokenLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -2895,8 +2884,7 @@
>   static bool classof(const GNUNullExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// VAArgExpr, used for the builtin function __builtin_va_arg.
> @@ -2931,7 +2919,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(BuiltinLoc, RParenLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -2940,8 +2928,7 @@
>   static bool classof(const VAArgExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Val, &Val+1); }
> };
> 
> /// @brief Describes an C or C++ initializer list.
> @@ -3080,7 +3067,7 @@
>     HadArrayRangeDesignator = ARD;
>   }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == InitListExprClass;
> @@ -3088,8 +3075,10 @@
>   static bool classof(const InitListExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    if (InitExprs.empty()) return child_range();
> +    return child_range(&InitExprs[0], &InitExprs[0] + InitExprs.size());
> +  }
> 
>   typedef InitExprsTy::iterator iterator;
>   typedef InitExprsTy::const_iterator const_iterator;
> @@ -3390,7 +3379,7 @@
>   void ExpandDesignator(ASTContext &C, unsigned Idx, const Designator *First,
>                         const Designator *Last);
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == DesignatedInitExprClass;
> @@ -3398,8 +3387,10 @@
>   static bool classof(const DesignatedInitExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    Stmt **begin = reinterpret_cast<Stmt**>(this + 1);
> +    return child_range(begin, begin + NumSubExprs);
> +  }
> };
> 
> /// \brief Represents an implicitly-generated value initialization of
> @@ -3425,13 +3416,12 @@
>   }
>   static bool classof(const ImplicitValueInitExpr *) { return true; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange();
>   }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> 
> @@ -3464,7 +3454,7 @@
>   SourceLocation getLParenLoc() const { return LParenLoc; }
>   SourceLocation getRParenLoc() const { return RParenLoc; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(LParenLoc, RParenLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -3473,8 +3463,9 @@
>   static bool classof(const ParenListExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&Exprs[0], &Exprs[0]+NumExprs);
> +  }
> 
>   friend class ASTStmtReader;
>   friend class ASTStmtWriter;
> @@ -3531,7 +3522,7 @@
>   /// aggregate Constant of ConstantInt(s).
>   void getEncodedElementAccess(llvm::SmallVectorImpl<unsigned> &Elts) const;
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(getBase()->getLocStart(), AccessorLoc);
>   }
> 
> @@ -3545,8 +3536,7 @@
>   static bool classof(const ExtVectorElementExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Base, &Base+1); }
> };
> 
> 
> @@ -3573,7 +3563,7 @@
>   const Stmt *getBody() const;
>   Stmt *getBody();
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(getCaretLocation(), getBody()->getLocEnd());
>   }
> 
> @@ -3586,8 +3576,7 @@
>   static bool classof(const BlockExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// BlockDeclRefExpr - A reference to a local variable declared in an
> @@ -3613,7 +3602,7 @@
>   SourceLocation getLocation() const { return Loc; }
>   void setLocation(SourceLocation L) { Loc = L; }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
> +  SourceRange getSourceRange() const { return SourceRange(Loc); }
> 
>   bool isByRef() const { return IsByRef; }
>   void setByRef(bool BR) { IsByRef = BR; }
> @@ -3627,8 +3616,7 @@
>   static bool classof(const BlockDeclRefExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// OpaqueValueExpr - An expression referring to an opaque object of a
> @@ -3654,9 +3642,8 @@
>   /// \brief Retrieve the location of this expression.
>   SourceLocation getLocation() const { return Loc; }
> 
> -  virtual SourceRange getSourceRange() const;
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  SourceRange getSourceRange() const { return Loc; }
> +  child_range children() { return child_range(); }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == OpaqueValueExprClass;
> 
> Modified: cfe/trunk/include/clang/AST/ExprCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ExprCXX.h (original)
> +++ cfe/trunk/include/clang/AST/ExprCXX.h Wed Feb  9 02:16:59 2011
> @@ -71,7 +71,7 @@
>   /// bracket.
>   SourceLocation getOperatorLoc() const { return getRParenLoc(); }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == CXXOperatorCallExprClass;
> @@ -108,7 +108,7 @@
>   /// FIXME: Returns 0 for member pointer call exprs.
>   CXXRecordDecl *getRecordDecl();
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == CXXMemberCallExprClass;
> @@ -151,7 +151,7 @@
>   /// \brief Retrieve the location of the closing parenthesis.
>   SourceLocation getRParenLoc() const { return RParenLoc; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(Loc, RParenLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -306,7 +306,7 @@
>   bool getValue() const { return Value; }
>   void setValue(bool V) { Value = V; }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
> +  SourceRange getSourceRange() const { return SourceRange(Loc); }
> 
>   SourceLocation getLocation() const { return Loc; }
>   void setLocation(SourceLocation L) { Loc = L; }
> @@ -317,8 +317,7 @@
>   static bool classof(const CXXBoolLiteralExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// CXXNullPtrLiteralExpr - [C++0x 2.14.7] C++ Pointer Literal
> @@ -333,7 +332,7 @@
>   explicit CXXNullPtrLiteralExpr(EmptyShell Empty)
>     : Expr(CXXNullPtrLiteralExprClass, Empty) { }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
> +  SourceRange getSourceRange() const { return SourceRange(Loc); }
> 
>   SourceLocation getLocation() const { return Loc; }
>   void setLocation(SourceLocation L) { Loc = L; }
> @@ -343,8 +342,7 @@
>   }
>   static bool classof(const CXXNullPtrLiteralExpr *) { return true; }
> 
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// CXXTypeidExpr - A C++ @c typeid expression (C++ [expr.typeid]), which gets
> @@ -411,7 +409,7 @@
>     Operand = E;
>   }
> 
> -  virtual SourceRange getSourceRange() const { return Range; }
> +  SourceRange getSourceRange() const { return Range; }
>   void setSourceRange(SourceRange R) { Range = R; }
> 
>   static bool classof(const Stmt *T) {
> @@ -420,8 +418,11 @@
>   static bool classof(const CXXTypeidExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    if (isTypeOperand()) return child_range();
> +    Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
> +    return child_range(begin, begin + 1);
> +  }
> };
> 
> /// CXXUuidofExpr - A microsoft C++ @c __uuidof expression, which gets
> @@ -481,7 +482,7 @@
>     Operand = E;
>   }
> 
> -  virtual SourceRange getSourceRange() const { return Range; }
> +  SourceRange getSourceRange() const { return Range; }
>   void setSourceRange(SourceRange R) { Range = R; }
> 
>   static bool classof(const Stmt *T) {
> @@ -490,8 +491,11 @@
>   static bool classof(const CXXUuidofExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    if (isTypeOperand()) return child_range();
> +    Stmt **begin = reinterpret_cast<Stmt**>(&Operand);
> +    return child_range(begin, begin + 1);
> +  }
> };
> 
> /// CXXThisExpr - Represents the "this" expression in C++, which is a
> @@ -523,7 +527,7 @@
>   SourceLocation getLocation() const { return Loc; }
>   void setLocation(SourceLocation L) { Loc = L; }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
> +  SourceRange getSourceRange() const { return SourceRange(Loc); }
> 
>   bool isImplicit() const { return Implicit; }
>   void setImplicit(bool I) { Implicit = I; }
> @@ -534,8 +538,7 @@
>   static bool classof(const CXXThisExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> ///  CXXThrowExpr - [C++ 15] C++ Throw Expression.  This handles
> @@ -562,7 +565,7 @@
>   SourceLocation getThrowLoc() const { return ThrowLoc; }
>   void setThrowLoc(SourceLocation L) { ThrowLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     if (getSubExpr() == 0)
>       return SourceRange(ThrowLoc, ThrowLoc);
>     return SourceRange(ThrowLoc, getSubExpr()->getSourceRange().getEnd());
> @@ -574,8 +577,9 @@
>   static bool classof(const CXXThrowExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&Op, Op ? &Op+1 : &Op);
> +  }
> };
> 
> /// CXXDefaultArgExpr - C++ [dcl.fct.default]. This wraps up a
> @@ -649,7 +653,7 @@
>   /// used.
>   SourceLocation getUsedLocation() const { return Loc; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     // Default argument expressions have no representation in the
>     // source, so they have an empty source range.
>     return SourceRange();
> @@ -661,8 +665,7 @@
>   static bool classof(const CXXDefaultArgExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> 
>   friend class ASTStmtReader;
>   friend class ASTStmtWriter;
> @@ -724,7 +727,7 @@
>   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
>   void setSubExpr(Expr *E) { SubExpr = E; }
> 
> -  virtual SourceRange getSourceRange() const { 
> +  SourceRange getSourceRange() const { 
>     return SubExpr->getSourceRange();
>   }
> 
> @@ -735,8 +738,7 @@
>   static bool classof(const CXXBindTemporaryExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
> };
> 
> /// CXXConstructExpr - Represents a call to a C++ constructor.
> @@ -842,7 +844,7 @@
>     Args[Arg] = ArgExpr;
>   }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
>   SourceRange getParenRange() const { return ParenRange; }
> 
>   static bool classof(const Stmt *T) {
> @@ -852,8 +854,9 @@
>   static bool classof(const CXXConstructExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&Args[0], &Args[0]+NumArgs);
> +  }
> 
>   friend class ASTStmtReader;
> };
> @@ -893,7 +896,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(TyBeginLoc, RParenLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -931,7 +934,7 @@
> 
>   TypeSourceInfo *getTypeSourceInfo() const { return Type; }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == CXXTemporaryObjectExprClass;
> @@ -970,7 +973,7 @@
> 
>   SourceLocation getRParenLoc() const { return RParenLoc; }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == CXXScalarValueInitExprClass;
> @@ -978,8 +981,7 @@
>   static bool classof(const CXXScalarValueInitExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// CXXNewExpr - A new expression for memory allocation and constructor calls,
> @@ -1152,7 +1154,7 @@
>   SourceLocation getConstructorLParen() const { return ConstructorLParen; }
>   SourceLocation getConstructorRParen() const { return ConstructorRParen; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(StartLoc, EndLoc);
>   }
> 
> @@ -1162,8 +1164,11 @@
>   static bool classof(const CXXNewExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0],
> +                       &SubExprs[0] + Array + getNumPlacementArgs()
> +                         + getNumConstructorArgs());
> +  }
> };
> 
> /// CXXDeleteExpr - A delete expression for memory deallocation and destructor
> @@ -1221,7 +1226,7 @@
>   /// return an invalid type.
>   QualType getDestroyedType() const;
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(Loc, Argument->getLocEnd());
>   }
> 
> @@ -1231,8 +1236,7 @@
>   static bool classof(const CXXDeleteExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Argument, &Argument+1); }
> 
>   friend class ASTStmtReader;
> };
> @@ -1424,7 +1428,7 @@
>     DestroyedType = PseudoDestructorTypeStorage(Info);
>   }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == CXXPseudoDestructorExprClass;
> @@ -1432,8 +1436,7 @@
>   static bool classof(const CXXPseudoDestructorExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Base, &Base + 1); }
> };
> 
> /// UnaryTypeTraitExpr - A GCC or MS unary type trait, as used in the
> @@ -1469,7 +1472,7 @@
>     : Expr(UnaryTypeTraitExprClass, Empty), UTT(0), Value(false),
>       QueriedType() { }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(Loc, RParen);}
> +  SourceRange getSourceRange() const { return SourceRange(Loc, RParen);}
> 
>   UnaryTypeTrait getTrait() const { return static_cast<UnaryTypeTrait>(UTT); }
> 
> @@ -1485,8 +1488,7 @@
>   static bool classof(const UnaryTypeTraitExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> 
>   friend class ASTStmtReader;
> };
> @@ -1531,7 +1533,7 @@
>     : Expr(BinaryTypeTraitExprClass, Empty), BTT(0), Value(false),
>       LhsType(), RhsType() { }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(Loc, RParen);
>   }
> 
> @@ -1553,8 +1555,7 @@
>   static bool classof(const BinaryTypeTraitExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> 
>   friend class ASTStmtReader;
> };
> @@ -1825,15 +1826,14 @@
>     return getExplicitTemplateArgs().NumTemplateArgs;
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     SourceRange Range(getNameInfo().getSourceRange());
>     if (getQualifier()) Range.setBegin(getQualifierRange().getBegin());
>     if (hasExplicitTemplateArgs()) Range.setEnd(getRAngleLoc());
>     return Range;
>   }
> 
> -  virtual StmtIterator child_begin();
> -  virtual StmtIterator child_end();
> +  child_range children() { return child_range(); }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == UnresolvedLookupExprClass;
> @@ -1956,7 +1956,7 @@
>     return getExplicitTemplateArgs().NumTemplateArgs;
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     SourceRange Range(QualifierRange.getBegin(), getLocation());
>     if (hasExplicitTemplateArgs())
>       Range.setEnd(getRAngleLoc());
> @@ -1968,8 +1968,7 @@
>   }
>   static bool classof(const DependentScopeDeclRefExpr *) { return true; }
> 
> -  virtual StmtIterator child_begin();
> -  virtual StmtIterator child_end();
> +  child_range children() { return child_range(); }
> 
>   friend class ASTStmtReader;
>   friend class ASTStmtWriter;
> @@ -2017,7 +2016,7 @@
>   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
>   void setSubExpr(Expr *E) { SubExpr = E; }
> 
> -  virtual SourceRange getSourceRange() const { 
> +  SourceRange getSourceRange() const { 
>     return SubExpr->getSourceRange();
>   }
> 
> @@ -2028,8 +2027,7 @@
>   static bool classof(const ExprWithCleanups *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&SubExpr, &SubExpr + 1); }
> };
> 
> /// \brief Describes an explicit type conversion that uses functional
> @@ -2136,7 +2134,7 @@
>     *(arg_begin() + I) = E;
>   }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == CXXUnresolvedConstructExprClass;
> @@ -2144,8 +2142,10 @@
>   static bool classof(const CXXUnresolvedConstructExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    Stmt **begin = reinterpret_cast<Stmt**>(this+1);
> +    return child_range(begin, begin + NumArgs);
> +  }
> };
> 
> /// \brief Represents a C++ member access expression where the actual
> @@ -2361,7 +2361,7 @@
>     return getExplicitTemplateArgs().RAngleLoc;
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     SourceRange Range;
>     if (!isImplicitAccess())
>       Range.setBegin(Base->getSourceRange().getBegin());
> @@ -2383,8 +2383,10 @@
>   static bool classof(const CXXDependentScopeMemberExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    if (isImplicitAccess()) return child_range();
> +    return child_range(&Base, &Base + 1);
> +  }
> 
>   friend class ASTStmtReader;
>   friend class ASTStmtWriter;
> @@ -2554,7 +2556,7 @@
>     return getExplicitTemplateArgs().RAngleLoc;
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     SourceRange Range = getMemberNameInfo().getSourceRange();
>     if (!isImplicitAccess())
>       Range.setBegin(Base->getSourceRange().getBegin());
> @@ -2572,8 +2574,10 @@
>   static bool classof(const UnresolvedMemberExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    if (isImplicitAccess()) return child_range();
> +    return child_range(&Base, &Base + 1);
> +  }
> };
> 
> /// \brief Represents a C++0x noexcept expression (C++ [expr.unary.noexcept]).
> @@ -2603,7 +2607,7 @@
> 
>   Expr *getOperand() const { return static_cast<Expr*>(Operand); }
> 
> -  virtual SourceRange getSourceRange() const { return Range; }
> +  SourceRange getSourceRange() const { return Range; }
> 
>   bool getValue() const { return Value; }
> 
> @@ -2613,8 +2617,7 @@
>   static bool classof(const CXXNoexceptExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Operand, &Operand + 1); }
> };
> 
> /// \brief Represents a C++0x pack expansion that produces a sequence of 
> @@ -2680,7 +2683,9 @@
>     return llvm::Optional<unsigned>();
>   }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const {
> +    return SourceRange(Pattern->getLocStart(), EllipsisLoc);
> +  }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == PackExpansionExprClass;
> @@ -2688,8 +2693,9 @@
>   static bool classof(const PackExpansionExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&Pattern, &Pattern + 1);
> +  }
> };
> 
> inline ExplicitTemplateArgumentList &OverloadExpr::getExplicitTemplateArgs() {
> @@ -2778,7 +2784,9 @@
>     return Length;
>   }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const {
> +    return SourceRange(OperatorLoc, RParenLoc);
> +  }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == SizeOfPackExprClass;
> @@ -2786,8 +2794,7 @@
>   static bool classof(const SizeOfPackExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// \brief Represents a reference to a non-type template parameter pack that
> @@ -2838,7 +2845,7 @@
>   /// template arguments.
>   TemplateArgument getArgumentPack() const;
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const { return NameLoc; }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == SubstNonTypeTemplateParmPackExprClass;
> @@ -2848,8 +2855,7 @@
>   }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> }  // end namespace clang
> 
> Modified: cfe/trunk/include/clang/AST/ExprObjC.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprObjC.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ExprObjC.h (original)
> +++ cfe/trunk/include/clang/AST/ExprObjC.h Wed Feb  9 02:16:59 2011
> @@ -42,7 +42,7 @@
>   SourceLocation getAtLoc() const { return AtLoc; }
>   void setAtLoc(SourceLocation L) { AtLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AtLoc, String->getLocEnd());
>   }
> 
> @@ -52,8 +52,7 @@
>   static bool classof(const ObjCStringLiteral *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&String, &String+1); }
> };
> 
> /// ObjCEncodeExpr, used for @encode in Objective-C.  @encode has the same type
> @@ -86,7 +85,7 @@
>     EncodedType = EncType; 
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AtLoc, RParenLoc);
>   }
> 
> @@ -96,8 +95,7 @@
>   static bool classof(const ObjCEncodeExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// ObjCSelectorExpr used for @selector in Objective-C.
> @@ -121,7 +119,7 @@
>   void setAtLoc(SourceLocation L) { AtLoc = L; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AtLoc, RParenLoc);
>   }
> 
> @@ -134,8 +132,7 @@
>   static bool classof(const ObjCSelectorExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// ObjCProtocolExpr used for protocol expression in Objective-C.  This is used
> @@ -162,7 +159,7 @@
>   void setAtLoc(SourceLocation L) { AtLoc = L; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AtLoc, RParenLoc);
>   }
> 
> @@ -172,8 +169,7 @@
>   static bool classof(const ObjCProtocolExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// ObjCIvarRefExpr - A reference to an ObjC instance variable.
> @@ -212,7 +208,7 @@
>   SourceLocation getLocation() const { return Loc; }
>   void setLocation(SourceLocation L) { Loc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return isFreeIvar() ? SourceRange(Loc)
>     : SourceRange(getBase()->getLocStart(), Loc);
>   }
> @@ -223,8 +219,7 @@
>   static bool classof(const ObjCIvarRefExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Base, &Base+1); }
> };
> 
> /// ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC
> @@ -349,7 +344,7 @@
>   bool isSuperReceiver() const { return Receiver.is<const Type*>(); }
>   bool isClassReceiver() const { return Receiver.is<ObjCInterfaceDecl*>(); }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange((isObjectReceiver() ? getBase()->getLocStart()
>                                            : getReceiverLocation()), 
>                        IdLoc);
> @@ -361,8 +356,14 @@
>   static bool classof(const ObjCPropertyRefExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    if (Receiver.is<Stmt*>()) {
> +      Stmt **begin = reinterpret_cast<Stmt**>(&Receiver); // hack!
> +      return child_range(begin, begin+1);
> +    }
> +    return child_range();
> +  }
> +
> private:
>   friend class ASTStmtReader;
>   void setExplicitProperty(ObjCPropertyDecl *D) {
> @@ -776,7 +777,7 @@
>     LBracLoc = R.getBegin();
>     RBracLoc = R.getEnd();
>   }
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(LBracLoc, RBracLoc);
>   }
> 
> @@ -786,8 +787,7 @@
>   static bool classof(const ObjCMessageExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children();
> 
>   typedef ExprIterator arg_iterator;
>   typedef ConstExprIterator const_arg_iterator;
> @@ -839,11 +839,11 @@
>   SourceLocation getIsaMemberLoc() const { return IsaMemberLoc; }
>   void setIsaMemberLoc(SourceLocation L) { IsaMemberLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(getBase()->getLocStart(), IsaMemberLoc);
>   }
> 
> -  virtual SourceLocation getExprLoc() const { return IsaMemberLoc; }
> +  SourceLocation getExprLoc() const { return IsaMemberLoc; }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == ObjCIsaExprClass;
> @@ -851,8 +851,7 @@
>   static bool classof(const ObjCIsaExpr *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Base, &Base+1); }
> };
> 
> }  // end namespace clang
> 
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Wed Feb  9 02:16:59 2011
> @@ -1636,7 +1636,6 @@
> DEF_TRAVERSE_STMT(ObjCAtTryStmt, { })
> DEF_TRAVERSE_STMT(ObjCForCollectionStmt, { })
> DEF_TRAVERSE_STMT(ReturnStmt, { })
> -DEF_TRAVERSE_STMT(SwitchCase, { })
> DEF_TRAVERSE_STMT(SwitchStmt, { })
> DEF_TRAVERSE_STMT(WhileStmt, { })
> 
> 
> Modified: cfe/trunk/include/clang/AST/Stmt.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Stmt.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/Stmt.h (original)
> +++ cfe/trunk/include/clang/AST/Stmt.h Wed Feb  9 02:16:59 2011
> @@ -182,6 +182,9 @@
>   };
> 
>   union {
> +    // FIXME: this is wasteful on 64-bit platforms.
> +    void *Aligner;
> +
>     StmtBitfields StmtBits;
>     CompoundStmtBitfields CompoundStmtBits;
>     LabelStmtBitfields LabelStmtBits;
> @@ -232,7 +235,6 @@
>     StmtBits.sClass = SC;
>     if (Stmt::CollectingStats()) Stmt::addStmtClass(SC);
>   }
> -  virtual ~Stmt() {}
> 
>   StmtClass getStmtClass() const { 
>     return static_cast<StmtClass>(StmtBits.sClass);
> @@ -242,7 +244,8 @@
>   /// SourceLocation tokens are not useful in isolation - they are low level
>   /// value objects created/interpreted by SourceManager. We assume AST
>   /// clients will have a pointer to the respective SourceManager.
> -  virtual SourceRange getSourceRange() const = 0;
> +  SourceRange getSourceRange() const;
> +
>   SourceLocation getLocStart() const { return getSourceRange().getBegin(); }
>   SourceLocation getLocEnd() const { return getSourceRange().getEnd(); }
> 
> @@ -289,22 +292,25 @@
>   ///  within CFGs.
>   bool hasImplicitControlFlow() const;
> 
> -  /// Child Iterators: All subclasses must implement child_begin and child_end
> -  ///  to permit easy iteration over the substatements/subexpessions of an
> -  ///  AST node.  This permits easy iteration over all nodes in the AST.
> +  /// Child Iterators: All subclasses must implement 'children'
> +  /// to permit easy iteration over the substatements/subexpessions of an
> +  /// AST node.  This permits easy iteration over all nodes in the AST.
>   typedef StmtIterator       child_iterator;
>   typedef ConstStmtIterator  const_child_iterator;
> 
> -  virtual child_iterator child_begin() = 0;
> -  virtual child_iterator child_end()   = 0;
> +  typedef StmtRange          child_range;
> +  typedef ConstStmtRange     const_child_range;
> 
> -  const_child_iterator child_begin() const {
> -    return const_child_iterator(const_cast<Stmt*>(this)->child_begin());
> +  child_range children();
> +  const_child_range children() const {
> +    return const_cast<Stmt*>(this)->children();
>   }
> 
> -  const_child_iterator child_end() const {
> -    return const_child_iterator(const_cast<Stmt*>(this)->child_end());
> -  }
> +  child_iterator child_begin() { return children().first; }
> +  child_iterator child_end() { return children().second; }
> +
> +  const_child_iterator child_begin() const { return children().first; }
> +  const_child_iterator child_end() const { return children().second; }
> 
>   /// \brief Produce a unique representation of the given statement.
>   ///
> @@ -367,8 +373,10 @@
>   static bool classof(const DeclStmt *) { return true; }
> 
>   // Iterators over subexpressions.
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(child_iterator(DG.begin(), DG.end()),
> +                       child_iterator(DG.end(), DG.end()));
> +  }
> 
>   typedef DeclGroupRef::iterator decl_iterator;
>   typedef DeclGroupRef::const_iterator const_decl_iterator;
> @@ -402,16 +410,14 @@
> 
>   bool hasLeadingEmptyMacro() const { return LeadingEmptyMacro; }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(SemiLoc); }
> +  SourceRange getSourceRange() const { return SourceRange(SemiLoc); }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == NullStmtClass;
>   }
>   static bool classof(const NullStmt *) { return true; }
> 
> -  // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> 
>   friend class ASTStmtReader;
>   friend class ASTStmtWriter;
> @@ -482,7 +488,7 @@
>     return const_reverse_body_iterator(body_begin());
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(LBracLoc, RBracLoc);
>   }
> 
> @@ -497,8 +503,9 @@
>   static bool classof(const CompoundStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&Body[0], &Body[0]+CompoundStmtBits.NumStmts);
> +  }
> };
> 
> // SwitchCase is the base class for CaseStmt and DefaultStmt,
> @@ -517,17 +524,15 @@
> 
>   void setNextSwitchCase(SwitchCase *SC) { NextSwitchCase = SC; }
> 
> -  Stmt *getSubStmt() { return v_getSubStmt(); }
> +  Stmt *getSubStmt();
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(); }
> +  SourceRange getSourceRange() const { return SourceRange(); }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == CaseStmtClass ||
> -    T->getStmtClass() == DefaultStmtClass;
> +           T->getStmtClass() == DefaultStmtClass;
>   }
>   static bool classof(const SwitchCase *) { return true; }
> -protected:
> -  virtual Stmt* v_getSubStmt() = 0;
> };
> 
> class CaseStmt : public SwitchCase {
> @@ -537,8 +542,6 @@
>   SourceLocation CaseLoc;
>   SourceLocation EllipsisLoc;
>   SourceLocation ColonLoc;
> -
> -  virtual Stmt* v_getSubStmt() { return getSubStmt(); }
> public:
>   CaseStmt(Expr *lhs, Expr *rhs, SourceLocation caseLoc,
>            SourceLocation ellipsisLoc, SourceLocation colonLoc)
> @@ -578,7 +581,7 @@
>   void setRHS(Expr *Val) { SubExprs[RHS] = reinterpret_cast<Stmt*>(Val); }
> 
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     // Handle deeply nested case statements with iteration instead of recursion.
>     const CaseStmt *CS = this;
>     while (const CaseStmt *CS2 = dyn_cast<CaseStmt>(CS->getSubStmt()))
> @@ -592,15 +595,15 @@
>   static bool classof(const CaseStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[END_EXPR]);
> +  }
> };
> 
> class DefaultStmt : public SwitchCase {
>   Stmt* SubStmt;
>   SourceLocation DefaultLoc;
>   SourceLocation ColonLoc;
> -  virtual Stmt* v_getSubStmt() { return getSubStmt(); }
> public:
>   DefaultStmt(SourceLocation DL, SourceLocation CL, Stmt *substmt) :
>     SwitchCase(DefaultStmtClass), SubStmt(substmt), DefaultLoc(DL),
> @@ -618,7 +621,7 @@
>   SourceLocation getColonLoc() const { return ColonLoc; }
>   void setColonLoc(SourceLocation L) { ColonLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(DefaultLoc, SubStmt->getLocEnd());
>   }
>   static bool classof(const Stmt *T) {
> @@ -627,8 +630,7 @@
>   static bool classof(const DefaultStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&SubStmt, &SubStmt+1); }
> };
> 
> class LabelStmt : public Stmt {
> @@ -665,17 +667,15 @@
>   bool HasUnusedAttribute() const { return LabelStmtBits.HasUnusedAttr; }
>   void setUnusedAttribute(bool U) { LabelStmtBits.HasUnusedAttr = U; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(IdentLoc, SubStmt->getLocEnd());
>   }
> +  child_range children() { return child_range(&SubStmt, &SubStmt+1); }
> +
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == LabelStmtClass;
>   }
>   static bool classof(const LabelStmt *) { return true; }
> -
> -  // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> };
> 
> 
> @@ -722,22 +722,23 @@
>   SourceLocation getElseLoc() const { return ElseLoc; }
>   void setElseLoc(SourceLocation L) { ElseLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     if (SubExprs[ELSE])
>       return SourceRange(IfLoc, SubExprs[ELSE]->getLocEnd());
>     else
>       return SourceRange(IfLoc, SubExprs[THEN]->getLocEnd());
>   }
> 
> +  // Iterators over subexpressions.  The iterators will include iterating
> +  // over the initialization expression referenced by the condition variable.
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> +
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == IfStmtClass;
>   }
>   static bool classof(const IfStmt *) { return true; }
> -
> -  // 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();
> };
> 
> /// SwitchStmt - This represents a 'switch' stmt.
> @@ -813,17 +814,18 @@
>     return (bool) AllEnumCasesCovered;
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(SwitchLoc, SubExprs[BODY]->getLocEnd());
>   }
> +  // Iterators
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> +
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == SwitchStmtClass;
>   }
>   static bool classof(const SwitchStmt *) { return true; }
> -
> -  // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> };
> 
> 
> @@ -861,7 +863,7 @@
>   SourceLocation getWhileLoc() const { return WhileLoc; }
>   void setWhileLoc(SourceLocation L) { WhileLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(WhileLoc, SubExprs[BODY]->getLocEnd());
>   }
>   static bool classof(const Stmt *T) {
> @@ -870,8 +872,9 @@
>   static bool classof(const WhileStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> };
> 
> /// DoStmt - This represents a 'do/while' stmt.
> @@ -909,7 +912,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(DoLoc, RParenLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -918,8 +921,9 @@
>   static bool classof(const DoStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> };
> 
> 
> @@ -974,7 +978,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(ForLoc, SubExprs[BODY]->getLocEnd());
>   }
>   static bool classof(const Stmt *T) {
> @@ -983,8 +987,9 @@
>   static bool classof(const ForStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[0]+END_EXPR);
> +  }
> };
> 
> /// GotoStmt - This represents a direct goto.
> @@ -1008,7 +1013,7 @@
>   SourceLocation getLabelLoc() const { return LabelLoc; }
>   void setLabelLoc(SourceLocation L) { LabelLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(GotoLoc, LabelLoc);
>   }
>   static bool classof(const Stmt *T) {
> @@ -1017,8 +1022,7 @@
>   static bool classof(const GotoStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// IndirectGotoStmt - This represents an indirect goto.
> @@ -1053,7 +1057,7 @@
>     return const_cast<IndirectGotoStmt*>(this)->getConstantTarget();
>   }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(GotoLoc, Target->getLocEnd());
>   }
> 
> @@ -1063,8 +1067,7 @@
>   static bool classof(const IndirectGotoStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Target, &Target+1); }
> };
> 
> 
> @@ -1081,7 +1084,7 @@
>   SourceLocation getContinueLoc() const { return ContinueLoc; }
>   void setContinueLoc(SourceLocation L) { ContinueLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(ContinueLoc);
>   }
> 
> @@ -1091,8 +1094,7 @@
>   static bool classof(const ContinueStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> /// BreakStmt - This represents a break.
> @@ -1108,7 +1110,7 @@
>   SourceLocation getBreakLoc() const { return BreakLoc; }
>   void setBreakLoc(SourceLocation L) { BreakLoc = L; }
> 
> -  virtual SourceRange getSourceRange() const { return SourceRange(BreakLoc); }
> +  SourceRange getSourceRange() const { return SourceRange(BreakLoc); }
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == BreakStmtClass;
> @@ -1116,8 +1118,7 @@
>   static bool classof(const BreakStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(); }
> };
> 
> 
> @@ -1161,7 +1162,7 @@
>   const VarDecl *getNRVOCandidate() const { return NRVOCandidate; }
>   void setNRVOCandidate(const VarDecl *Var) { NRVOCandidate = Var; }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == ReturnStmtClass;
> @@ -1169,8 +1170,10 @@
>   static bool classof(const ReturnStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    if (RetExpr) return child_range(&RetExpr, &RetExpr+1);
> +    return child_range();
> +  }
> };
> 
> /// AsmStmt - This represents a GNU inline-assembly statement extension.
> @@ -1368,7 +1371,7 @@
>   StringLiteral *getClobber(unsigned i) { return Clobbers[i]; }
>   const StringLiteral *getClobber(unsigned i) const { return Clobbers[i]; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AsmLoc, RParenLoc);
>   }
> 
> @@ -1415,10 +1418,9 @@
>     return &Exprs[0] + NumOutputs;
>   }
> 
> -  // Child iterators
> -
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&Exprs[0], &Exprs[0] + NumOutputs + NumInputs);
> +  }
> };
> 
> }  // end namespace clang
> 
> Modified: cfe/trunk/include/clang/AST/StmtCXX.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtCXX.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/StmtCXX.h (original)
> +++ cfe/trunk/include/clang/AST/StmtCXX.h Wed Feb  9 02:16:59 2011
> @@ -37,7 +37,7 @@
>   CXXCatchStmt(EmptyShell Empty)
>   : Stmt(CXXCatchStmtClass), ExceptionDecl(0), HandlerBlock(0) {}
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(CatchLoc, HandlerBlock->getLocEnd());
>   }
> 
> @@ -51,8 +51,7 @@
>   }
>   static bool classof(const CXXCatchStmt *) { return true; }
> 
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&HandlerBlock, &HandlerBlock+1); }
> 
>   friend class ASTStmtReader;
> };
> @@ -84,7 +83,7 @@
>   static CXXTryStmt *Create(ASTContext &C, EmptyShell Empty,
>                             unsigned numHandlers);
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(getTryLoc(), getEndLoc());
>   }
> 
> @@ -113,8 +112,9 @@
>   }
>   static bool classof(const CXXTryStmt *) { return true; }
> 
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(getStmts(), getStmts() + getNumHandlers() + 1);
> +  }
> 
>   friend class ASTStmtReader;
> };
> 
> Modified: cfe/trunk/include/clang/AST/StmtIterator.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtIterator.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/StmtIterator.h (original)
> +++ cfe/trunk/include/clang/AST/StmtIterator.h Wed Feb  9 02:16:59 2011
> @@ -1,4 +1,4 @@
> -//===--- StmtIterator.h - Iterators for Statements ------------------------===//
> +//===--- StmtIterator.h - Iterators for Statements --------------*- C++ -*-===//
> //
> //                     The LLVM Compiler Infrastructure
> //
> @@ -146,6 +146,15 @@
>     StmtIteratorImpl<ConstStmtIterator,const Stmt*>(RHS) {}
> };
> 
> +typedef std::pair<StmtIterator,StmtIterator> StmtRange;
> +typedef std::pair<ConstStmtIterator,ConstStmtIterator> ConstStmtRange;
> +
> +inline StmtIterator begin(StmtRange range) { return range.first; }
> +inline StmtIterator end(StmtRange range) { return range.second; }
> +
> +inline ConstStmtIterator begin(ConstStmtRange range) { return range.first; }
> +inline ConstStmtIterator end(ConstStmtRange range) { return range.second; }
> +
> } // end namespace clang
> 
> #endif
> 
> Modified: cfe/trunk/include/clang/AST/StmtObjC.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtObjC.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/StmtObjC.h (original)
> +++ cfe/trunk/include/clang/AST/StmtObjC.h Wed Feb  9 02:16:59 2011
> @@ -55,7 +55,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation Loc) { RParenLoc = Loc; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(ForLoc, SubExprs[BODY]->getLocEnd());
>   }
>   static bool classof(const Stmt *T) {
> @@ -64,8 +64,9 @@
>   static bool classof(const ObjCForCollectionStmt *) { return true; }
> 
>   // Iterators
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubExprs[0], &SubExprs[END_EXPR]);
> +  }
> };
> 
> /// ObjCAtCatchStmt - This represents objective-c's @catch statement.
> @@ -102,7 +103,7 @@
>   SourceLocation getRParenLoc() const { return RParenLoc; }
>   void setRParenLoc(SourceLocation Loc) { RParenLoc = Loc; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AtCatchLoc, Body->getLocEnd());
>   }
> 
> @@ -113,8 +114,7 @@
>   }
>   static bool classof(const ObjCAtCatchStmt *) { return true; }
> 
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Body, &Body + 1); }
> };
> 
> /// ObjCAtFinallyStmt - This represent objective-c's @finally Statement
> @@ -133,7 +133,7 @@
>   Stmt *getFinallyBody() { return AtFinallyStmt; }
>   void setFinallyBody(Stmt *S) { AtFinallyStmt = S; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AtFinallyLoc, AtFinallyStmt->getLocEnd());
>   }
> 
> @@ -145,8 +145,9 @@
>   }
>   static bool classof(const ObjCAtFinallyStmt *) { return true; }
> 
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&AtFinallyStmt, &AtFinallyStmt+1);
> +  }
> };
> 
> /// ObjCAtTryStmt - This represent objective-c's over-all
> @@ -239,15 +240,17 @@
>     getStmts()[1 + NumCatchStmts] = S; 
>   }
> 
> -  virtual SourceRange getSourceRange() const;
> +  SourceRange getSourceRange() const;
> 
>   static bool classof(const Stmt *T) {
>     return T->getStmtClass() == ObjCAtTryStmtClass;
>   }
>   static bool classof(const ObjCAtTryStmt *) { return true; }
> 
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(getStmts(),
> +                       getStmts() + 1 + NumCatchStmts + HasFinally);
> +  }
> };
> 
> /// ObjCAtSynchronizedStmt - This is for objective-c's @synchronized statement.
> @@ -291,7 +294,7 @@
>   }
>   void setSynchExpr(Stmt *S) { SubStmts[SYNC_EXPR] = S; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     return SourceRange(AtSynchronizedLoc, getSynchBody()->getLocEnd());
>   }
> 
> @@ -300,8 +303,9 @@
>   }
>   static bool classof(const ObjCAtSynchronizedStmt *) { return true; }
> 
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() {
> +    return child_range(&SubStmts[0], &SubStmts[0]+END_EXPR);
> +  }
> };
> 
> /// ObjCAtThrowStmt - This represents objective-c's @throw statement.
> @@ -323,7 +327,7 @@
>   SourceLocation getThrowLoc() { return AtThrowLoc; }
>   void setThrowLoc(SourceLocation Loc) { AtThrowLoc = Loc; }
> 
> -  virtual SourceRange getSourceRange() const {
> +  SourceRange getSourceRange() const {
>     if (Throw)
>       return SourceRange(AtThrowLoc, Throw->getLocEnd());
>     else
> @@ -335,8 +339,7 @@
>   }
>   static bool classof(const ObjCAtThrowStmt *) { return true; }
> 
> -  virtual child_iterator child_begin();
> -  virtual child_iterator child_end();
> +  child_range children() { return child_range(&Throw, &Throw+1); }
> };
> 
> }  // end namespace clang
> 
> Modified: cfe/trunk/include/clang/Basic/StmtNodes.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/StmtNodes.td (original)
> +++ cfe/trunk/include/clang/Basic/StmtNodes.td Wed Feb  9 02:16:59 2011
> @@ -23,7 +23,7 @@
> def BreakStmt : Stmt;
> def ReturnStmt : Stmt;
> def DeclStmt  : Stmt;
> -def SwitchCase : Stmt;
> +def SwitchCase : Stmt<1>;
> def CaseStmt : DStmt<SwitchCase>;
> def DefaultStmt : DStmt<SwitchCase>;
> 
> 
> Modified: cfe/trunk/lib/AST/Expr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Expr.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Expr.cpp (original)
> +++ cfe/trunk/lib/AST/Expr.cpp Wed Feb  9 02:16:59 2011
> @@ -30,8 +30,6 @@
> #include <algorithm>
> using namespace clang;
> 
> -void Expr::ANCHOR() {} // key function for Expr class.
> -
> /// isKnownToHaveBooleanValue - Return true if this is an integer expression
> /// that is known to return 0 or 1.  This happens for _Bool/bool expressions
> /// but also int expressions which are produced by things like comparisons in
> @@ -93,6 +91,42 @@
>   return false;
> }
> 
> +// Amusing macro metaprogramming hack: check whether a class provides
> +// a more specific implementation of getExprLoc().
> +namespace {
> +  /// This implementation is used when a class provides a custom
> +  /// implementation of getExprLoc.
> +  template <class E, class T>
> +  SourceLocation getExprLocImpl(const Expr *expr,
> +                                SourceLocation (T::*v)() const) {
> +    return static_cast<const E*>(expr)->getExprLoc();
> +  }
> +
> +  /// This implementation is used when a class doesn't provide
> +  /// a custom implementation of getExprLoc.  Overload resolution
> +  /// should pick it over the implementation above because it's
> +  /// more specialized according to function template partial ordering.
> +  template <class E>
> +  SourceLocation getExprLocImpl(const Expr *expr,
> +                                SourceLocation (Expr::*v)() const) {
> +    return static_cast<const E*>(expr)->getSourceRange().getBegin();
> +  }
> +}
> +
> +SourceLocation Expr::getExprLoc() const {
> +  switch (getStmtClass()) {
> +  case Stmt::NoStmtClass: llvm_unreachable("statement without class");
> +#define ABSTRACT_STMT(type)
> +#define STMT(type, base) \
> +  case Stmt::type##Class: llvm_unreachable(#type " is not an Expr"); break;
> +#define EXPR(type, base) \
> +  case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
> +#include "clang/AST/StmtNodes.inc"
> +  }
> +  llvm_unreachable("unknown statement kind");
> +  return SourceLocation();
> +}
> +
> //===----------------------------------------------------------------------===//
> // Primary Expressions.
> //===----------------------------------------------------------------------===//
> @@ -1560,7 +1594,8 @@
> static Expr::CanThrowResult CanSubExprsThrow(ASTContext &C, const Expr *CE) {
>   Expr *E = const_cast<Expr*>(CE);
>   Expr::CanThrowResult R = Expr::CT_Cannot;
> -  for (Expr::child_iterator I = E->child_begin(), IE = E->child_end();
> +  Expr::child_iterator I, IE;
> +  for (llvm::tie(I, IE) = E->children();
>        I != IE && R != Expr::CT_Can; ++I) {
>     R = MergeCanThrow(R, cast<Expr>(*I)->CanThrow(C));
>   }
> @@ -2735,242 +2770,29 @@
> //  Child Iterators for iterating over subexpressions/substatements
> //===----------------------------------------------------------------------===//
> 
> -// DeclRefExpr
> -Stmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); }
> -Stmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); }
> -
> -// ObjCIvarRefExpr
> -Stmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; }
> -Stmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; }
> -
> -// ObjCPropertyRefExpr
> -Stmt::child_iterator ObjCPropertyRefExpr::child_begin()
> -{ 
> -  if (Receiver.is<Stmt*>()) {
> -    // Hack alert!
> -    return reinterpret_cast<Stmt**> (&Receiver);
> -  }
> -  return child_iterator(); 
> -}
> -
> -Stmt::child_iterator ObjCPropertyRefExpr::child_end()
> -{ return Receiver.is<Stmt*>() ? 
> -          reinterpret_cast<Stmt**> (&Receiver)+1 : 
> -          child_iterator(); 
> -}
> -
> -// ObjCIsaExpr
> -Stmt::child_iterator ObjCIsaExpr::child_begin() { return &Base; }
> -Stmt::child_iterator ObjCIsaExpr::child_end() { return &Base+1; }
> -
> -// PredefinedExpr
> -Stmt::child_iterator PredefinedExpr::child_begin() { return child_iterator(); }
> -Stmt::child_iterator PredefinedExpr::child_end() { return child_iterator(); }
> -
> -// IntegerLiteral
> -Stmt::child_iterator IntegerLiteral::child_begin() { return child_iterator(); }
> -Stmt::child_iterator IntegerLiteral::child_end() { return child_iterator(); }
> -
> -// CharacterLiteral
> -Stmt::child_iterator CharacterLiteral::child_begin() { return child_iterator();}
> -Stmt::child_iterator CharacterLiteral::child_end() { return child_iterator(); }
> -
> -// FloatingLiteral
> -Stmt::child_iterator FloatingLiteral::child_begin() { return child_iterator(); }
> -Stmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); }
> -
> -// ImaginaryLiteral
> -Stmt::child_iterator ImaginaryLiteral::child_begin() { return &Val; }
> -Stmt::child_iterator ImaginaryLiteral::child_end() { return &Val+1; }
> -
> -// StringLiteral
> -Stmt::child_iterator StringLiteral::child_begin() { return child_iterator(); }
> -Stmt::child_iterator StringLiteral::child_end() { return child_iterator(); }
> -
> -// ParenExpr
> -Stmt::child_iterator ParenExpr::child_begin() { return &Val; }
> -Stmt::child_iterator ParenExpr::child_end() { return &Val+1; }
> -
> -// UnaryOperator
> -Stmt::child_iterator UnaryOperator::child_begin() { return &Val; }
> -Stmt::child_iterator UnaryOperator::child_end() { return &Val+1; }
> -
> -// OffsetOfExpr
> -Stmt::child_iterator OffsetOfExpr::child_begin() {
> -  return reinterpret_cast<Stmt **> (reinterpret_cast<OffsetOfNode *> (this + 1)
> -                                      + NumComps);
> -}
> -Stmt::child_iterator OffsetOfExpr::child_end() {
> -  return child_iterator(&*child_begin() + NumExprs);
> -}
> -
> // SizeOfAlignOfExpr
> -Stmt::child_iterator SizeOfAlignOfExpr::child_begin() {
> +Stmt::child_range SizeOfAlignOfExpr::children() {
>   // If this is of a type and the type is a VLA type (and not a typedef), the
>   // size expression of the VLA needs to be treated as an executable expression.
>   // Why isn't this weirdness documented better in StmtIterator?
>   if (isArgumentType()) {
>     if (const VariableArrayType* T = dyn_cast<VariableArrayType>(
>                                    getArgumentType().getTypePtr()))
> -      return child_iterator(T);
> -    return child_iterator();
> +      return child_range(child_iterator(T), child_iterator());
> +    return child_range();
>   }
> -  return child_iterator(&Argument.Ex);
> -}
> -Stmt::child_iterator SizeOfAlignOfExpr::child_end() {
> -  if (isArgumentType())
> -    return child_iterator();
> -  return child_iterator(&Argument.Ex + 1);
> -}
> -
> -// ArraySubscriptExpr
> -Stmt::child_iterator ArraySubscriptExpr::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator ArraySubscriptExpr::child_end() {
> -  return &SubExprs[0]+END_EXPR;
> -}
> -
> -// CallExpr
> -Stmt::child_iterator CallExpr::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator CallExpr::child_end() {
> -  return &SubExprs[0]+NumArgs+getNumPreArgs()+PREARGS_START;
> -}
> -
> -// MemberExpr
> -Stmt::child_iterator MemberExpr::child_begin() { return &Base; }
> -Stmt::child_iterator MemberExpr::child_end() { return &Base+1; }
> -
> -// ExtVectorElementExpr
> -Stmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; }
> -Stmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; }
> -
> -// CompoundLiteralExpr
> -Stmt::child_iterator CompoundLiteralExpr::child_begin() { return &Init; }
> -Stmt::child_iterator CompoundLiteralExpr::child_end() { return &Init+1; }
> -
> -// CastExpr
> -Stmt::child_iterator CastExpr::child_begin() { return &Op; }
> -Stmt::child_iterator CastExpr::child_end() { return &Op+1; }
> -
> -// BinaryOperator
> -Stmt::child_iterator BinaryOperator::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator BinaryOperator::child_end() {
> -  return &SubExprs[0]+END_EXPR;
> -}
> -
> -// ConditionalOperator
> -Stmt::child_iterator ConditionalOperator::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator ConditionalOperator::child_end() {
> -  return &SubExprs[0]+END_EXPR;
> -}
> -
> -// AddrLabelExpr
> -Stmt::child_iterator AddrLabelExpr::child_begin() { return child_iterator(); }
> -Stmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); }
> -
> -// StmtExpr
> -Stmt::child_iterator StmtExpr::child_begin() { return &SubStmt; }
> -Stmt::child_iterator StmtExpr::child_end() { return &SubStmt+1; }
> -
> -
> -// ChooseExpr
> -Stmt::child_iterator ChooseExpr::child_begin() { return &SubExprs[0]; }
> -Stmt::child_iterator ChooseExpr::child_end() { return &SubExprs[0]+END_EXPR; }
> -
> -// GNUNullExpr
> -Stmt::child_iterator GNUNullExpr::child_begin() { return child_iterator(); }
> -Stmt::child_iterator GNUNullExpr::child_end() { return child_iterator(); }
> -
> -// ShuffleVectorExpr
> -Stmt::child_iterator ShuffleVectorExpr::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator ShuffleVectorExpr::child_end() {
> -  return &SubExprs[0]+NumExprs;
> -}
> -
> -// VAArgExpr
> -Stmt::child_iterator VAArgExpr::child_begin() { return &Val; }
> -Stmt::child_iterator VAArgExpr::child_end() { return &Val+1; }
> -
> -// InitListExpr
> -Stmt::child_iterator InitListExpr::child_begin() {
> -  return InitExprs.size() ? &InitExprs[0] : 0;
> -}
> -Stmt::child_iterator InitListExpr::child_end() {
> -  return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0;
> -}
> -
> -// DesignatedInitExpr
> -Stmt::child_iterator DesignatedInitExpr::child_begin() {
> -  char* Ptr = static_cast<char*>(static_cast<void *>(this));
> -  Ptr += sizeof(DesignatedInitExpr);
> -  return reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
> -}
> -Stmt::child_iterator DesignatedInitExpr::child_end() {
> -  return child_iterator(&*child_begin() + NumSubExprs);
> -}
> -
> -// ImplicitValueInitExpr
> -Stmt::child_iterator ImplicitValueInitExpr::child_begin() {
> -  return child_iterator();
> -}
> -
> -Stmt::child_iterator ImplicitValueInitExpr::child_end() {
> -  return child_iterator();
> -}
> -
> -// ParenListExpr
> -Stmt::child_iterator ParenListExpr::child_begin() {
> -  return &Exprs[0];
> -}
> -Stmt::child_iterator ParenListExpr::child_end() {
> -  return &Exprs[0]+NumExprs;
> -}
> -
> -// ObjCStringLiteral
> -Stmt::child_iterator ObjCStringLiteral::child_begin() {
> -  return &String;
> -}
> -Stmt::child_iterator ObjCStringLiteral::child_end() {
> -  return &String+1;
> -}
> -
> -// ObjCEncodeExpr
> -Stmt::child_iterator ObjCEncodeExpr::child_begin() { return child_iterator(); }
> -Stmt::child_iterator ObjCEncodeExpr::child_end() { return child_iterator(); }
> -
> -// ObjCSelectorExpr
> -Stmt::child_iterator ObjCSelectorExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator ObjCSelectorExpr::child_end() {
> -  return child_iterator();
> -}
> -
> -// ObjCProtocolExpr
> -Stmt::child_iterator ObjCProtocolExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator ObjCProtocolExpr::child_end() {
> -  return child_iterator();
> +  return child_range(&Argument.Ex, &Argument.Ex + 1);
> }
> 
> // ObjCMessageExpr
> -Stmt::child_iterator ObjCMessageExpr::child_begin() {
> +Stmt::child_range ObjCMessageExpr::children() {
> +  Stmt **begin;
>   if (getReceiverKind() == Instance)
> -    return reinterpret_cast<Stmt **>(this + 1);
> -  return reinterpret_cast<Stmt **>(getArgs());
> -}
> -Stmt::child_iterator ObjCMessageExpr::child_end() {
> -  return reinterpret_cast<Stmt **>(getArgs() + getNumArgs());
> +    begin = reinterpret_cast<Stmt **>(this + 1);
> +  else
> +    begin = reinterpret_cast<Stmt **>(getArgs());
> +  return child_range(begin,
> +                     reinterpret_cast<Stmt **>(getArgs() + getNumArgs()));
> }
> 
> // Blocks
> @@ -2988,14 +2810,3 @@
>   ExprBits.ValueDependent = ValueDependent;
> }
> 
> -Stmt::child_iterator BlockExpr::child_begin() { return child_iterator(); }
> -Stmt::child_iterator BlockExpr::child_end() { return child_iterator(); }
> -
> -Stmt::child_iterator BlockDeclRefExpr::child_begin() { return child_iterator();}
> -Stmt::child_iterator BlockDeclRefExpr::child_end() { return child_iterator(); }
> -
> -// OpaqueValueExpr
> -SourceRange OpaqueValueExpr::getSourceRange() const { return Loc; }
> -Stmt::child_iterator OpaqueValueExpr::child_begin() { return child_iterator(); }
> -Stmt::child_iterator OpaqueValueExpr::child_end() { return child_iterator(); }
> -
> 
> Modified: cfe/trunk/lib/AST/ExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprCXX.cpp (original)
> +++ cfe/trunk/lib/AST/ExprCXX.cpp Wed Feb  9 02:16:59 2011
> @@ -29,67 +29,12 @@
>                                                         .getUnqualifiedType();
> }
> 
> -// CXXTypeidExpr - has child iterators if the operand is an expression
> -Stmt::child_iterator CXXTypeidExpr::child_begin() {
> -  return isTypeOperand() ? child_iterator() 
> -                         : reinterpret_cast<Stmt **>(&Operand);
> -}
> -Stmt::child_iterator CXXTypeidExpr::child_end() {
> -  return isTypeOperand() ? child_iterator() 
> -                         : reinterpret_cast<Stmt **>(&Operand) + 1;
> -}
> -
> QualType CXXUuidofExpr::getTypeOperand() const {
>   assert(isTypeOperand() && "Cannot call getTypeOperand for __uuidof(expr)");
>   return Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType()
>                                                         .getUnqualifiedType();
> }
> 
> -// CXXUuidofExpr - has child iterators if the operand is an expression
> -Stmt::child_iterator CXXUuidofExpr::child_begin() {
> -  return isTypeOperand() ? child_iterator() 
> -                         : reinterpret_cast<Stmt **>(&Operand);
> -}
> -Stmt::child_iterator CXXUuidofExpr::child_end() {
> -  return isTypeOperand() ? child_iterator() 
> -                         : reinterpret_cast<Stmt **>(&Operand) + 1;
> -}
> -
> -// CXXBoolLiteralExpr
> -Stmt::child_iterator CXXBoolLiteralExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator CXXBoolLiteralExpr::child_end() {
> -  return child_iterator();
> -}
> -
> -// CXXNullPtrLiteralExpr
> -Stmt::child_iterator CXXNullPtrLiteralExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator CXXNullPtrLiteralExpr::child_end() {
> -  return child_iterator();
> -}
> -
> -// CXXThisExpr
> -Stmt::child_iterator CXXThisExpr::child_begin() { return child_iterator(); }
> -Stmt::child_iterator CXXThisExpr::child_end() { return child_iterator(); }
> -
> -// CXXThrowExpr
> -Stmt::child_iterator CXXThrowExpr::child_begin() { return &Op; }
> -Stmt::child_iterator CXXThrowExpr::child_end() {
> -  // If Op is 0, we are processing throw; which has no children.
> -  return Op ? &Op+1 : &Op;
> -}
> -
> -// CXXDefaultArgExpr
> -Stmt::child_iterator CXXDefaultArgExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator CXXDefaultArgExpr::child_end() {
> -  return child_iterator();
> -}
> -
> // CXXScalarValueInitExpr
> SourceRange CXXScalarValueInitExpr::getSourceRange() const {
>   SourceLocation Start = RParenLoc;
> @@ -98,13 +43,6 @@
>   return SourceRange(Start, RParenLoc);
> }
> 
> -Stmt::child_iterator CXXScalarValueInitExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator CXXScalarValueInitExpr::child_end() {
> -  return child_iterator();
> -}
> -
> // CXXNewExpr
> CXXNewExpr::CXXNewExpr(ASTContext &C, bool globalNew, FunctionDecl *operatorNew,
>                        Expr **placementArgs, unsigned numPlaceArgs,
> @@ -163,11 +101,6 @@
> }
> 
> 
> -Stmt::child_iterator CXXNewExpr::child_begin() { return &SubExprs[0]; }
> -Stmt::child_iterator CXXNewExpr::child_end() {
> -  return &SubExprs[0] + Array + getNumPlacementArgs() + getNumConstructorArgs();
> -}
> -
> // CXXDeleteExpr
> QualType CXXDeleteExpr::getDestroyedType() const {
>   const Expr *Arg = getArgument();
> @@ -187,15 +120,7 @@
>   return ArgType->getAs<PointerType>()->getPointeeType();
> }
> 
> -Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }
> -Stmt::child_iterator CXXDeleteExpr::child_end() { return &Argument+1; }
> -
> // CXXPseudoDestructorExpr
> -Stmt::child_iterator CXXPseudoDestructorExpr::child_begin() { return &Base; }
> -Stmt::child_iterator CXXPseudoDestructorExpr::child_end() {
> -  return &Base + 1;
> -}
> -
> PseudoDestructorTypeStorage::PseudoDestructorTypeStorage(TypeSourceInfo *Info)
>  : Type(Info) 
> {
> @@ -355,28 +280,6 @@
>     return cast<UnresolvedMemberExpr>(this)->getNamingClass();
> }
> 
> -Stmt::child_iterator UnresolvedLookupExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator UnresolvedLookupExpr::child_end() {
> -  return child_iterator();
> -}
> -// UnaryTypeTraitExpr
> -Stmt::child_iterator UnaryTypeTraitExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator UnaryTypeTraitExpr::child_end() {
> -  return child_iterator();
> -}
> -
> -//BinaryTypeTraitExpr
> -Stmt::child_iterator BinaryTypeTraitExpr::child_begin() {
> -  return child_iterator();
> -}
> -Stmt::child_iterator BinaryTypeTraitExpr::child_end() {
> -  return child_iterator();
> -}
> -
> // DependentScopeDeclRefExpr
> DependentScopeDeclRefExpr::DependentScopeDeclRefExpr(QualType T,
>                             NestedNameSpecifier *Qualifier,
> @@ -431,14 +334,6 @@
>   return E;
> }
> 
> -StmtIterator DependentScopeDeclRefExpr::child_begin() {
> -  return child_iterator();
> -}
> -
> -StmtIterator DependentScopeDeclRefExpr::child_end() {
> -  return child_iterator();
> -}
> -
> SourceRange CXXConstructExpr::getSourceRange() const {
>   if (ParenRange.isValid())
>     return SourceRange(Loc, ParenRange.getEnd());
> @@ -746,32 +641,6 @@
>   return new (C) ExprWithCleanups(C, SubExpr, Temps, NumTemps);
> }
> 
> -// CXXBindTemporaryExpr
> -Stmt::child_iterator CXXBindTemporaryExpr::child_begin() {
> -  return &SubExpr;
> -}
> -
> -Stmt::child_iterator CXXBindTemporaryExpr::child_end() {
> -  return &SubExpr + 1;
> -}
> -
> -// CXXConstructExpr
> -Stmt::child_iterator CXXConstructExpr::child_begin() {
> -  return &Args[0];
> -}
> -Stmt::child_iterator CXXConstructExpr::child_end() {
> -  return &Args[0]+NumArgs;
> -}
> -
> -// ExprWithCleanups
> -Stmt::child_iterator ExprWithCleanups::child_begin() {
> -  return &SubExpr;
> -}
> -
> -Stmt::child_iterator ExprWithCleanups::child_end() {
> -  return &SubExpr + 1;
> -}
> -
> CXXUnresolvedConstructExpr::CXXUnresolvedConstructExpr(TypeSourceInfo *Type,
>                                                  SourceLocation LParenLoc,
>                                                  Expr **Args,
> @@ -820,14 +689,6 @@
>   return SourceRange(Type->getTypeLoc().getBeginLoc(), RParenLoc);
> }
> 
> -Stmt::child_iterator CXXUnresolvedConstructExpr::child_begin() {
> -  return child_iterator(reinterpret_cast<Stmt **>(this + 1));
> -}
> -
> -Stmt::child_iterator CXXUnresolvedConstructExpr::child_end() {
> -  return child_iterator(reinterpret_cast<Stmt **>(this + 1) + NumArgs);
> -}
> -
> CXXDependentScopeMemberExpr::CXXDependentScopeMemberExpr(ASTContext &C,
>                                                  Expr *Base, QualType BaseType,
>                                                  bool IsArrow,
> @@ -927,16 +788,6 @@
>   return E;
> }
> 
> -Stmt::child_iterator CXXDependentScopeMemberExpr::child_begin() {
> -  return child_iterator(&Base);
> -}
> -
> -Stmt::child_iterator CXXDependentScopeMemberExpr::child_end() {
> -  if (isImplicitAccess())
> -    return child_iterator(&Base);
> -  return child_iterator(&Base + 1);
> -}
> -
> UnresolvedMemberExpr::UnresolvedMemberExpr(ASTContext &C, 
>                                            bool HasUnresolvedUsing,
>                                            Expr *Base, QualType BaseType,
> @@ -1025,47 +876,6 @@
>   return Record;
> }
> 
> -Stmt::child_iterator UnresolvedMemberExpr::child_begin() {
> -  return child_iterator(&Base);
> -}
> -
> -Stmt::child_iterator UnresolvedMemberExpr::child_end() {
> -  if (isImplicitAccess())
> -    return child_iterator(&Base);
> -  return child_iterator(&Base + 1);
> -}
> -
> -Stmt::child_iterator CXXNoexceptExpr::child_begin() {
> -  return child_iterator(&Operand);
> -}
> -Stmt::child_iterator CXXNoexceptExpr::child_end() {
> -  return child_iterator(&Operand + 1);
> -}
> -
> -SourceRange PackExpansionExpr::getSourceRange() const {
> -  return SourceRange(Pattern->getLocStart(), EllipsisLoc);
> -}
> -
> -Stmt::child_iterator PackExpansionExpr::child_begin() {
> -  return child_iterator(&Pattern);
> -}
> -
> -Stmt::child_iterator PackExpansionExpr::child_end() {
> -  return child_iterator(&Pattern + 1);
> -}
> -
> -SourceRange SizeOfPackExpr::getSourceRange() const {
> -  return SourceRange(OperatorLoc, RParenLoc);
> -}
> -
> -Stmt::child_iterator SizeOfPackExpr::child_begin() {
> -  return child_iterator();
> -}
> -
> -Stmt::child_iterator SizeOfPackExpr::child_end() {
> -  return child_iterator();
> -}
> -
> SubstNonTypeTemplateParmPackExpr::
> SubstNonTypeTemplateParmPackExpr(QualType T, 
>                                  NonTypeTemplateParmDecl *Param,
> @@ -1080,16 +890,4 @@
>   return TemplateArgument(Arguments, NumArguments);
> }
> 
> -SourceRange SubstNonTypeTemplateParmPackExpr::getSourceRange() const {
> -  return NameLoc;
> -}
> -
> -Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_begin() {
> -  return child_iterator();
> -}
> -
> -Stmt::child_iterator SubstNonTypeTemplateParmPackExpr::child_end() {
> -  return child_iterator();
> -}
> -
> 
> 
> Modified: cfe/trunk/lib/AST/ExprClassification.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprClassification.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprClassification.cpp (original)
> +++ cfe/trunk/lib/AST/ExprClassification.cpp Wed Feb  9 02:16:59 2011
> @@ -90,6 +90,7 @@
>   switch (E->getStmtClass()) {
>     // First come the expressions that are always lvalues, unconditionally.
>   case Stmt::NoStmtClass:
> +#define ABSTRACT_STMT(Kind)
> #define STMT(Kind, Base) case Expr::Kind##Class:
> #define EXPR(Kind, Base)
> #include "clang/AST/StmtNodes.inc"
> 
> Modified: cfe/trunk/lib/AST/ExprConstant.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
> +++ cfe/trunk/lib/AST/ExprConstant.cpp Wed Feb  9 02:16:59 2011
> @@ -2578,6 +2578,7 @@
>   }
> 
>   switch (E->getStmtClass()) {
> +#define ABSTRACT_STMT(Node)
> #define STMT(Node, Base) case Expr::Node##Class:
> #define EXPR(Node, Base)
> #include "clang/AST/StmtNodes.inc"
> 
> Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original)
> +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Wed Feb  9 02:16:59 2011
> @@ -1690,6 +1690,7 @@
>   //                ::= L <mangled-name> E           # external name
>   switch (E->getStmtClass()) {
>   case Expr::NoStmtClass:
> +#define ABSTRACT_STMT(Type)
> #define EXPR(Type, Base)
> #define STMT(Type, Base) \
>   case Expr::Type##Class:
> 
> Modified: cfe/trunk/lib/AST/Stmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Stmt.cpp (original)
> +++ cfe/trunk/lib/AST/Stmt.cpp Wed Feb  9 02:16:59 2011
> @@ -84,6 +84,61 @@
>   return StatSwitch;
> }
> 
> +namespace {
> +  struct good {};
> +  struct bad {};
> +  static inline good is_good(good); // static inline to suppress unused warning
> +
> +  typedef Stmt::child_range children_t();
> +  template <class T> good implements_children(children_t T::*);
> +  static inline bad implements_children(children_t Stmt::*);
> +
> +  typedef SourceRange getSourceRange_t() const;
> +  template <class T> good implements_getSourceRange(getSourceRange_t T::*);
> +  static inline bad implements_getSourceRange(getSourceRange_t Stmt::*);
> +
> +#define ASSERT_IMPLEMENTS_children(type) \
> +  (void) sizeof(is_good(implements_children(&type::children)))
> +#define ASSERT_IMPLEMENTS_getSourceRange(type) \
> +  (void) sizeof(is_good(implements_getSourceRange(&type::getSourceRange)))
> +}
> +
> +/// Check whether the various Stmt classes implement their member
> +/// functions.
> +static inline void check_implementations() {
> +#define ABSTRACT_STMT(type)
> +#define STMT(type, base) \
> +  ASSERT_IMPLEMENTS_children(type); \
> +  ASSERT_IMPLEMENTS_getSourceRange(type);
> +#include "clang/AST/StmtNodes.inc"
> +}
> +
> +Stmt::child_range Stmt::children() {
> +  switch (getStmtClass()) {
> +  case Stmt::NoStmtClass: llvm_unreachable("statement without class");
> +#define ABSTRACT_STMT(type)
> +#define STMT(type, base) \
> +  case Stmt::type##Class: \
> +    return static_cast<type*>(this)->children();
> +#include "clang/AST/StmtNodes.inc"
> +  }
> +  llvm_unreachable("unknown statement kind!");
> +  return child_range();
> +}
> +
> +SourceRange Stmt::getSourceRange() const {
> +  switch (getStmtClass()) {
> +  case Stmt::NoStmtClass: llvm_unreachable("statement without class");
> +#define ABSTRACT_STMT(type)
> +#define STMT(type, base) \
> +  case Stmt::type##Class: \
> +    return static_cast<const type*>(this)->getSourceRange();
> +#include "clang/AST/StmtNodes.inc"
> +  }
> +  llvm_unreachable("unknown statement kind!");
> +  return SourceRange();
> +}
> +
> void CompoundStmt::setStmts(ASTContext &C, Stmt **Stmts, unsigned NumStmts) {
>   if (this->Body)
>     C.Deallocate(Body);
> @@ -556,6 +611,11 @@
>                                    V->getSourceRange().getEnd());
> }
> 
> +Stmt *SwitchCase::getSubStmt() {
> +  if (isa<CaseStmt>(this)) return cast<CaseStmt>(this)->getSubStmt();
> +  return cast<DefaultStmt>(this)->getSubStmt();
> +}
> +
> WhileStmt::WhileStmt(ASTContext &C, VarDecl *Var, Expr *cond, Stmt *body, 
>                      SourceLocation WL)
> : Stmt(WhileStmtClass)
> @@ -585,89 +645,6 @@
>                                    V->getSourceRange().getEnd());
> }
> 
> -//===----------------------------------------------------------------------===//
> -//  Child Iterators for iterating over subexpressions/substatements
> -//===----------------------------------------------------------------------===//
> -
> -// DeclStmt
> -Stmt::child_iterator DeclStmt::child_begin() {
> -  return StmtIterator(DG.begin(), DG.end());
> -}
> -
> -Stmt::child_iterator DeclStmt::child_end() {
> -  return StmtIterator(DG.end(), DG.end());
> -}
> -
> -// NullStmt
> -Stmt::child_iterator NullStmt::child_begin() { return child_iterator(); }
> -Stmt::child_iterator NullStmt::child_end() { return child_iterator(); }
> -
> -// CompoundStmt
> -Stmt::child_iterator CompoundStmt::child_begin() { return &Body[0]; }
> -Stmt::child_iterator CompoundStmt::child_end() {
> -  return &Body[0]+CompoundStmtBits.NumStmts;
> -}
> -
> -// CaseStmt
> -Stmt::child_iterator CaseStmt::child_begin() { return &SubExprs[0]; }
> -Stmt::child_iterator CaseStmt::child_end() { return &SubExprs[END_EXPR]; }
> -
> -// DefaultStmt
> -Stmt::child_iterator DefaultStmt::child_begin() { return &SubStmt; }
> -Stmt::child_iterator DefaultStmt::child_end() { return &SubStmt+1; }
> -
> -// LabelStmt
> -Stmt::child_iterator LabelStmt::child_begin() { return &SubStmt; }
> -Stmt::child_iterator LabelStmt::child_end() { return &SubStmt+1; }
> -
> -// IfStmt
> -Stmt::child_iterator IfStmt::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator IfStmt::child_end() {
> -  return &SubExprs[0]+END_EXPR;
> -}
> -
> -// SwitchStmt
> -Stmt::child_iterator SwitchStmt::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator SwitchStmt::child_end() {
> -  return &SubExprs[0]+END_EXPR;
> -}
> -
> -// WhileStmt
> -Stmt::child_iterator WhileStmt::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator WhileStmt::child_end() {
> -  return &SubExprs[0]+END_EXPR;
> -}
> -
> -// DoStmt
> -Stmt::child_iterator DoStmt::child_begin() { return &SubExprs[0]; }
> -Stmt::child_iterator DoStmt::child_end() { return &SubExprs[0]+END_EXPR; }
> -
> -// ForStmt
> -Stmt::child_iterator ForStmt::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator ForStmt::child_end() {
> -  return &SubExprs[0]+END_EXPR;
> -}
> -
> -// ObjCForCollectionStmt
> -Stmt::child_iterator ObjCForCollectionStmt::child_begin() {
> -  return &SubExprs[0];
> -}
> -Stmt::child_iterator ObjCForCollectionStmt::child_end() {
> -  return &SubExprs[0]+END_EXPR;
> -}
> -
> -// GotoStmt
> -Stmt::child_iterator GotoStmt::child_begin() { return child_iterator(); }
> -Stmt::child_iterator GotoStmt::child_end() { return child_iterator(); }
> -
> // IndirectGotoStmt
> LabelStmt *IndirectGotoStmt::getConstantTarget() {
>   if (AddrLabelExpr *E =
> @@ -676,17 +653,6 @@
>   return 0;
> }
> 
> -Stmt::child_iterator IndirectGotoStmt::child_begin() { return &Target; }
> -Stmt::child_iterator IndirectGotoStmt::child_end() { return &Target+1; }
> -
> -// ContinueStmt
> -Stmt::child_iterator ContinueStmt::child_begin() { return child_iterator(); }
> -Stmt::child_iterator ContinueStmt::child_end() { return child_iterator(); }
> -
> -// BreakStmt
> -Stmt::child_iterator BreakStmt::child_begin() { return child_iterator(); }
> -Stmt::child_iterator BreakStmt::child_end() { return child_iterator(); }
> -
> // ReturnStmt
> const Expr* ReturnStmt::getRetValue() const {
>   return cast_or_null<Expr>(RetExpr);
> @@ -694,69 +660,3 @@
> Expr* ReturnStmt::getRetValue() {
>   return cast_or_null<Expr>(RetExpr);
> }
> -
> -Stmt::child_iterator ReturnStmt::child_begin() {
> -  return &RetExpr;
> -}
> -Stmt::child_iterator ReturnStmt::child_end() {
> -  return RetExpr ? &RetExpr+1 : &RetExpr;
> -}
> -
> -// AsmStmt
> -Stmt::child_iterator AsmStmt::child_begin() {
> -  return NumOutputs + NumInputs == 0 ? 0 : &Exprs[0];
> -}
> -Stmt::child_iterator AsmStmt::child_end() {
> -  return NumOutputs + NumInputs == 0 ? 0 : &Exprs[0] + NumOutputs + NumInputs;
> -}
> -
> -// ObjCAtCatchStmt
> -Stmt::child_iterator ObjCAtCatchStmt::child_begin() { return &Body; }
> -Stmt::child_iterator ObjCAtCatchStmt::child_end() { return &Body + 1; }
> -
> -// ObjCAtFinallyStmt
> -Stmt::child_iterator ObjCAtFinallyStmt::child_begin() { return &AtFinallyStmt; }
> -Stmt::child_iterator ObjCAtFinallyStmt::child_end() { return &AtFinallyStmt+1; }
> -
> -// ObjCAtTryStmt
> -Stmt::child_iterator ObjCAtTryStmt::child_begin() { return getStmts(); }
> -
> -Stmt::child_iterator ObjCAtTryStmt::child_end() {
> -  return getStmts() + 1 + NumCatchStmts + HasFinally;
> -}
> -
> -// ObjCAtThrowStmt
> -Stmt::child_iterator ObjCAtThrowStmt::child_begin() {
> -  return &Throw;
> -}
> -
> -Stmt::child_iterator ObjCAtThrowStmt::child_end() {
> -  return &Throw+1;
> -}
> -
> -// ObjCAtSynchronizedStmt
> -Stmt::child_iterator ObjCAtSynchronizedStmt::child_begin() {
> -  return &SubStmts[0];
> -}
> -
> -Stmt::child_iterator ObjCAtSynchronizedStmt::child_end() {
> -  return &SubStmts[0]+END_EXPR;
> -}
> -
> -// CXXCatchStmt
> -Stmt::child_iterator CXXCatchStmt::child_begin() {
> -  return &HandlerBlock;
> -}
> -
> -Stmt::child_iterator CXXCatchStmt::child_end() {
> -  return &HandlerBlock + 1;
> -}
> -
> -// CXXTryStmt
> -Stmt::child_iterator CXXTryStmt::child_begin() {
> -  return reinterpret_cast<Stmt **>(this + 1);
> -}
> -
> -Stmt::child_iterator CXXTryStmt::child_end() {
> -  return reinterpret_cast<Stmt **>(this + 1) + NumHandlers + 1;
> -}
> 
> Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/StmtPrinter.cpp Wed Feb  9 02:16:59 2011
> @@ -220,10 +220,6 @@
>   }
> }
> 
> -void StmtPrinter::VisitSwitchCase(SwitchCase*) {
> -  assert(0 && "SwitchCase is an abstract class");
> -}
> -
> void StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
>   Indent() << "while (";
>   PrintExpr(Node->getCond());
> 
> Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Wed Feb  9 02:16:59 2011
> @@ -71,7 +71,6 @@
>   switch (S->getStmtClass()) {
>   case Stmt::NoStmtClass:
>   case Stmt::CXXCatchStmtClass:
> -  case Stmt::SwitchCaseClass:
>     llvm_unreachable("invalid statement class to emit generically");
>   case Stmt::NullStmtClass:
>   case Stmt::CompoundStmtClass:
> 
> Modified: cfe/trunk/lib/Sema/TreeTransform.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/TreeTransform.h?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/TreeTransform.h (original)
> +++ cfe/trunk/lib/Sema/TreeTransform.h Wed Feb  9 02:16:59 2011
> @@ -2280,6 +2280,7 @@
>   // Transform individual statement nodes
> #define STMT(Node, Parent)                                              \
>   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
> +#define ABSTRACT_STMT(Node)
> #define EXPR(Node, Parent)
> #include "clang/AST/StmtNodes.inc"
> 
> @@ -4831,13 +4832,6 @@
> 
> template<typename Derived>
> StmtResult
> -TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
> -  assert(false && "SwitchCase is abstract and cannot be transformed");
> -  return SemaRef.Owned(S);
> -}
> -
> -template<typename Derived>
> -StmtResult
> TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
> 
>   ASTOwningVector<Expr*> Constraints(getSema());
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/ExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/ExprEngine.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/ExprEngine.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/ExprEngine.cpp Wed Feb  9 02:16:59 2011
> @@ -860,7 +860,6 @@
>     case Stmt::LabelStmtClass:
>     case Stmt::NoStmtClass:
>     case Stmt::NullStmtClass:
> -    case Stmt::SwitchCaseClass:
>     case Stmt::OpaqueValueExprClass:
>       llvm_unreachable("Stmt should not be in analyzer evaluation loop");
>       break;
> 
> Modified: cfe/trunk/tools/libclang/CXCursor.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXCursor.cpp?rev=125183&r1=125182&r2=125183&view=diff
> ==============================================================================
> --- cfe/trunk/tools/libclang/CXCursor.cpp (original)
> +++ cfe/trunk/tools/libclang/CXCursor.cpp Wed Feb  9 02:16:59 2011
> @@ -86,7 +86,6 @@
>   case Stmt::BreakStmtClass:       
>   case Stmt::ReturnStmtClass:      
>   case Stmt::DeclStmtClass:        
> -  case Stmt::SwitchCaseClass:      
>   case Stmt::AsmStmtClass:         
>   case Stmt::ObjCAtTryStmtClass:        
>   case Stmt::ObjCAtCatchStmtClass:      
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list