| 1 | // RUN: %clang_cc1 "-triple" "nvptx-nvidia-cuda" -fcuda-is-device -fsyntax-only -verify %s |
| 2 | |
| 3 | #include "__clang_cuda_builtin_vars.h" |
| 4 | __attribute__((global)) |
| 5 | void kernel(int *out) { |
| 6 | int i = 0; |
| 7 | out[i++] = threadIdx.x; |
| 8 | threadIdx.x = 0; // expected-error {{no setter defined for property 'x'}} |
| 9 | out[i++] = threadIdx.y; |
| 10 | threadIdx.y = 0; // expected-error {{no setter defined for property 'y'}} |
| 11 | out[i++] = threadIdx.z; |
| 12 | threadIdx.z = 0; // expected-error {{no setter defined for property 'z'}} |
| 13 | |
| 14 | out[i++] = blockIdx.x; |
| 15 | blockIdx.x = 0; // expected-error {{no setter defined for property 'x'}} |
| 16 | out[i++] = blockIdx.y; |
| 17 | blockIdx.y = 0; // expected-error {{no setter defined for property 'y'}} |
| 18 | out[i++] = blockIdx.z; |
| 19 | blockIdx.z = 0; // expected-error {{no setter defined for property 'z'}} |
| 20 | |
| 21 | out[i++] = blockDim.x; |
| 22 | blockDim.x = 0; // expected-error {{no setter defined for property 'x'}} |
| 23 | out[i++] = blockDim.y; |
| 24 | blockDim.y = 0; // expected-error {{no setter defined for property 'y'}} |
| 25 | out[i++] = blockDim.z; |
| 26 | blockDim.z = 0; // expected-error {{no setter defined for property 'z'}} |
| 27 | |
| 28 | out[i++] = gridDim.x; |
| 29 | gridDim.x = 0; // expected-error {{no setter defined for property 'x'}} |
| 30 | out[i++] = gridDim.y; |
| 31 | gridDim.y = 0; // expected-error {{no setter defined for property 'y'}} |
| 32 | out[i++] = gridDim.z; |
| 33 | gridDim.z = 0; // expected-error {{no setter defined for property 'z'}} |
| 34 | |
| 35 | out[i++] = warpSize; |
| 36 | warpSize = 0; // expected-error {{cannot assign to variable 'warpSize' with const-qualified type 'const int'}} |
| 37 | // expected-note@__clang_cuda_builtin_vars.h:* {{variable 'warpSize' declared const here}} |
| 38 | |
| 39 | // Make sure we can't construct or assign to the special variables. |
| 40 | __cuda_builtin_threadIdx_t x; // expected-error {{calling a private constructor of class '__cuda_builtin_threadIdx_t'}} |
| 41 | // expected-note@__clang_cuda_builtin_vars.h:* {{declared private here}} |
| 42 | |
| 43 | __cuda_builtin_threadIdx_t y = threadIdx; // expected-error {{calling a private constructor of class '__cuda_builtin_threadIdx_t'}} |
| 44 | // expected-note@__clang_cuda_builtin_vars.h:* {{declared private here}} |
| 45 | |
| 46 | threadIdx = threadIdx; // expected-error {{'operator=' is a private member of '__cuda_builtin_threadIdx_t'}} |
| 47 | // expected-note@__clang_cuda_builtin_vars.h:* {{declared private here}} |
| 48 | |
| 49 | void *ptr = &threadIdx; // expected-error {{'operator&' is a private member of '__cuda_builtin_threadIdx_t'}} |
| 50 | // expected-note@__clang_cuda_builtin_vars.h:* {{declared private here}} |
| 51 | |
| 52 | // Following line should've caused an error as one is not allowed to |
| 53 | // take address of a built-in variable in CUDA. Alas there's no way |
| 54 | // to prevent getting address of a 'const int', so the line |
| 55 | // currently compiles without errors or warnings. |
| 56 | const void *wsptr = &warpSize; |
| 57 | } |
| 58 | |