Disallow captured arrays in blocks as well. Radar 7438948.

llvm-svn: 92677
This commit is contained in:
Mike Stump 2010-01-05 03:10:36 +00:00
parent 7dafa0d048
commit 8971a86538
3 changed files with 16 additions and 0 deletions

View File

@ -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_non_value : Error<"%0 does not refer to a value">;
def err_ref_vm_type : Error< def err_ref_vm_type : Error<
"cannot refer to declaration with a variably modified type inside block">; "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< def err_property_not_found : Error<
"property %0 not found on object of type %1">; "property %0 not found on object of type %1">;
def err_duplicate_property : Error< def err_duplicate_property : Error<

View File

@ -1537,6 +1537,12 @@ Sema::BuildDeclarationNameExpr(const CXXScopeSpec &SS,
return ExprError(); 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); MarkDeclarationReferenced(Loc, VD);
QualType ExprTy = VD->getType().getNonReferenceType(); QualType ExprTy = VD->getType().getNonReferenceType();
// The BlocksAttr indicates the variable is bound by-reference. // The BlocksAttr indicates the variable is bound by-reference.

View File

@ -208,3 +208,11 @@ void test20() {
(void)(vm+1); // expected-error {{cannot refer to declaration with a variably modified type inside block}} (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}}
}();
}