On Mon, Feb 11, 2013 at 5:37 PM, Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On Mon, Feb 11, 2013 at 5:29 PM, John McCall <span dir="ltr"><<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>></span> wrote:<br></div></div><div class="gmail_quote">
<div><div class="h5"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: rjmccall<br>
Date: Mon Feb 11 19:29:43 2013<br>
New Revision: 174928<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=174928&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=174928&view=rev</a><br>
Log:<br>
Diagnose loads of 'half' l-values in OpenCL.<br>
Patch by Joey Gouly!<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
    cfe/trunk/lib/Sema/SemaCast.cpp<br>
    cfe/trunk/lib/Sema/SemaExpr.cpp<br>
    cfe/trunk/lib/Sema/SemaType.cpp<br>
    cfe/trunk/test/SemaOpenCL/<a href="http://half.cl" target="_blank">half.cl</a><br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=174928&r1=174927&r2=174928&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=174928&r1=174927&r2=174928&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Feb 11 19:29:43 2013<br>
@@ -420,12 +420,9 @@ def err_object_cannot_be_passed_returned<br>
   "; did you forget * in %1?">;<br>
 def err_parameters_retval_cannot_have_fp16_type : Error<<br>
   "%select{parameters|function return value}0 cannot have __fp16 type; did you forget * ?">;<br>
-def err_opencl_half_dereferencing : Error<<br>
-  "dereferencing pointer of type %0 is not allowed">;<br>
-def err_opencl_half_subscript : Error<<br>
-  "subscript to array of type %0 is not allowed">;<br>
+def err_opencl_half_load_store : Error<<br>
+  "%select{loading directly from|assigning directly to}0 pointer to type %1 is not allowed">;<br></blockquote><div><br></div></div></div><div>Shouldn't the "assigning" half of this diagnostic be emitted somewhere? All the tests for it seem to have been removed too.</div>
</div></blockquote><div><br></div><div>Ha, I see you've brought this up on the other thread. Never mind then!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="gmail_quote"><div><div class="h5"><div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 def err_opencl_cast_to_half : Error<"casting to type %0 is not allowed">;<br>
-def err_opencl_cast_from_half : Error<"casting from type %0 is not allowed">;<br>
 def err_opencl_half_declaration : Error<<br>
   "declaring variable of type %0 is not allowed">;<br>
 def err_opencl_half_argument : Error<<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaCast.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=174928&r1=174927&r2=174928&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=174928&r1=174927&r2=174928&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaCast.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaCast.cpp Mon Feb 11 19:29:43 2013<br>
@@ -2111,12 +2111,6 @@ void CastOperation::CheckCStyleCast() {<br>
       SrcExpr = ExprError();<br>
       return;<br>
     }<br>
-    if (SrcExpr.get()->getType()->isHalfType()) {<br>
-      Self.Diag(SrcExpr.get()->getLocStart(), diag::err_opencl_cast_from_half)<br>
-        << SrcType << SrcExpr.get()->getSourceRange();<br>
-      SrcExpr = ExprError();<br>
-      return;<br>
-    }<br>
   }<br>
<br>
   // ARC imposes extra restrictions on casts.<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=174928&r1=174927&r2=174928&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=174928&r1=174927&r2=174928&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Feb 11 19:29:43 2013<br>
@@ -482,6 +482,14 @@ ExprResult Sema::DefaultLvalueConversion<br>
   if (T->isVoidType())<br>
     return Owned(E);<br>
<br>
+  // OpenCL usually rejects direct accesses to values of 'half' type.<br>
+  if (getLangOpts().OpenCL && !getOpenCLOptions().cl_khr_fp16 &&<br>
+      T->isHalfType()) {<br>
+    Diag(E->getExprLoc(), diag::err_opencl_half_load_store)<br>
+      << 0 << T;<br>
+    return ExprError();<br>
+  }<br>
+<br>
   CheckForNullPointerDereference(*this, E);<br>
<br>
   // C++ [conv.lval]p1:<br>
@@ -3487,13 +3495,6 @@ Sema::CreateBuiltinArraySubscriptExpr(Ex<br>
                           diag::err_subscript_incomplete_type, BaseExpr))<br>
     return ExprError();<br>
<br>
-  if (ResultType->isHalfType() && getLangOpts().OpenCL &&<br>
-      !getOpenCLOptions().cl_khr_fp16) {<br>
-    Diag(BaseExpr->getLocStart(), diag::err_opencl_half_subscript) << ResultType<br>
-      << BaseExpr->getType() << BaseExpr->getSourceRange();<br>
-    return ExprError();<br>
-  }<br>
-<br>
   assert(VK == VK_RValue || LangOpts.CPlusPlus ||<br>
          !ResultType.isCForbiddenLValueType());<br>
<br>
@@ -5663,7 +5664,6 @@ Sema::CheckAssignmentConstraints(QualTyp<br>
   LHSType = Context.getCanonicalType(LHSType).getUnqualifiedType();<br>
   RHSType = Context.getCanonicalType(RHSType).getUnqualifiedType();<br>
<br>
-<br>
   // Common case: no conversion required.<br>
   if (LHSType == RHSType) {<br>
     Kind = CK_NoOp;<br>
@@ -8241,13 +8241,6 @@ static QualType CheckIndirectionOperand(<br>
       << OpTy << Op->getSourceRange();<br>
     return QualType();<br>
   }<br>
-<br>
-  if (Result->isHalfType() && S.getLangOpts().OpenCL &&<br>
-      !S.getOpenCLOptions().cl_khr_fp16) {<br>
-    S.Diag(OpLoc, diag::err_opencl_half_dereferencing)<br>
-      << OpTy << Op->getSourceRange();<br>
-    return QualType();<br>
-  }<br>
<br>
   // Dereferences are usually l-values...<br>
   VK = VK_LValue;<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaType.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=174928&r1=174927&r2=174928&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=174928&r1=174927&r2=174928&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaType.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaType.cpp Mon Feb 11 19:29:43 2013<br>
@@ -2642,6 +2642,7 @@ static TypeSourceInfo *GetFullTypeForDec<br>
                 S.Diag(Param->getLocation(),<br>
                   diag::err_opencl_half_argument) << ArgTy;<br>
                 D.setInvalidType();<br>
+                Param->setInvalidDecl();<br>
               }<br>
             } else {<br>
               S.Diag(Param->getLocation(),<br>
<br>
Modified: cfe/trunk/test/SemaOpenCL/<a href="http://half.cl" target="_blank">half.cl</a><br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/half.cl?rev=174928&r1=174927&r2=174928&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/half.cl?rev=174928&r1=174927&r2=174928&view=diff</a><br>


==============================================================================<br>
--- cfe/trunk/test/SemaOpenCL/<a href="http://half.cl" target="_blank">half.cl</a> (original)<br>
+++ cfe/trunk/test/SemaOpenCL/<a href="http://half.cl" target="_blank">half.cl</a> Mon Feb 11 19:29:43 2013<br>
@@ -1,4 +1,4 @@<br>
-// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only<br>
+// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -Wno-unused-value<br>
<br>
 #pragma OPENCL EXTENSION cl_khr_fp16 : disable<br>
<br>
@@ -7,16 +7,15 @@ half half_disabled(half *p, // expected-<br>
 {<br>
   half a[2]; // expected-error{{declaring variable of type 'half [2]' is not allowed}}<br>
   half b;    // expected-error{{declaring variable of type 'half' is not allowed}}<br>
-<br>
-  b = *p;    // expected-error{{dereferencing pointer of type 'half *' is not allowed}}<br>
-  *p = b;    // expected-error{{dereferencing pointer of type 'half *' is not allowed}}<br>
-<br>
-  b = p[1];  // expected-error {{subscript to array of type 'half' is not allowed}}<br>
-  p[1] = b;  // expected-error {{subscript to array of type 'half' is not allowed}}<br>
+  *p; // expected-error{{loading directly from pointer to type 'half' is not allowed}}<br>
+  p[1]; // expected-error{{loading directly from pointer to type 'half' is not allowed}}<br>
<br>
   float c = 1.0f;<br>
   b = (half) c;  // expected-error{{casting to type 'half' is not allowed}}<br>
-  c = (float) h; // expected-error{{casting from type 'half' is not allowed}}<br>
+<br>
+  half *allowed = &p[1];<br>
+  half *allowed2 = &*p;<br>
+  half *allowed3 = p + 1;<br>
<br>
   return h;<br>
 }<br>
@@ -27,16 +26,15 @@ half half_enabled(half *p, half h)<br>
 {<br>
   half a[2];<br>
   half b;<br>
-<br>
-  b = *p;<br>
-  *p = b;<br>
-<br>
-  b = p[1];<br>
-  p[1] = b;<br>
+  *p;<br>
+  p[1];<br>
<br>
   float c = 1.0f;<br>
   b = (half) c;<br>
-  c = (float) h;<br>
+<br>
+  half *allowed = &p[1];<br>
+  half *allowed2 = &*p;<br>
+  half *allowed3 = p + 1;<br>
<br>
   return h;<br>
 }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div></div><br>
</blockquote></div><br>