diff --git a/clang/AST/StmtDumper.cpp b/clang/AST/StmtDumper.cpp index 73aef8474275..ea43ad72a193 100644 --- a/clang/AST/StmtDumper.cpp +++ b/clang/AST/StmtDumper.cpp @@ -78,7 +78,7 @@ namespace { fprintf(F, " "); } - void DumpType(QualType T) const { + void DumpType(QualType T) { fprintf(F, "'%s'", T.getAsString().c_str()); // If the type is directly a typedef, strip off typedefness to give at @@ -86,22 +86,18 @@ namespace { if (TypedefType *TDT = dyn_cast(T)) fprintf(F, ":'%s'", TDT->LookThroughTypedefs().getAsString().c_str()); } - - void DumpStmt(const Stmt *Node) const { + void DumpStmt(const Stmt *Node) { Indent(); fprintf(F, "(%s %p", Node->getStmtClassName(), (void*)Node); + DumpSourceRange(Node); } - - void DumpExpr(Expr *Node) { + void DumpExpr(const Expr *Node) { DumpStmt(Node); fprintf(F, " "); DumpType(Node->getType()); - DumpSourceRange(Node); } - - void DumpSourceRange(Expr *Node); + void DumpSourceRange(const Stmt *Node); void DumpLocation(SourceLocation Loc); - // Stmts. void VisitStmt(Stmt *Node); @@ -158,7 +154,7 @@ void StmtDumper::DumpLocation(SourceLocation Loc) { } } -void StmtDumper::DumpSourceRange(Expr *Node) { +void StmtDumper::DumpSourceRange(const Stmt *Node) { // Can't translate locations if a SourceManager isn't available. if (SM == 0) return; diff --git a/clang/Sema/SemaStmt.cpp b/clang/Sema/SemaStmt.cpp index 87d5e262985e..d6c4c2d6d10e 100644 --- a/clang/Sema/SemaStmt.cpp +++ b/clang/Sema/SemaStmt.cpp @@ -260,7 +260,7 @@ Sema::FinishSwitchStmt(SourceLocation SwitchLoc, StmtTy *Switch, ExprTy *Body) { SwitchStmt *SS = SwitchStack.back(); assert(SS == (SwitchStmt*)Switch && "switch stack missing push/pop!"); - SS->setBody(BodyStmt); + SS->setBody(BodyStmt, SwitchLoc); SwitchStack.pop_back(); Expr *CondExpr = SS->getCond(); diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index aae088a5120a..b0dca78648f9 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -375,6 +375,7 @@ class SwitchStmt : public Stmt { Stmt* SubExprs[END_EXPR]; // This points to a linked list of case and default statements. SwitchCase *FirstCase; + SourceLocation SwitchLoc; public: SwitchStmt(Expr *cond) : Stmt(SwitchStmtClass), FirstCase(0) { SubExprs[COND] = reinterpret_cast(cond); @@ -389,17 +390,19 @@ public: Stmt *getBody() { return SubExprs[BODY]; } SwitchCase *getSwitchCaseList() { return FirstCase; } - void setBody(Stmt *S) { SubExprs[BODY] = S; } - + void setBody(Stmt *S, SourceLocation SL) { + SubExprs[BODY] = S; + SwitchLoc = SL; + } void addSwitchCase(SwitchCase *SC) { if (FirstCase) SC->setNextSwitchCase(FirstCase); FirstCase = SC; } - - virtual SourceRange getSourceRange() const { return SourceRange(); } - + virtual SourceRange getSourceRange() const { + return SourceRange(SwitchLoc, SubExprs[BODY]->getLocEnd()); + } static bool classof(const Stmt *T) { return T->getStmtClass() == SwitchStmtClass; }