[PATCH] Permit OpenCL event_t's to be constructed from integer value 0.

Richard Smith richard at metafoo.co.uk
Fri Feb 21 10:47:59 PST 2014


  Can you show me where in the OpenCL spec this language rule is described? I can't find any allowance for casting zero to `event_t`.


================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6788
@@ -6787,1 +6787,3 @@
   "variable in constant address space must be initialized">;
+def error_opencl_cast_non_zero_to_event_t : Error<
+  "cannot cast non-zero value '%0' to 'event_t'">;
----------------
`err_`, not `error_`.

================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6789
@@ -6788,1 +6788,3 @@
+def error_opencl_cast_non_zero_to_event_t : Error<
+  "cannot cast non-zero value '%0' to 'event_t'">;
 } // end of sema category
----------------
Maybe '%1' instead of 'event_t' here, so we get a better diagnostic if the target type is a typedef ("cannot cast non-zero value '1' to 'foo' (aka 'event_t')")?

================
Comment at: lib/Sema/SemaCast.cpp:2242
@@ +2241,3 @@
+    // for OpenCL, allow casts from '0' to event_t type
+    if ((Self.getLangOpts().OpenCL) && DestType->isEventT()) {
+      llvm::APSInt intValue;
----------------
Remove redundant parens around OpenCL check.

================
Comment at: lib/Sema/SemaCast.cpp:2243
@@ +2242,3 @@
+    if ((Self.getLangOpts().OpenCL) && DestType->isEventT()) {
+      llvm::APSInt intValue;
+      if(SrcExpr.get()->EvaluateAsInt(intValue, Self.getASTContext())) {
----------------
Should be `IntValue`

================
Comment at: lib/Sema/SemaCast.cpp:2241
@@ -2240,1 +2240,3 @@
 
+    // for OpenCL, allow casts from '0' to event_t type
+    if ((Self.getLangOpts().OpenCL) && DestType->isEventT()) {
----------------
Capital F in For.

================
Comment at: lib/Sema/SemaCast.cpp:2244-2245
@@ +2243,4 @@
+      llvm::APSInt intValue;
+      if(SrcExpr.get()->EvaluateAsInt(intValue, Self.getASTContext())) {
+        if(0 == intValue) {
+          return;
----------------
Space between `if` and `(`.

================
Comment at: lib/Sema/SemaCast.cpp:2245
@@ +2244,3 @@
+      if(SrcExpr.get()->EvaluateAsInt(intValue, Self.getASTContext())) {
+        if(0 == intValue) {
+          return;
----------------
We don't do the constant-on-the-left thing in the Clang codebase. Also, `operator!` is more efficient than `!= 0` for `APSInt`.

================
Comment at: lib/Sema/SemaCast.cpp:2251
@@ +2250,3 @@
+          SrcExpr = ExprError();
+          return;
+        }
----------------
Both arms of this `if/else` return, factor that out?

================
Comment at: lib/Sema/SemaCast.cpp:2244
@@ +2243,3 @@
+      llvm::APSInt intValue;
+      if(SrcExpr.get()->EvaluateAsInt(intValue, Self.getASTContext())) {
+        if(0 == intValue) {
----------------
Richard Smith wrote:
> Space between `if` and `(`.
`EvaluateAsInt` is inappropriate here. I'm not sure exactly what the language rule is, but this surely isn't it. Maybe take a look at `TryOCLZeroEventInitialization` in `SemaInit.cpp`.


http://llvm-reviews.chandlerc.com/D2860



More information about the cfe-commits mailing list