summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoey Gouly <joey.gouly@gmail.com>2014-05-19 14:41:38 +0000
committerJoey Gouly <joey.gouly@gmail.com>2014-05-19 14:41:38 +0000
commitb1d23a8db36ca2ff21e94017c62e3647c8e85fd7 (patch)
treeccadb94c2281348c1b0f4325f1433f84284eff74
parent0dfed533ecb957a3b20b26185739ba9156dc16a0 (diff)
downloadbcm5719-llvm-b1d23a8db36ca2ff21e94017c62e3647c8e85fd7.tar.gz
bcm5719-llvm-b1d23a8db36ca2ff21e94017c62e3647c8e85fd7.zip
[OpenCL] Reject reqd_work_group_size(X, Y, Z) where X, Y or Z == 0.
Patch by Pedro Ferreira! llvm-svn: 209127
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td2
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp11
-rw-r--r--clang/test/SemaOpenCL/invalid-kernel-attrs.cl4
3 files changed, 15 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 40d92d09531..d6d0d0b3c85 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -2002,6 +2002,8 @@ def warn_concatenated_nsarray_literal : Warning<
InGroup<ObjCStringConcatenation>;
def note_objc_literal_comparison_isequal : Note<
"use 'isEqual:' instead">;
+def err_attribute_argument_is_zero : Error<
+ "%0 attribute must be greater than 0">;
let CategoryName = "Cocoa API Issue" in {
def warn_objc_redundant_literal_use : Warning<
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 9caf9189b9b..2e97a8aa9d4 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -2180,9 +2180,16 @@ template <typename WorkGroupAttr>
static void handleWorkGroupSize(Sema &S, Decl *D,
const AttributeList &Attr) {
uint32_t WGSize[3];
- for (unsigned i = 0; i < 3; ++i)
- if (!checkUInt32Argument(S, Attr, Attr.getArgAsExpr(i), WGSize[i], i))
+ for (unsigned i = 0; i < 3; ++i) {
+ const Expr *E = Attr.getArgAsExpr(i);
+ if (!checkUInt32Argument(S, Attr, E, WGSize[i], i))
return;
+ if (WGSize[i] == 0) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_argument_is_zero)
+ << Attr.getName() << E->getSourceRange();
+ return;
+ }
+ }
WorkGroupAttr *Existing = D->getAttr<WorkGroupAttr>();
if (Existing && !(Existing->getXDim() == WGSize[0] &&
diff --git a/clang/test/SemaOpenCL/invalid-kernel-attrs.cl b/clang/test/SemaOpenCL/invalid-kernel-attrs.cl
index f766ade0587..4b4fdf79e3d 100644
--- a/clang/test/SemaOpenCL/invalid-kernel-attrs.cl
+++ b/clang/test/SemaOpenCL/invalid-kernel-attrs.cl
@@ -31,3 +31,7 @@ void f_kernel_image2d_t( kernel image2d_t image ) { // expected-error {{'kernel'
read_only int i; // expected-error {{'read_only' attribute only applies to parameters}}
__write_only int j; // expected-error {{'__write_only' attribute only applies to parameters}}
}
+
+kernel __attribute__((reqd_work_group_size(1,2,0))) void kernel11(){} // expected-error {{'reqd_work_group_size' attribute must be greater than 0}}
+kernel __attribute__((reqd_work_group_size(1,0,2))) void kernel12(){} // expected-error {{'reqd_work_group_size' attribute must be greater than 0}}
+kernel __attribute__((reqd_work_group_size(0,1,2))) void kernel13(){} // expected-error {{'reqd_work_group_size' attribute must be greater than 0}}
OpenPOWER on IntegriCloud