I didn't understand how @catches were chained. Now that I get it, fix

the scope checker to not think @catches are nested in each other, eliminating
some bogus notes.

llvm-svn: 69486
This commit is contained in:
Chris Lattner 2009-04-18 22:35:34 +00:00
parent bf78da7b36
commit b6e368235a
2 changed files with 12 additions and 13 deletions

View File

@ -3022,15 +3022,8 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
// it. This makes the second scan not have to walk the AST again. // it. This makes the second scan not have to walk the AST again.
LabelAndGotoScopes[S] = ParentScope; LabelAndGotoScopes[S] = ParentScope;
Jumps.push_back(S); Jumps.push_back(S);
} else if (ObjCAtCatchStmt *AC = dyn_cast<ObjCAtCatchStmt>(S)) {
// @catch always starts a new scope.
// FIXME: We have to do this because @catches are nested inside each other,
// which seems weird and causes us to emit wierd diagnostics.
Scopes.push_back(GotoScope(ParentScope, diag::note_protected_by_objc_catch,
AC->getAtCatchLoc()));
ParentScope = Scopes.size()-1;
} }
for (Stmt::child_iterator CI = S->child_begin(), E = S->child_end(); CI != E; for (Stmt::child_iterator CI = S->child_begin(), E = S->child_end(); CI != E;
++CI) { ++CI) {
Stmt *SubStmt = *CI; Stmt *SubStmt = *CI;
@ -3063,11 +3056,17 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
if (Stmt *TryPart = AT->getTryBody()) if (Stmt *TryPart = AT->getTryBody())
BuildScopeInformation(TryPart, Scopes.size()-1); BuildScopeInformation(TryPart, Scopes.size()-1);
// Jump from the catch or finally to the try is not valid. // Jump from the catch to the finally or try is not valid.
if (ObjCAtCatchStmt *AC = AT->getCatchStmts()) for (ObjCAtCatchStmt *AC = AT->getCatchStmts(); AC;
AC = AC->getNextCatchStmt()) {
Scopes.push_back(GotoScope(ParentScope,
diag::note_protected_by_objc_catch,
AC->getAtCatchLoc()));
// @catches are nested and it isn't // @catches are nested and it isn't
BuildScopeInformation(AC, ParentScope); BuildScopeInformation(AC->getCatchBody(), Scopes.size()-1);
}
// Jump from the finally to the try or catch is not valid.
if (ObjCAtFinallyStmt *AF = AT->getFinallyStmt()) { if (ObjCAtFinallyStmt *AF = AT->getFinallyStmt()) {
Scopes.push_back(GotoScope(ParentScope, Scopes.push_back(GotoScope(ParentScope,
diag::note_protected_by_objc_finally, diag::note_protected_by_objc_finally,

View File

@ -39,8 +39,8 @@ L3: ;
goto L8; // expected-error{{illegal goto into protected scope}} goto L8; // expected-error{{illegal goto into protected scope}}
@try { @try {
} @catch (A *c) { // expected-note {{jump bypasses initialization of @catch block}} } @catch (A *c) {
} @catch (B *c) { // expected-note {{jump bypasses initialization of @catch block}} } @catch (B *c) {
} @catch (C *c) { // expected-note {{jump bypasses initialization of @catch block}} } @catch (C *c) { // expected-note {{jump bypasses initialization of @catch block}}
L8: ; L8: ;
} }