sidorovd created this revision. sidorovd added reviewers: Anastasia, yaxunl. Herald added a subscriber: cfe-commits. sidorovd added a comment.
Previously this patch was reviewed here: https://reviews.llvm.org/D26794 . I wasn't able to update it, so I created a new one with the comments applied. Patch by Egor Churaev Repository: rC Clang https://reviews.llvm.org/D51722 Files: lib/Sema/SemaExpr.cpp test/SemaOpenCL/block-array-capturing.cl Index: test/SemaOpenCL/block-array-capturing.cl =================================================================== --- /dev/null +++ test/SemaOpenCL/block-array-capturing.cl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -O0 -cl-std=CL2.0 -triple spir64-unkown-unkown -emit-llvm %s -o -| FileCheck %s +// expected-no-diagnostics + +typedef int (^block_t)(); + +int block_typedef_kernel(global int* res) { + // CHECK: %{{.*}} = alloca <{ i32, i32, [3 x i32] }> + int a[3] = {1, 2, 3}; + // CHECK: call void @llvm.memcpy{{.*}} + block_t b = ^() { return a[0]; }; + return b(); +} + +// CHECK: define {{.*}} @__block_typedef_kernel_block_invoke +// CHECK: %{{.*}} = getelementptr inbounds [3 x i32], [3 x i32] addrspace(4)* %{{.*}}, i64 0, i64 0 +// CHECK-NOT: call void @llvm.memcpy{{.*}} Index: lib/Sema/SemaExpr.cpp =================================================================== --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -14624,8 +14624,8 @@ Expr *CopyExpr = nullptr; bool ByRef = false; - // Blocks are not allowed to capture arrays. - if (CaptureType->isArrayType()) { + // Blocks are not allowed to capture arrays, excepting OpenCL. + if (!S.getLangOpts().OpenCL && CaptureType->isArrayType()) { if (BuildAndDiagnose) { S.Diag(Loc, diag::err_ref_array_type); S.Diag(Var->getLocation(), diag::note_previous_decl)
Index: test/SemaOpenCL/block-array-capturing.cl =================================================================== --- /dev/null +++ test/SemaOpenCL/block-array-capturing.cl @@ -0,0 +1,16 @@ +// RUN: %clang_cc1 -O0 -cl-std=CL2.0 -triple spir64-unkown-unkown -emit-llvm %s -o -| FileCheck %s +// expected-no-diagnostics + +typedef int (^block_t)(); + +int block_typedef_kernel(global int* res) { + // CHECK: %{{.*}} = alloca <{ i32, i32, [3 x i32] }> + int a[3] = {1, 2, 3}; + // CHECK: call void @llvm.memcpy{{.*}} + block_t b = ^() { return a[0]; }; + return b(); +} + +// CHECK: define {{.*}} @__block_typedef_kernel_block_invoke +// CHECK: %{{.*}} = getelementptr inbounds [3 x i32], [3 x i32] addrspace(4)* %{{.*}}, i64 0, i64 0 +// CHECK-NOT: call void @llvm.memcpy{{.*}} Index: lib/Sema/SemaExpr.cpp =================================================================== --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -14624,8 +14624,8 @@ Expr *CopyExpr = nullptr; bool ByRef = false; - // Blocks are not allowed to capture arrays. - if (CaptureType->isArrayType()) { + // Blocks are not allowed to capture arrays, excepting OpenCL. + if (!S.getLangOpts().OpenCL && CaptureType->isArrayType()) { if (BuildAndDiagnose) { S.Diag(Loc, diag::err_ref_array_type); S.Diag(Var->getLocation(), diag::note_previous_decl)
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits