From 18e3fd3ad671d039e45fb47bfd65b39f5e46d2c0 Mon Sep 17 00:00:00 2001 From: Yaxun Liu Date: Tue, 14 Jun 2016 21:43:01 +0000 Subject: [PATCH] [OpenCL] Enable -fblocks by default for OpenCL 2.0 and above. Reviewed as part of http://reviews.llvm.org/D20444 llvm-svn: 272720 --- .../clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/lib/Frontend/CompilerInvocation.cpp | 3 ++- clang/lib/Sema/SemaExpr.cpp | 2 +- clang/lib/Sema/SemaType.cpp | 2 +- clang/test/Frontend/opencl-blocks.cl | 20 +++++++++++++++++++ 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 clang/test/Frontend/opencl-blocks.cl diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index e15ef150ab85..f74004fb2faf 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7349,7 +7349,7 @@ def err_generic_sel_multi_match : Error< // Blocks def err_blocks_disable : Error<"blocks support disabled - compile with -fblocks" - " or pick a deployment target that supports them">; + " or %select{pick a deployment target that supports them|for OpenCL 2.0 or above}0">; def err_block_returning_array_function : Error< "block cannot return %select{array|function}0 type %1">; diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index b217db96c7e5..581dd8160e45 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1827,7 +1827,8 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.RTTI = Opts.CPlusPlus && !Args.hasArg(OPT_fno_rtti); Opts.RTTIData = Opts.RTTI && !Args.hasArg(OPT_fno_rtti_data); - Opts.Blocks = Args.hasArg(OPT_fblocks); + Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL + && Opts.OpenCLVersion >= 200); Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional); Opts.Coroutines = Args.hasArg(OPT_fcoroutines); Opts.Modules = Args.hasArg(OPT_fmodules); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 8f0f6017b312..6f23115f02a8 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -12066,7 +12066,7 @@ ExprResult Sema::ActOnBlockStmtExpr(SourceLocation CaretLoc, Stmt *Body, Scope *CurScope) { // If blocks are disabled, emit an error. if (!LangOpts.Blocks) - Diag(CaretLoc, diag::err_blocks_disable); + Diag(CaretLoc, diag::err_blocks_disable) << LangOpts.OpenCL; // Leave the expression-evaluation context. if (hasAnyUnrecoverableErrorsInThisFunction()) diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index ddcdef843100..84ebb9bc8664 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3811,7 +3811,7 @@ static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState &state, case DeclaratorChunk::BlockPointer: // If blocks are disabled, emit an error. if (!LangOpts.Blocks) - S.Diag(DeclType.Loc, diag::err_blocks_disable); + S.Diag(DeclType.Loc, diag::err_blocks_disable) << LangOpts.OpenCL; // Handle pointer nullability. inferPointerNullability(SimplePointerKind::BlockPointer, diff --git a/clang/test/Frontend/opencl-blocks.cl b/clang/test/Frontend/opencl-blocks.cl new file mode 100644 index 000000000000..b514efa7cfc9 --- /dev/null +++ b/clang/test/Frontend/opencl-blocks.cl @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 %s -verify -fsyntax-only +// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL1.1 +// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL1.2 +// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL2.0 +// RUN: %clang_cc1 %s -verify -fsyntax-only -fblocks -DBLOCKS +// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL1.1 -fblocks -DBLOCKS +// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL1.2 -fblocks -DBLOCKS +// RUN: %clang_cc1 %s -triple amdgcn--amdhsa -x c -std=c99 -verify -fsyntax-only + +void f(void (^g)(void)) { +#ifdef __OPENCL_C_VERSION__ +#if __OPENCL_C_VERSION__ < CL_VERSION_2_0 && !defined(BLOCKS) + // expected-error@-3{{blocks support disabled - compile with -fblocks or for OpenCL 2.0 or above}} +#else + // expected-no-diagnostics +#endif +#else + // expected-error@-8{{blocks support disabled - compile with -fblocks or pick a deployment target that supports them}} +#endif +}