summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAnastasia Stulova <anastasia.stulova@arm.com>2017-02-16 11:13:30 +0000
committerAnastasia Stulova <anastasia.stulova@arm.com>2017-02-16 11:13:30 +0000
commit9d98a316c5c3bc182e0c1301513c276c96b0563a (patch)
tree58bfba56ead26095ac0dd0a69910f20c1c98f3d5 /clang
parenta93803b9fe8817607ce7be9c5ba8ce3b3611e8ee (diff)
downloadbcm5719-llvm-9d98a316c5c3bc182e0c1301513c276c96b0563a.tar.gz
bcm5719-llvm-9d98a316c5c3bc182e0c1301513c276c96b0563a.zip
[OpenCL] Disallow blocks capture other blocks (v2.0, s6.12.5)
llvm-svn: 295307
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaExpr.cpp7
-rw-r--r--clang/test/SemaOpenCL/invalid-block.cl15
3 files changed, 24 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 6049d488de8..615050603d3 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -8299,6 +8299,8 @@ def err_opencl_invalid_block_declaration : Error<
"invalid block variable declaration - must be %select{const qualified|initialized}0">;
def err_opencl_extern_block_declaration : Error<
"invalid block variable declaration - using 'extern' storage class is disallowed">;
+def err_opencl_block_ref_block : Error<
+ "cannot refer to a block inside block">;
// OpenCL v2.0 s6.13.9 - Address space qualifier functions.
def err_opencl_builtin_to_addr_arg_num : Error<
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
index 39116f9c1ea..ce4c22bb7f9 100644
--- a/clang/lib/Sema/SemaExpr.cpp
+++ b/clang/lib/Sema/SemaExpr.cpp
@@ -13565,6 +13565,13 @@ static bool isVariableCapturable(CapturingScopeInfo *CSI, VarDecl *Var,
}
return false;
}
+ // OpenCL v2.0 s6.12.5: Blocks cannot reference/capture other blocks
+ if (S.getLangOpts().OpenCL && IsBlock &&
+ Var->getType()->isBlockPointerType()) {
+ if (Diagnose)
+ S.Diag(Loc, diag::err_opencl_block_ref_block);
+ return false;
+ }
return true;
}
diff --git a/clang/test/SemaOpenCL/invalid-block.cl b/clang/test/SemaOpenCL/invalid-block.cl
index 598784c95a0..89bf03264e1 100644
--- a/clang/test/SemaOpenCL/invalid-block.cl
+++ b/clang/test/SemaOpenCL/invalid-block.cl
@@ -66,3 +66,18 @@ void f6(bl2_t *bl_ptr) { // expected-error{{pointer to type '__generic bl2_t' (a
*bl; // expected-error {{invalid argument type 'bl2_t' (aka 'int (__generic ^const)(int)') to unary expression}}
&bl; // expected-error {{invalid argument type 'bl2_t' (aka 'int (__generic ^const)(int)') to unary expression}}
}
+// A block can't reference another block
+kernel void f7() {
+ bl2_t bl1 = ^(int i) {
+ return 1;
+ };
+ void (^bl2)(void) = ^{
+ int i = bl1(1); // expected-error {{cannot refer to a block inside block}}
+ };
+ void (^bl3)(void) = ^{
+ };
+ void (^bl4)(void) = ^{
+ bl3(); // expected-error {{cannot refer to a block inside block}}
+ };
+ return;
+}
OpenPOWER on IntegriCloud