81 lines · cpp
1// RUN: %clang_cc1 -fsycl-is-device -verify -fsyntax-only %s2 3void bar(int &Data) {}4void bar2(int &Data) {}5void bar(__attribute__((opencl_private)) int &Data) {}6void foo(int *Data) {}7void foo2(int *Data) {}8void foo(__attribute__((opencl_private)) 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 11template <typename T>12void tmpl(T *t) {}13 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 disallowed55 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 disallowed59 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