xref: /llvm-project/clang/test/SemaSYCL/address-space-conversions.cpp (revision 1cee9608982a866688434223bee44c878ea489b1)
1 // RUN: %clang_cc1 -fsycl-is-device -verify -fsyntax-only %s
2 
bar(int & Data)3 void bar(int &Data) {}
bar2(int & Data)4 void bar2(int &Data) {}
bar(int & Data)5 void bar(__attribute__((opencl_private)) int &Data) {}
foo(int * Data)6 void foo(int *Data) {}
foo2(int * Data)7 void foo2(int *Data) {}
foo(int * Data)8 void foo(__attribute__((opencl_private)) int *Data) {}
baz(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}}
10 
11 template <typename T>
tmpl(T * t)12 void tmpl(T *t) {}
13 
usages()14 void usages() {
15   __attribute__((opencl_global)) int *GLOB;
16   __attribute__((opencl_private)) int *PRIV;
17   __attribute__((opencl_local)) int *LOC;
18   int *NoAS;
19 
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 *')}}
27 
28   bar(*GLOB);
29   bar2(*GLOB);
30 
31   bar(*PRIV);
32   bar2(*PRIV);
33 
34   bar(*NoAS);
35   bar2(*NoAS);
36 
37   bar(*LOC);
38   bar2(*LOC);
39 
40   foo(GLOB);
41   foo2(GLOB);
42   foo(PRIV);
43   foo2(PRIV);
44   foo(NoAS);
45   foo2(NoAS);
46   foo(LOC);
47   foo2(LOC);
48 
49   tmpl(GLOB);
50   tmpl(PRIV);
51   tmpl(NoAS);
52   tmpl(LOC);
53 
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 *'}}
57 
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}}
60 
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;
67 
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}}
80 }
81