зеркало из https://github.com/microsoft/clang-1.git
Fix another case (this time in JumpScopeChecker) where walking deeply nested CaseStmts can blow out the stack. Fixes <rdar://problem/8125165>.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@110071 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
074ae35bb1
Коммит
f8dcf1a1d3
|
@ -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());
|
||||
|
|
Загрузка…
Ссылка в новой задаче