From: Ted Kremenek Date: Mon, 2 Aug 2010 22:46:57 +0000 (+0000) Subject: Fix another case (this time in JumpScopeChecker) where walking deeply nested CaseStmt... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f8dcf1a1d3c4f28fc96a45d7159e1a9c95484632;p=clang Fix another case (this time in JumpScopeChecker) where walking deeply nested CaseStmts can blow out the stack. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110071 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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(S); + do { + LabelAndGotoScopes[CS] = ParentScope; + S = CS; // 'CS' is the new current statement (if it isn't already). + CS = dyn_cast(CS->getSubStmt()); + } while (CS); + break; + } case Stmt::AddrLabelExprClass: IndirectJumpTargets.push_back(cast(S)->getLabel());