]> granicus.if.org Git - clang/commitdiff
Fix <rdar://problem/6791490> [clang10 regression] [sema] invalid illegal jump diagnostic.
authorSteve Naroff <snaroff@apple.com>
Wed, 15 Apr 2009 14:38:36 +0000 (14:38 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 15 Apr 2009 14:38:36 +0000 (14:38 +0000)
caused by: <rdar://problem/6252084> [sema] jumps into Obj-C exception blocks should be disallowed.

Sema::RecursiveCalcLabelScopes() and Sema::RecursiveCalcJumpScopes() need to pop the ScopeStack within the statement iteration loop (was outside the loop).

Eli, please review (thanks).

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

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

index 7cc3029aae9ebd7f6061f04cc3261f311670f30b..6456ee8d9a1a6d84cfc3fddcd3097ad0c6d2e18d 100644 (file)
@@ -2935,11 +2935,11 @@ void Sema::RecursiveCalcLabelScopes(llvm::DenseMap<Stmt*, void*>& LabelScopeMap,
     Stmt* CurCompound = isa<CompoundStmt>(*i) ? *i : ParentCompoundStmt;
     RecursiveCalcLabelScopes(LabelScopeMap, PopScopeMap, ScopeStack,
                              *i, CurCompound);
+    while (ScopeStack.size() && PopScopeMap[ScopeStack.back()] == CurStmt) {
+      ScopeStack.pop_back();
+    }
   }
 
-  while (ScopeStack.size() && PopScopeMap[ScopeStack.back()] == CurStmt) {
-    ScopeStack.pop_back();
-  }
 }
 
 void Sema::RecursiveCalcJumpScopes(llvm::DenseMap<Stmt*, void*>& LabelScopeMap,
@@ -2970,10 +2970,9 @@ void Sema::RecursiveCalcJumpScopes(llvm::DenseMap<Stmt*, void*>& LabelScopeMap,
     if (isa<DeclStmt>(*i)) continue;
     RecursiveCalcJumpScopes(LabelScopeMap, PopScopeMap, GotoScopeMap,
                             ScopeStack, *i);
-  }
-
-  while (ScopeStack.size() && PopScopeMap[ScopeStack.back()] == CurStmt) {
-    ScopeStack.pop_back();
+    while (ScopeStack.size() && PopScopeMap[ScopeStack.back()] == CurStmt) {
+      ScopeStack.pop_back();
+    }
   }
 }
 
index b11eb040d388111890f46e3f91c31558de4630f2..d01dba0778a6b9cb15c2f4d9a7200830eb19d0c6 100644 (file)
@@ -16,3 +16,11 @@ L2: ;
 L3: ;
   }
 }
+
+void f0(int a) {
+  if (a) goto L0;
+  @try {} @finally {}
+ L0:
+  return;
+}
+