r174928 - Diagnose loads of 'half' l-values in OpenCL.

John McCall rjmccall at apple.com
Mon Feb 11 17:29:44 PST 2013


Author: rjmccall
Date: Mon Feb 11 19:29:43 2013
New Revision: 174928

URL: http://llvm.org/viewvc/llvm-project?rev=174928&view=rev
Log:
Diagnose loads of 'half' l-values in OpenCL.
Patch by Joey Gouly!

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
    cfe/trunk/lib/Sema/SemaCast.cpp
    cfe/trunk/lib/Sema/SemaExpr.cpp
    cfe/trunk/lib/Sema/SemaType.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=174928&r1=174927&r2=174928&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Feb 11 19:29:43 2013
@@ -420,12 +420,9 @@ def err_object_cannot_be_passed_returned
   "; did you forget * in %1?">;
 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_dereferencing : Error<
-  "dereferencing pointer of type %0 is not allowed">;
-def err_opencl_half_subscript : Error<
-  "subscript to array of type %0 is not allowed">;
+def err_opencl_half_load_store : Error<
+  "%select{loading directly from|assigning directly to}0 pointer to type %1 is not allowed">;
 def err_opencl_cast_to_half : Error<"casting to type %0 is not allowed">;
-def err_opencl_cast_from_half : Error<"casting from type %0 is not allowed">;
 def err_opencl_half_declaration : Error<
   "declaring variable of type %0 is not allowed">;
 def err_opencl_half_argument : Error<

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

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

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

Modified: cfe/trunk/test/SemaOpenCL/half.cl
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/half.cl?rev=174928&r1=174927&r2=174928&view=diff
==============================================================================
--- cfe/trunk/test/SemaOpenCL/half.cl (original)
+++ cfe/trunk/test/SemaOpenCL/half.cl Mon Feb 11 19:29:43 2013
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only
+// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -Wno-unused-value
 
 #pragma OPENCL EXTENSION cl_khr_fp16 : disable
 
@@ -7,16 +7,15 @@ 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}}
-
-  b = *p;    // expected-error{{dereferencing pointer of type 'half *' is not allowed}}
-  *p = b;    // expected-error{{dereferencing pointer of type 'half *' is not allowed}}
-
-  b = p[1];  // expected-error {{subscript to array of type 'half' is not allowed}}
-  p[1] = b;  // expected-error {{subscript to array 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}}
 
   float c = 1.0f;
   b = (half) c;  // expected-error{{casting to type 'half' is not allowed}}
-  c = (float) h; // expected-error{{casting from type 'half' is not allowed}}
+
+  half *allowed = &p[1];
+  half *allowed2 = &*p;
+  half *allowed3 = p + 1;
 
   return h;
 }
@@ -27,16 +26,15 @@ half half_enabled(half *p, half h)
 {
   half a[2];
   half b;
-
-  b = *p;
-  *p = b;
-
-  b = p[1];
-  p[1] = b;
+  *p;
+  p[1];
 
   float c = 1.0f;
   b = (half) c;
-  c = (float) h;
+
+  half *allowed = &p[1];
+  half *allowed2 = &*p;
+  half *allowed3 = p + 1;
 
   return h;
 }





More information about the cfe-commits mailing list