diff options
author | Joey Gouly <joey.gouly@arm.com> | 2013-01-29 10:54:06 +0000 |
---|---|---|
committer | Joey Gouly <joey.gouly@arm.com> | 2013-01-29 10:54:06 +0000 |
commit | 98f988dc1bea127fbc2db76d9ffafdcf5f4435e4 (patch) | |
tree | 5be538ed53df7bd7b42cebf9f4fe8ece462e369a | |
parent | e702ff302bdb3c53a252b0bcd2deab72fdee274f (diff) |
Add a diagnostic for an OpenCL kernel with a pointer pointer argument.
Also refactor the surrounding code a little.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173791 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 23 | ||||
-rw-r--r-- | test/SemaOpenCL/invalid-kernel.cl | 3 |
3 files changed, 21 insertions, 7 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 86c0691b07..6e27d1388b 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -6105,6 +6105,8 @@ def err_invalid_astype_of_different_size : Error< "invalid reinterpretation: sizes of %0 and %1 must match">; def err_static_kernel : Error< "kernel functions cannot be declared static">; +def err_opencl_ptrptr_kernel_arg : Error< + "kernel argument cannot be declared as a pointer to a pointer">; def err_static_function_scope : Error< "variables in function scope cannot be declared static">; def err_opencl_bitfields : Error< diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 9c3666413b..56db548aa6 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -6211,7 +6211,6 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, } if (NewFD->hasAttr<OpenCLKernelAttr>()) { - // OpenCL v1.2 s6.8 static is invalid for kernel functions. if ((getLangOpts().OpenCLVersion >= 120) && (SC == SC_Static)) { @@ -6219,17 +6218,27 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, D.setInvalidType(); } - // OpenCL v1.2 s6.8 n: - // Arguments to kernel functions in a program cannot be declared to be of - // type event_t. for (FunctionDecl::param_iterator PI = NewFD->param_begin(), PE = NewFD->param_end(); PI != PE; ++PI) { - if ((*PI)->getType()->isEventT()) { - Diag((*PI)->getLocation(), diag::err_event_t_kernel_arg); + ParmVarDecl *Param = *PI; + QualType PT = Param->getType(); + + // OpenCL v1.2 s6.9.a: + // A kernel function argument cannot be declared as a + // pointer to a pointer type. + if (PT->isPointerType() && PT->getPointeeType()->isPointerType()) { + Diag(Param->getLocation(), diag::err_opencl_ptrptr_kernel_arg); + D.setInvalidType(); + } + + // OpenCL v1.2 s6.8 n: + // A kernel function argument cannot be declared + // of event_t type. + if (PT->isEventT()) { + Diag(Param->getLocation(), diag::err_event_t_kernel_arg); D.setInvalidType(); } } - } MarkUnusedFileScopedDecl(NewFD); diff --git a/test/SemaOpenCL/invalid-kernel.cl b/test/SemaOpenCL/invalid-kernel.cl new file mode 100644 index 0000000000..a06b0e1e09 --- /dev/null +++ b/test/SemaOpenCL/invalid-kernel.cl @@ -0,0 +1,3 @@ +// RUN: %clang_cc1 -verify %s + +kernel void no_ptrptr(global int **i) { } // expected-error{{kernel argument cannot be declared as a pointer to a pointer}} |