|  | // RUN: %clang_cc1 "-triple" "nvptx-nvidia-cuda" -fcuda-is-device -fsyntax-only -verify %s | 
|  |  | 
|  | #include "__clang_cuda_builtin_vars.h" | 
|  | __attribute__((global)) | 
|  | void kernel(int *out) { | 
|  | int i = 0; | 
|  | out[i++] = threadIdx.x; | 
|  | threadIdx.x = 0; // expected-error {{no setter defined for property 'x'}} | 
|  | out[i++] = threadIdx.y; | 
|  | threadIdx.y = 0; // expected-error {{no setter defined for property 'y'}} | 
|  | out[i++] = threadIdx.z; | 
|  | threadIdx.z = 0; // expected-error {{no setter defined for property 'z'}} | 
|  |  | 
|  | out[i++] = blockIdx.x; | 
|  | blockIdx.x = 0; // expected-error {{no setter defined for property 'x'}} | 
|  | out[i++] = blockIdx.y; | 
|  | blockIdx.y = 0; // expected-error {{no setter defined for property 'y'}} | 
|  | out[i++] = blockIdx.z; | 
|  | blockIdx.z = 0; // expected-error {{no setter defined for property 'z'}} | 
|  |  | 
|  | out[i++] = blockDim.x; | 
|  | blockDim.x = 0; // expected-error {{no setter defined for property 'x'}} | 
|  | out[i++] = blockDim.y; | 
|  | blockDim.y = 0; // expected-error {{no setter defined for property 'y'}} | 
|  | out[i++] = blockDim.z; | 
|  | blockDim.z = 0; // expected-error {{no setter defined for property 'z'}} | 
|  |  | 
|  | out[i++] = gridDim.x; | 
|  | gridDim.x = 0; // expected-error {{no setter defined for property 'x'}} | 
|  | out[i++] = gridDim.y; | 
|  | gridDim.y = 0; // expected-error {{no setter defined for property 'y'}} | 
|  | out[i++] = gridDim.z; | 
|  | gridDim.z = 0; // expected-error {{no setter defined for property 'z'}} | 
|  |  | 
|  | out[i++] = warpSize; | 
|  | warpSize = 0; // expected-error {{cannot assign to variable 'warpSize' with const-qualified type 'const int'}} | 
|  | // expected-note@__clang_cuda_builtin_vars.h:* {{variable 'warpSize' declared const here}} | 
|  |  | 
|  | // Make sure we can't construct or assign to the special variables. | 
|  | __cuda_builtin_threadIdx_t x; // expected-error {{calling a private constructor of class '__cuda_builtin_threadIdx_t'}} | 
|  | // expected-note@__clang_cuda_builtin_vars.h:* {{declared private here}} | 
|  |  | 
|  | __cuda_builtin_threadIdx_t y = threadIdx; // expected-error {{calling a private constructor of class '__cuda_builtin_threadIdx_t'}} | 
|  | // expected-note@__clang_cuda_builtin_vars.h:* {{declared private here}} | 
|  |  | 
|  | threadIdx = threadIdx; // expected-error {{'operator=' is a private member of '__cuda_builtin_threadIdx_t'}} | 
|  | // expected-note@__clang_cuda_builtin_vars.h:* {{declared private here}} | 
|  |  | 
|  | void *ptr = &threadIdx; // expected-error {{'operator&' is a private member of '__cuda_builtin_threadIdx_t'}} | 
|  | // expected-note@__clang_cuda_builtin_vars.h:* {{declared private here}} | 
|  |  | 
|  | // Following line should've caused an error as one is not allowed to | 
|  | // take address of a built-in variable in CUDA. Alas there's no way | 
|  | // to prevent getting address of a 'const int', so the line | 
|  | // currently compiles without errors or warnings. | 
|  | const void *wsptr = &warpSize; | 
|  | } |