Author: yaxunl Date: Mon Sep 19 09:54:41 2016 New Revision: 281904 URL: http://llvm.org/viewvc/llvm-project?rev=281904&view=rev Log: [OpenCL] Diagnose assignment to dereference of half type pointer
Differential Revision: https://reviews.llvm.org/D24626 Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/SemaOpenCL/half.cl Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=281904&r1=281903&r2=281904&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Sep 19 09:54:41 2016 @@ -659,7 +659,8 @@ def err_object_cannot_be_passed_returned def err_parameters_retval_cannot_have_fp16_type : Error< "%select{parameters|function return value}0 cannot have __fp16 type; did you forget * ?">; def err_opencl_half_load_store : Error< - "%select{loading directly from|assigning directly to}0 pointer to type %1 is not allowed">; + "%select{loading directly from|assigning directly to}0 pointer to type %1 requires " + "cl_khr_fp16. Use vector data %select{load|store}0 builtin functions instead">; def err_opencl_cast_to_half : Error<"casting to type %0 is not allowed">; def err_opencl_half_declaration : Error< "declaring variable of type %0 is not allowed">; Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=281904&r1=281903&r2=281904&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Sep 19 09:54:41 2016 @@ -10100,6 +10100,16 @@ QualType Sema::CheckAssignmentOperands(E QualType LHSType = LHSExpr->getType(); QualType RHSType = CompoundType.isNull() ? RHS.get()->getType() : CompoundType; + // OpenCL v1.2 s6.1.1.1 p2: + // The half data type can only be used to declare a pointer to a buffer that + // contains half values + if (getLangOpts().OpenCL && !getOpenCLOptions().cl_khr_fp16 && + LHSType->isHalfType()) { + Diag(Loc, diag::err_opencl_half_load_store) << 1 + << LHSType.getUnqualifiedType(); + return QualType(); + } + AssignConvertType ConvTy; if (CompoundType.isNull()) { Expr *RHSCheck = RHS.get(); Modified: cfe/trunk/test/SemaOpenCL/half.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/half.cl?rev=281904&r1=281903&r2=281904&view=diff ============================================================================== --- cfe/trunk/test/SemaOpenCL/half.cl (original) +++ cfe/trunk/test/SemaOpenCL/half.cl Mon Sep 19 09:54:41 2016 @@ -8,8 +8,10 @@ half half_disabled(half *p, // expected- { half a[2]; // expected-error{{declaring variable of type 'half [2]' is not allowed}} half b; // expected-error{{declaring variable of type 'half' is not allowed}} - *p; // expected-error{{loading directly from pointer to type 'half' is not allowed}} - p[1]; // expected-error{{loading directly from pointer to type 'half' is not allowed}} + *p; // expected-error{{loading directly from pointer to type 'half' requires cl_khr_fp16. Use vector data load builtin functions instead}} + *p = 0; // expected-error{{assigning directly to pointer to type 'half' requires cl_khr_fp16. Use vector data store builtin functions instead}} + p[1]; // expected-error{{loading directly from pointer to type 'half' requires cl_khr_fp16. Use vector data load builtin functions instead}} + p[1] = 0; // expected-error{{assigning directly to pointer to type 'half' requires cl_khr_fp16. Use vector data store builtin functions instead}} float c = 1.0f; b = (half) c; // expected-error{{casting to type 'half' is not allowed}} @@ -31,7 +33,9 @@ half half_enabled(half *p, half h) half a[2]; half b; *p; + *p = 0; p[1]; + p[1] = 0; float c = 1.0f; b = (half) c; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits