From: Yaxun Liu Date: Tue, 14 Jun 2016 21:43:01 +0000 (+0000) Subject: [OpenCL] Enable -fblocks by default for OpenCL 2.0 and above. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10d86996371619393959250ea428545304b8b453;p=clang [OpenCL] Enable -fblocks by default for OpenCL 2.0 and above. Reviewed as part of http://reviews.llvm.org/D20444 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@272720 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index e15ef150ab..f74004fb2f 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/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/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index b217db96c7..581dd8160e 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/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/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 8f0f6017b3..6f23115f02 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/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/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index ddcdef8431..84ebb9bc86 100644 --- a/lib/Sema/SemaType.cpp +++ b/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/test/Frontend/opencl-blocks.cl b/test/Frontend/opencl-blocks.cl new file mode 100644 index 0000000000..b514efa7cf --- /dev/null +++ b/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 +}