| 1 | // RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -Wno-unused-value -triple spir-unknown-unknown |
| 2 | |
| 3 | #pragma OPENCL EXTENSION cl_khr_fp16 : disable |
| 4 | constant float f = 1.0h; // expected-error{{half precision constant requires cl_khr_fp16}} |
| 5 | |
| 6 | half half_disabled(half *p, // expected-error{{declaring function return value of type 'half' is not allowed}} |
| 7 | half h) // expected-error{{declaring function parameter of type 'half' is not allowed}} |
| 8 | { |
| 9 | half a[2]; // expected-error{{declaring variable of type 'half [2]' is not allowed}} |
| 10 | half b; // expected-error{{declaring variable of type 'half' is not allowed}} |
| 11 | *p; // expected-error{{loading directly from pointer to type 'half' requires cl_khr_fp16. Use vector data load builtin functions instead}} |
| 12 | *p = 0; // expected-error{{assigning directly to pointer to type 'half' requires cl_khr_fp16. Use vector data store builtin functions instead}} |
| 13 | p[1]; // expected-error{{loading directly from pointer to type 'half' requires cl_khr_fp16. Use vector data load builtin functions instead}} |
| 14 | p[1] = 0; // expected-error{{assigning directly to pointer to type 'half' requires cl_khr_fp16. Use vector data store builtin functions instead}} |
| 15 | |
| 16 | float c = 1.0f; |
| 17 | b = (half) c; // expected-error{{casting to type 'half' is not allowed}} |
| 18 | c = (float) 1.0h; // expected-error{{half precision constant requires cl_khr_fp16}} |
| 19 | b = 1.0h; // expected-error{{half precision constant requires cl_khr_fp16}} |
| 20 | |
| 21 | half *allowed = &p[1]; |
| 22 | half *allowed2 = &*p; |
| 23 | half *allowed3 = p + 1; |
| 24 | |
| 25 | return h; |
| 26 | } |
| 27 | |
| 28 | kernel void half_disabled_kernel(global half *p, |
| 29 | half h); // expected-error{{declaring function parameter of type 'half' is not allowed; did you forget * ?}} |
| 30 | |
| 31 | // Exactly the same as above but with the cl_khr_fp16 extension enabled. |
| 32 | #pragma OPENCL EXTENSION cl_khr_fp16 : enable |
| 33 | constant half a = 1.0h; |
| 34 | half half_enabled(half *p, half h) |
| 35 | { |
| 36 | half a[2]; |
| 37 | half b; |
| 38 | *p; |
| 39 | *p = 0; |
| 40 | p[1]; |
| 41 | p[1] = 0; |
| 42 | |
| 43 | float c = 1.0f; |
| 44 | b = (half) c; |
| 45 | c = (float) 1.0h; |
| 46 | b = 1.0h; |
| 47 | |
| 48 | half *allowed = &p[1]; |
| 49 | half *allowed2 = &*p; |
| 50 | half *allowed3 = p + 1; |
| 51 | |
| 52 | return h; |
| 53 | } |
| 54 | |
| 55 | kernel void half_enabled_kernel(global half *p, |
| 56 | half h); |
| 57 | |
| 58 | |