xref: /llvm-project/clang/test/SemaOpenCL/usm-address-spaces-conversions.cl (revision 5674a3c88088e668b684326c2194a6282e8270ff)
1// RUN: %clang_cc1 %s -ffake-address-space-map -verify -pedantic -fsyntax-only -cl-std=CL2.0
2// RUN: %clang_cc1 %s -ffake-address-space-map -verify -pedantic -fsyntax-only -cl-std=CL2.0 -DGENERIC
3// RUN: %clang_cc1 %s -ffake-address-space-map -verify -pedantic -fsyntax-only -cl-std=CL2.0 -DCONSTANT
4// RUN: %clang_cc1 %s -ffake-address-space-map -verify -pedantic -fsyntax-only -cl-std=CL2.0 -DLOCAL
5
6/* USM (unified shared memory) extension for OpenCLC 2.0 adds two new address
7 * spaces: global_device and global_host that are a subset of __global address
8 * space. As ISO/IEC TR 18037 5.1.3 declares - it's possible to implicitly
9 * convert a subset address space to a superset address space, while conversion
10 * in a reversed direction could be achieved only with an explicit cast */
11
12#ifdef GENERIC
13#define AS_COMP __generic
14#else
15#define AS_COMP __global
16#endif // GENERIC
17
18#ifdef CONSTANT
19#define AS_INCOMP __constant
20#elif LOCAL
21#define AS_INCOMP __local
22#else // PRIVATE
23#define AS_INCOMP __private
24#endif // CONSTANT
25
26void test(AS_COMP int *arg_comp,
27          __attribute__((opencl_global_device)) int *arg_device,
28          __attribute__((opencl_global_host)) int *arg_host) {
29  AS_COMP int *var_glob1 = arg_device;
30  AS_COMP int *var_glob2 = arg_host;
31  AS_COMP int *var_glob3 = (AS_COMP int *)arg_device;
32  AS_COMP int *var_glob4 = (AS_COMP int *)arg_host;
33  arg_device = (__attribute__((opencl_global_device)) int *)arg_comp;
34  arg_host = (__attribute__((opencl_global_host)) int *)arg_comp;
35#ifdef GENERIC
36  // expected-error@+6{{assigning '__generic int *__private' to '__global_device int *__private' changes address space of pointer}}
37  // expected-error@+6{{assigning '__generic int *__private' to '__global_host int *__private' changes address space of pointer}}
38#else
39  // expected-error@+3{{assigning '__global int *__private' to '__global_device int *__private' changes address space of pointer}}
40  // expected-error@+3{{assigning '__global int *__private' to '__global_host int *__private' changes address space of pointer}}
41#endif // GENERIC
42  arg_device = arg_comp;
43  arg_host = arg_comp;
44
45#ifdef CONSTANT
46  // expected-error@+15{{initializing '__constant int *__private' with an expression of type '__global_device int *__private' changes address space of pointer}}
47  // expected-error@+15{{initializing '__constant int *__private' with an expression of type '__global_host int *__private' changes address space of pointer}}
48  // expected-error@+15{{initializing '__constant int *__private' with an expression of type '__global_device int *' changes address space of pointer}}
49  // expected-error@+16{{initializing '__constant int *__private' with an expression of type '__global_host int *' changes address space of pointer}}
50#elif LOCAL
51  // expected-error@+10{{initializing '__local int *__private' with an expression of type '__global_device int *__private' changes address space of pointer}}
52  // expected-error@+10{{initializing '__local int *__private' with an expression of type '__global_host int *__private' changes address space of pointer}}
53  // expected-error@+10{{initializing '__local int *__private' with an expression of type '__global_device int *' changes address space of pointer}}
54  // expected-error@+11{{initializing '__local int *__private' with an expression of type '__global_host int *' changes address space of pointer}}
55#else // PRIVATE
56  // expected-error@+5{{initializing '__private int *__private' with an expression of type '__global_device int *__private' changes address space of pointer}}
57  // expected-error@+5{{initializing '__private int *__private' with an expression of type '__global_host int *__private' changes address space of pointer}}
58  // expected-error@+5{{initializing '__private int *__private' with an expression of type '__global_device int *' changes address space of pointer}}
59  // expected-error@+6{{initializing '__private int *__private' with an expression of type '__global_host int *' changes address space of pointer}}
60#endif // CONSTANT
61  AS_INCOMP int *var_incomp1 = arg_device;
62  AS_INCOMP int *var_incomp2 = arg_host;
63  AS_INCOMP int *var_incomp3 =
64      (__attribute__((opencl_global_device)) int *)arg_device;
65  AS_INCOMP int *var_incomp4 =
66      (__attribute__((opencl_global_host)) int *)arg_host;
67}
68