]> granicus.if.org Git - clang/commitdiff
Sema checking for incorrect placement of __block. Radar 6441502
authorMike Stump <mrs@apple.com>
Thu, 30 Apr 2009 00:19:40 +0000 (00:19 +0000)
committerMike Stump <mrs@apple.com>
Thu, 30 Apr 2009 00:19:40 +0000 (00:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70452 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/Sema/block-misc.c

index bf70de99ebd3508aae79d256e99ef123fc86ee9b..3a33a0678ed4aa3204b1cd0c82c7e5afa51bb144 100644 (file)
@@ -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">;
index 4d6a103ccd709ab8ec5c08915af49919fbdf3910..9e2bd444f85d89c8c8f54d51ca1acad67ea494b8 100644 (file)
@@ -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));
 }
-
index d4b4088aeeb898106f9c9688a43d602b5e891195..397d3e5af6b12f0133eeb875d07fab27c50ffae8 100644 (file)
@@ -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}}
+}
+