diff options
author | Steve Naroff <snaroff@apple.com> | 2009-04-14 20:53:38 +0000 |
---|---|---|
committer | Steve Naroff <snaroff@apple.com> | 2009-04-14 20:53:38 +0000 |
commit | 1fc5194039fc01e84af46342bf6e0790f0ebb58c (patch) | |
tree | c2ce0ff5b7cb1aca42a8322f1ff475733055ef69 | |
parent | 7eba5c9df989632c4dcaf13a20798d33d9ba3186 (diff) |
Fix <rdar://problem/6252084> [sema] jumps into Obj-C exception blocks should be disallowed.
This builds on Eli's work from http://llvm.org/viewvc/llvm-project?view=rev&revision=65678.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69073 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 25 | ||||
-rw-r--r-- | test/SemaObjC/scope-check-try-catch.m | 18 |
2 files changed, 31 insertions, 12 deletions
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 7675d5a9d6..7cc3029aae 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -2897,21 +2897,22 @@ Sema::DeclPtrTy Sema::ActOnStartOfFunctionDef(Scope *FnBodyScope, DeclPtrTy D) { } static bool StatementCreatesScope(Stmt* S) { - DeclStmt *DS = dyn_cast<DeclStmt>(S); - if (DS == 0) return false; - for (DeclStmt::decl_iterator I = DS->decl_begin(), E = DS->decl_end(); - I != E; ++I) { - if (VarDecl *D = dyn_cast<VarDecl>(*I)) { - if (D->getType()->isVariablyModifiedType() || - D->hasAttr<CleanupAttr>()) - return true; - } else if (TypedefDecl *D = dyn_cast<TypedefDecl>(*I)) { - if (D->getUnderlyingType()->isVariablyModifiedType()) - return true; + if (DeclStmt *DS = dyn_cast<DeclStmt>(S)) { + for (DeclStmt::decl_iterator I = DS->decl_begin(), E = DS->decl_end(); + I != E; ++I) { + if (VarDecl *D = dyn_cast<VarDecl>(*I)) { + if (D->getType()->isVariablyModifiedType() || + D->hasAttr<CleanupAttr>()) + return true; + } else if (TypedefDecl *D = dyn_cast<TypedefDecl>(*I)) { + if (D->getUnderlyingType()->isVariablyModifiedType()) + return true; + } } + } else if (isa<ObjCAtTryStmt>(S)) { + return true; } - return false; } diff --git a/test/SemaObjC/scope-check-try-catch.m b/test/SemaObjC/scope-check-try-catch.m new file mode 100644 index 0000000000..b11eb040d3 --- /dev/null +++ b/test/SemaObjC/scope-check-try-catch.m @@ -0,0 +1,18 @@ +// RUN: clang-cc -fsyntax-only -verify %s + +@class A, B, C; + +void f() { + goto L; // expected-error{{illegal jump}} + goto L2; // expected-error{{illegal jump}} + goto L3; // expected-error{{illegal jump}} + @try { +L: ; + } @catch (A *x) { +L2: ; + } @catch (B *x) { + } @catch (C *c) { + } @finally { +L3: ; + } +} |