forked from OSchip/llvm-project
enhance the goto checker to reject jumps across __block variable definitions.
llvm-svn: 76376
This commit is contained in:
parent
be853b7b5d
commit
9662cd3227
|
@ -1066,6 +1066,8 @@ def note_protected_by_cxx_try : Note<
|
|||
"jump bypasses initialization of try block">;
|
||||
def note_protected_by_cxx_catch : Note<
|
||||
"jump bypasses initialization of catch block">;
|
||||
def note_protected_by___block : Note<
|
||||
"jump bypasses setup of __block variable">;
|
||||
|
||||
def err_func_returning_array_function : Error<
|
||||
"function cannot return array or function type %0">;
|
||||
|
|
|
@ -83,6 +83,8 @@ static unsigned GetDiagForGotoScopeDecl(const Decl *D) {
|
|||
return diag::note_protected_by_vla;
|
||||
if (VD->hasAttr<CleanupAttr>())
|
||||
return diag::note_protected_by_cleanup;
|
||||
if (VD->hasAttr<BlocksAttr>())
|
||||
return diag::note_protected_by___block;
|
||||
} else if (const TypedefDecl *TD = dyn_cast<TypedefDecl>(D)) {
|
||||
if (TD->getUnderlyingType()->isVariablyModifiedType())
|
||||
return diag::note_protected_by_vla_typedef;
|
||||
|
|
|
@ -1954,7 +1954,8 @@ void Sema::CheckVariableDeclaration(VarDecl *NewVD, NamedDecl *PrevDecl,
|
|||
Diag(NewVD->getLocation(), diag::warn_attribute_weak_on_local);
|
||||
|
||||
bool isVM = T->isVariablyModifiedType();
|
||||
if (isVM || NewVD->hasAttr<CleanupAttr>())
|
||||
if (isVM || NewVD->hasAttr<CleanupAttr>() ||
|
||||
NewVD->hasAttr<BlocksAttr>())
|
||||
CurFunctionNeedsScopeChecking = true;
|
||||
|
||||
if ((isVM && NewVD->hasLinkage()) ||
|
||||
|
|
|
@ -185,3 +185,16 @@ void test18() {
|
|||
void (^const blockA)(void) = ^{ };
|
||||
blockA = ^{ }; // expected-error {{read-only variable is not assignable}}
|
||||
}
|
||||
|
||||
// rdar://7072507
|
||||
int test19() {
|
||||
goto L0; // expected-error {{illegal goto into protected scope}}
|
||||
|
||||
__block int x; // expected-note {{jump bypasses setup of __block variable}}
|
||||
L0:
|
||||
x = 0;
|
||||
^(){ ++x; }();
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue