llvm-project/clang/test/SemaOpenCLCXX/invalid-kernel.clcpp
Anastasia Stulova e994e74bca [OpenCL] Add clang extension for non-portable kernel parameters.
Added __cl_clang_non_portable_kernel_param_types extension that
allows using non-portable types as kernel parameters. This allows
bypassing the portability guarantees from the restrictions specified
in C++ for OpenCL v1.0 s2.4.

Currently this only disables the restrictions related to the data
layout. The programmer should ensure the compiler generates the same
layout for host and device or otherwise the argument should only be
accessed on the device side. This extension could be extended to other
case (e.g. permitting size_t) if desired in the future.

Patch by olestrohm (Ole Strohm)!

https://reviews.llvm.org/D101168
2021-05-05 14:58:23 +01:00

96 lines
3.2 KiB
Plaintext

// RUN: %clang_cc1 %s -pedantic -verify -fsyntax-only -triple spir-unknown-unknown
// RUN: %clang_cc1 %s -pedantic -verify -fsyntax-only -triple spir-unknown-unknown -DUNSAFEKERNELPARAMETER
#ifdef UNSAFEKERNELPARAMETER
#pragma OPENCL EXTENSION __cl_clang_non_portable_kernel_param_types : enable
#endif
struct C {
kernel void m(); //expected-error{{kernel functions cannot be class members}}
};
template <typename T>
//expected-error@+1{{'T' cannot be used as the type of a kernel parameter}}
kernel void templ(T par) { //expected-error{{kernel functions cannot be used in a template declaration, instantiation or specialization}}
}
template <int>
kernel void bar(int par) { //expected-error{{kernel functions cannot be used in a template declaration, instantiation or specialization}}
}
kernel void foo(int); //expected-note{{previous declaration is here}}
kernel void foo(float); //expected-error{{conflicting types for 'foo'}}
kernel void int_v(int in);
kernel void int_p(__global int *in);
kernel void int_r(__global int &in);
kernel void int_p_p(__global int *__global *in);
kernel void int_p_r(__global int *__global &in);
kernel void int_p_p_r(__global int *__global *__global &in);
kernel void k_atomic_v(atomic_int in);
#ifndef UNSAFEKERNELPARAMETER
// expected-error@-2{{'__private atomic_int' (aka '__private _Atomic(int)') cannot be used as the type of a kernel parameter}}
#endif
kernel void k_atomic_p(__global atomic_int *in);
kernel void k_atomic_r(__global atomic_int &in);
kernel void k_pipe(read_only pipe int in, write_only pipe int out);
kernel void k_sampler(sampler_t in);
kernel void k_void(__global void *in);
typedef int int4 __attribute__((ext_vector_type(4)));
kernel void int4_v(int4 in);
kernel void int4_p(__global int4 *in);
kernel void int4_p_p(__global int4 *__global *in);
kernel void int4_r(__global int4 &in);
struct POD {
int a;
int b;
};
kernel void pod_v(POD in) {}
kernel void pod_p(__global POD *in) {}
kernel void pod_p_p(__global POD *__global *in) {}
kernel void pod_r(__global POD &in) {}
struct StandardLayout {
int a;
int b;
StandardLayout(int a, int b) : a(a), b(b) {}
};
kernel void standard_v(StandardLayout in) {}
#ifndef UNSAFEKERNELPARAMETER
//expected-error@-2{{'__private StandardLayout' cannot be used as the type of a kernel parameter}}
#endif
kernel void standard_p(__global StandardLayout *in) {}
kernel void standard_p_p(__global StandardLayout *__global *in) {}
kernel void standard_r(__global StandardLayout &in) {}
struct Trivial {
int a;
private:
int b;
};
kernel void trivial_v(Trivial in) {}
#ifndef UNSAFEKERNELPARAMETER
//expected-error@-2{{'__private Trivial' cannot be used as the type of a kernel parameter}}
#endif
kernel void trivial_p(__global Trivial *in) {}
#ifndef UNSAFEKERNELPARAMETER
//expected-error@-2{{'__global Trivial *__private' cannot be used as the type of a kernel parameter}}
#endif
kernel void trivial_p_p(__global Trivial *__global *in) {}
#ifndef UNSAFEKERNELPARAMETER
//expected-error@-2{{'__global Trivial *__global *__private' cannot be used as the type of a kernel parameter}}
#endif
kernel void trivial_r(__global Trivial &in) {}
#ifndef UNSAFEKERNELPARAMETER
//expected-error@-2{{'__global Trivial &__private' cannot be used as the type of a kernel parameter}}
#endif