[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