[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaSYCL / address-space-conversions.cpp
blobd8758248499de542fc5510183438ee8bf3ad56d6
1 // RUN: %clang_cc1 -fsycl-is-device -verify -fsyntax-only %s
3 void bar(int &Data) {}
4 void bar2(int &Data) {}
5 void bar(__attribute__((opencl_private)) int &Data) {}
6 void foo(int *Data) {}
7 void foo2(int *Data) {}
8 void foo(__attribute__((opencl_private)) int *Data) {}
9 void baz(__attribute__((opencl_private)) int *Data) {} // expected-note {{candidate function not viable: cannot pass pointer to generic address space as a pointer to address space '__private' in 1st argument}}
11 template <typename T>
12 void tmpl(T *t) {}
14 void usages() {
15 __attribute__((opencl_global)) int *GLOB;
16 __attribute__((opencl_private)) int *PRIV;
17 __attribute__((opencl_local)) int *LOC;
18 int *NoAS;
20 GLOB = PRIV; // expected-error {{assigning '__private int *' to '__global int *' changes address space of pointer}}
21 GLOB = LOC; // expected-error {{assigning '__local int *' to '__global int *' changes address space of pointer}}
22 PRIV = static_cast<__attribute__((opencl_private)) int *>(GLOB); // expected-error {{static_cast from '__global int *' to '__private int *' is not allowed}}
23 PRIV = static_cast<__attribute__((opencl_private)) int *>(LOC); // expected-error {{static_cast from '__local int *' to '__private int *' is not allowed}}
24 NoAS = GLOB + PRIV; // expected-error {{invalid operands to binary expression ('__global int *' and '__private int *')}}
25 NoAS = GLOB + LOC; // expected-error {{invalid operands to binary expression ('__global int *' and '__local int *')}}
26 NoAS += GLOB; // expected-error {{invalid operands to binary expression ('int *' and '__global int *')}}
28 bar(*GLOB);
29 bar2(*GLOB);
31 bar(*PRIV);
32 bar2(*PRIV);
34 bar(*NoAS);
35 bar2(*NoAS);
37 bar(*LOC);
38 bar2(*LOC);
40 foo(GLOB);
41 foo2(GLOB);
42 foo(PRIV);
43 foo2(PRIV);
44 foo(NoAS);
45 foo2(NoAS);
46 foo(LOC);
47 foo2(LOC);
49 tmpl(GLOB);
50 tmpl(PRIV);
51 tmpl(NoAS);
52 tmpl(LOC);
54 // Implicit casts to named address space are disallowed
55 baz(NoAS); // expected-error {{no matching function for call to 'baz'}}
56 __attribute__((opencl_local)) int *l = NoAS; // expected-error {{cannot initialize a variable of type '__local int *' with an lvalue of type 'int *'}}
58 // Explicit casts between disjoint address spaces are disallowed
59 GLOB = (__attribute__((opencl_global)) int *)PRIV; // expected-error {{C-style cast from '__private int *' to '__global int *' converts between mismatching address spaces}}
61 (void)static_cast<int *>(GLOB);
62 (void)static_cast<void *>(GLOB);
63 int *i = GLOB;
64 void *v = GLOB;
65 (void)i;
66 (void)v;
68 __attribute__((opencl_global_host)) int *GLOB_HOST;
69 bar(*GLOB_HOST);
70 bar2(*GLOB_HOST);
71 GLOB = GLOB_HOST;
72 GLOB_HOST = GLOB; // expected-error {{assigning '__global int *' to '__global_host int *' changes address space of pointer}}
73 GLOB_HOST = static_cast<__attribute__((opencl_global_host)) int *>(GLOB); // expected-error {{static_cast from '__global int *' to '__global_host int *' is not allowed}}
74 __attribute__((opencl_global_device)) int *GLOB_DEVICE;
75 bar(*GLOB_DEVICE);
76 bar2(*GLOB_DEVICE);
77 GLOB = GLOB_DEVICE;
78 GLOB_DEVICE = GLOB; // expected-error {{assigning '__global int *' to '__global_device int *' changes address space of pointer}}
79 GLOB_DEVICE = static_cast<__attribute__((opencl_global_device)) int *>(GLOB); // expected-error {{static_cast from '__global int *' to '__global_device int *' is not allowed}}