]> granicus.if.org Git - clang/commitdiff
I didn't understand how @catches were chained. Now that I get it, fix
authorChris Lattner <sabre@nondot.org>
Sat, 18 Apr 2009 22:35:34 +0000 (22:35 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 18 Apr 2009 22:35:34 +0000 (22:35 +0000)
the scope checker to not think @catches are nested in each other, eliminating
some bogus notes.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69486 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaObjC/scope-check.m

index 4ec32b738abe4c40ee46649c6915be30c8f1d1e4..9cc7c6bf6b7316b24a45fa7f9ac3c374427bff8b 100644 (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.
     LabelAndGotoScopes[S] = ParentScope;
     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;
        ++CI) {
     Stmt *SubStmt = *CI;
@@ -3063,11 +3056,17 @@ void JumpScopeChecker::BuildScopeInformation(Stmt *S, unsigned ParentScope) {
       if (Stmt *TryPart = AT->getTryBody())
         BuildScopeInformation(TryPart, Scopes.size()-1);
 
-      // Jump from the catch or finally to the try is not valid.
-      if (ObjCAtCatchStmt *AC = AT->getCatchStmts())
+      // Jump from the catch to the finally or try is not valid.
+      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 
-        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()) {
         Scopes.push_back(GotoScope(ParentScope,
                                    diag::note_protected_by_objc_finally,
index 0833a1696d13de34e499fa6271398dda883962bb..fb9bd4570dda3e79132cf40869b5dfa89f3947b9 100644 (file)
@@ -39,8 +39,8 @@ L3: ;
   
   goto L8;  // expected-error{{illegal goto into protected scope}}
   @try { 
-  } @catch (A *c) { // expected-note {{jump bypasses initialization of @catch block}}
-  } @catch (B *c) { // expected-note {{jump bypasses initialization of @catch block}}
+  } @catch (A *c) {
+  } @catch (B *c) {
   } @catch (C *c) { // expected-note {{jump bypasses initialization of @catch block}}
   L8: ;
   }