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
This commit is contained in:
Fariborz Jahanian 2010-03-16 23:39:51 +00:00
Родитель e5877b08a6
Коммит 8596bbe00e
3 изменённых файлов: 3 добавлений и 23 удалений

Просмотреть файл

@ -1691,7 +1691,7 @@ Sema::BuildDeclarationNameExpr(const CXXScopeSpec &SS,
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();

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -214,8 +214,10 @@ void test20() {
// 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}}
}();
}