From: Mike Stump Date: Tue, 5 Jan 2010 03:10:36 +0000 (+0000) Subject: Disallow captured arrays in blocks as well. Radar 7438948. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2849734790738585a9726a84b263c60e3be0193f;p=clang 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 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 1f8934e076..fac4f7e1a5 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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< diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index f0d39dde9f..3d2ee74278 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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. diff --git a/test/Sema/block-misc.c b/test/Sema/block-misc.c index bc30552302..4179eda5e7 100644 --- a/test/Sema/block-misc.c +++ b/test/Sema/block-misc.c @@ -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}} + }(); +}