forked from OSchip/llvm-project
Add a diagnostic for an OpenCL kernel with a pointer pointer argument.
Also refactor the surrounding code a little. llvm-svn: 173791
This commit is contained in:
parent
064697ca06
commit
39989dadd3
|
@ -6105,6 +6105,8 @@ def err_invalid_astype_of_different_size : Error<
|
||||||
"invalid reinterpretation: sizes of %0 and %1 must match">;
|
"invalid reinterpretation: sizes of %0 and %1 must match">;
|
||||||
def err_static_kernel : Error<
|
def err_static_kernel : Error<
|
||||||
"kernel functions cannot be declared static">;
|
"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<
|
def err_static_function_scope : Error<
|
||||||
"variables in function scope cannot be declared static">;
|
"variables in function scope cannot be declared static">;
|
||||||
def err_opencl_bitfields : Error<
|
def err_opencl_bitfields : Error<
|
||||||
|
|
|
@ -6211,7 +6211,6 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NewFD->hasAttr<OpenCLKernelAttr>()) {
|
if (NewFD->hasAttr<OpenCLKernelAttr>()) {
|
||||||
|
|
||||||
// OpenCL v1.2 s6.8 static is invalid for kernel functions.
|
// OpenCL v1.2 s6.8 static is invalid for kernel functions.
|
||||||
if ((getLangOpts().OpenCLVersion >= 120)
|
if ((getLangOpts().OpenCLVersion >= 120)
|
||||||
&& (SC == SC_Static)) {
|
&& (SC == SC_Static)) {
|
||||||
|
@ -6219,17 +6218,27 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC,
|
||||||
D.setInvalidType();
|
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(),
|
for (FunctionDecl::param_iterator PI = NewFD->param_begin(),
|
||||||
PE = NewFD->param_end(); PI != PE; ++PI) {
|
PE = NewFD->param_end(); PI != PE; ++PI) {
|
||||||
if ((*PI)->getType()->isEventT()) {
|
ParmVarDecl *Param = *PI;
|
||||||
Diag((*PI)->getLocation(), diag::err_event_t_kernel_arg);
|
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();
|
D.setInvalidType();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MarkUnusedFileScopedDecl(NewFD);
|
MarkUnusedFileScopedDecl(NewFD);
|
||||||
|
|
|
@ -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}}
|
Loading…
Reference in New Issue