Disallow captured arrays in blocks as well. Radar 7438948.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92677 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mike Stump 2010-01-05 03:10:36 +00:00
Родитель 0d6fd570e5
Коммит 2849734790
3 изменённых файлов: 16 добавлений и 0 удалений

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

@ -1723,6 +1723,8 @@ def err_unexpected_interface : Error<
def err_ref_non_value : Error<"%0 does not refer to a value">;
def err_ref_vm_type : Error<
"cannot refer to declaration with a variably modified type inside block">;
def err_ref_array_type : Error<
"cannot refer to declaration with an array type inside block">;
def err_property_not_found : Error<
"property %0 not found on object of type %1">;
def err_duplicate_property : Error<

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

@ -1537,6 +1537,12 @@ Sema::BuildDeclarationNameExpr(const CXXScopeSpec &SS,
return ExprError();
}
if (VD->getType()->isArrayType()) {
Diag(Loc, diag::err_ref_array_type);
Diag(D->getLocation(), diag::note_declared_at);
return ExprError();
}
MarkDeclarationReferenced(Loc, VD);
QualType ExprTy = VD->getType().getNonReferenceType();
// The BlocksAttr indicates the variable is bound by-reference.

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

@ -208,3 +208,11 @@ void test20() {
(void)(vm+1); // expected-error {{cannot refer to declaration with a variably modified type inside block}}
}();
}
void test21() {
int a[7]; // expected-note {{declared at}}
a[1] = 1;
^{
(void)a[1]; // expected-error {{cannot refer to declaration with an array type inside block}}
}();
}