зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
0d6fd570e5
Коммит
2849734790
|
@ -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}}
|
||||
}();
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче