Sema checking for incorrect placement of __block. Radar 6441502
llvm-svn: 70452
This commit is contained in:
parent
29405d836b
commit
e9efa80c00
|
@ -1614,6 +1614,8 @@ def err_noreturn_function_has_return_expr : Error<
|
|||
"function %0 declared 'noreturn' should not return">;
|
||||
def err_noreturn_block_has_return_expr : Error<
|
||||
"block declared 'noreturn' should not return">;
|
||||
def err_block_on_nonlocal : Error<
|
||||
"__block attribute not allowed, only allowed on local variables">;
|
||||
|
||||
def err_shufflevector_non_vector : Error<
|
||||
"first two arguments to __builtin_shufflevector must be vectors">;
|
||||
|
|
|
@ -1909,6 +1909,11 @@ void Sema::CheckVariableDeclaration(VarDecl *NewVD, NamedDecl *PrevDecl,
|
|||
return NewVD->setInvalidDecl();
|
||||
}
|
||||
|
||||
if (!NewVD->hasLocalStorage() && NewVD->hasAttr<BlocksAttr>()) {
|
||||
Diag(NewVD->getLocation(), diag::err_block_on_nonlocal);
|
||||
return NewVD->setInvalidDecl();
|
||||
}
|
||||
|
||||
if (PrevDecl) {
|
||||
Redeclaration = true;
|
||||
MergeVarDecl(NewVD, PrevDecl);
|
||||
|
@ -2818,6 +2823,10 @@ Sema::ActOnParamDeclarator(Scope *S, Declarator &D) {
|
|||
IdResolver.AddDecl(New);
|
||||
|
||||
ProcessDeclAttributes(New, D);
|
||||
|
||||
if (New->hasAttr<BlocksAttr>()) {
|
||||
Diag(New->getLocation(), diag::err_block_on_nonlocal);
|
||||
}
|
||||
return DeclPtrTy::make(New);
|
||||
}
|
||||
|
||||
|
@ -4256,4 +4265,3 @@ Sema::DeclPtrTy Sema::ActOnFileScopeAsmDecl(SourceLocation Loc,
|
|||
return DeclPtrTy::make(FileScopeAsmDecl::Create(Context, CurContext,
|
||||
Loc, AsmString));
|
||||
}
|
||||
|
||||
|
|
|
@ -146,3 +146,11 @@ void (^test15f)(void);
|
|||
void test15() {
|
||||
foo(^{ return LESS; }); // expected-error {{incompatible block pointer types passing 'int (^)(void)', expected 'long (^)()'}}
|
||||
}
|
||||
|
||||
__block int test16i; // expected-error {{__block attribute not allowed, only allowed on local variables}}
|
||||
|
||||
void test16(__block int i) { // expected-error {{__block attribute not allowed, only allowed on local variables}}
|
||||
extern __block double extern_var; // expected-error {{__block attribute not allowed, only allowed on local variables}}
|
||||
static __block char * pch; // expected-error {{__block attribute not allowed, only allowed on local variables}}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue