I have commit rights, but thanks anyway!

Joey
________________________________________
From: [email protected] [[email protected]] On 
Behalf Of John McCall [[email protected]]
Sent: 12 February 2013 01:29
To: [email protected]
Subject: r174928 - Diagnose loads of 'half' l-values in OpenCL.

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;
 }


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits


-- IMPORTANT NOTICE: The contents of this email and any attachments are 
confidential and may also be privileged. If you are not the intended recipient, 
please notify the sender immediately and do not disclose the contents to any 
other person, use it for any purpose, or store or copy the information in any 
medium.  Thank you.


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to