diff options
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 11 | ||||
| -rw-r--r-- | clang/test/SemaOpenCL/invalid-kernel-attrs.cl | 4 | 
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}}  | 

