Issue error when a byref array is accessed in a block
literal. Fixes radar 7760213.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98693 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 32ed3e0..d80b25d 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1691,7 +1691,7 @@
       return ExprError();
     }
 
-    if (VD->getType()->isArrayType() && !VD->hasAttr<BlocksAttr>()) {
+    if (VD->getType()->isArrayType()) {
       Diag(Loc, diag::err_ref_array_type);
       Diag(D->getLocation(), diag::note_declared_at);
       return ExprError();
diff --git a/test/Sema/block-byref-args.c b/test/Sema/block-byref-args.c
deleted file mode 100644
index 255c97b..0000000
--- a/test/Sema/block-byref-args.c
+++ /dev/null
@@ -1,22 +0,0 @@
-// RUN: %clang_cc1 %s -fsyntax-only -verify -fblocks
-
-int printf(const char *, ...);
-
-int main(int argc, char **argv) {
-  __block void(*bobTheFunction)(void);
-  __block void(^bobTheBlock)(void);
-
-  bobTheBlock = ^{;};
-
-  __block int JJJJ;
-  __attribute__((__blocks__(byref))) int III;
-
-  int (^XXX)(void) = ^{ return III+JJJJ; };
-
-   // rdar 7671883
-   __block char array[10] = {'a', 'b', 'c', 'd'};
-   char (^ch)() = ^{ array[1] = 'X'; return array[5]; };
-   ch();
-
-  return 0;
-}
diff --git a/test/Sema/block-misc.c b/test/Sema/block-misc.c
index 1109be6..ca71ab1 100644
--- a/test/Sema/block-misc.c
+++ b/test/Sema/block-misc.c
@@ -214,8 +214,10 @@
 // radr://7438948
 void test21() {
   int a[7]; // expected-note {{declared at}}
+  __block int b[10]; // expected-note {{declared at}}
   a[1] = 1;
   ^{
     (void)a[1]; // expected-error {{cannot refer to declaration with an array type inside block}}
+    (void)b[1]; // expected-error {{cannot refer to declaration with an array type inside block}}
   }();
 }