aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/JumpDiagnostics.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/lib/Sema/JumpDiagnostics.cpp b/lib/Sema/JumpDiagnostics.cpp
index 3431ac6118..f696d6acbf 100644
--- a/lib/Sema/JumpDiagnostics.cpp
+++ b/lib/Sema/JumpDiagnostics.cpp
@@ -182,9 +182,19 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
switch (S->getStmtClass()) {
case Stmt::LabelStmtClass:
case Stmt::DefaultStmtClass:
- case Stmt::CaseStmtClass:
LabelAndGotoScopes[S] = ParentScope;
break;
+ case Stmt::CaseStmtClass: {
+ // Specially handle CaseStmts since they can nest each other in the
+ // AST and blow out the stack when we walk them.
+ CaseStmt *CS = cast<CaseStmt>(S);
+ do {
+ LabelAndGotoScopes[CS] = ParentScope;
+ S = CS; // 'CS' is the new current statement (if it isn't already).
+ CS = dyn_cast<CaseStmt>(CS->getSubStmt());
+ } while (CS);
+ break;
+ }
case Stmt::AddrLabelExprClass:
IndirectJumpTargets.push_back(cast<AddrLabelExpr>(S)->getLabel());