1 // RUN: %clang_cc1 -fsycl-is-device -verify -fsyntax-only %s 2 bar(int & Data)3void bar(int &Data) {} bar2(int & Data)4void bar2(int &Data) {} bar(int & Data)5void bar(__attribute__((opencl_private)) int &Data) {} foo(int * Data)6void foo(int *Data) {} foo2(int * Data)7void foo2(int *Data) {} foo(int * Data)8void foo(__attribute__((opencl_private)) int *Data) {} baz(int * Data)9void 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)12void tmpl(T *t) {} 13 usages()14void 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