1 // RUN: %clang_cc1 -triple spir64 -fsycl-is-device -verify -fsyntax-only %s
2 // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsycl-is-device -fsyntax-only %s
3 
4 typedef __float128 BIGTY;
5 
6 template <class T>
7 class Z {
8 public:
9   // expected-note@+1 {{'field' defined here}}
10   T field;
11   // expected-note@+1 2{{'field1' defined here}}
12   __float128 field1;
13   using BIGTYPE = __float128;
14   // expected-note@+1 {{'bigfield' defined here}}
15   BIGTYPE bigfield;
16 };
17 
18 void host_ok(void) {
19   __float128 A;
20   int B = sizeof(__float128);
21   Z<__float128> C;
22   C.field1 = A;
23 }
24 
25 void usage() {
26   // expected-note@+1 3{{'A' defined here}}
27   __float128 A;
28   Z<__float128> C;
29   // expected-error@+3 2{{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
30   // expected-error@+2 {{'A' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
31   // expected-error@+1 {{'field1' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
32   C.field1 = A;
33   // expected-error@+2 {{expression requires 128 bit size 'Z::BIGTYPE' (aka '__float128') type support, but target 'spir64' does not support it}}
34   // expected-error@+1 {{'bigfield' requires 128 bit size 'Z::BIGTYPE' (aka '__float128') type support, but target 'spir64' does not support it}}
35   C.bigfield += 1.0;
36 
37   // expected-error@+1 {{'A' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
38   auto foo1 = [=]() {
39     __float128 AA;
40     // expected-note@+2 {{'BB' defined here}}
41     // expected-error@+1 {{'A' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
42     auto BB = A;
43     // expected-error@+2 {{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
44     // expected-error@+1 {{'BB' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
45     BB += 1;
46 
47     float F1 = 0.1f;
48     float F2 = 0.1f;
49     // expected-error@+1 3{{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
50     float F3 = ((__float128)F1 * (__float128)F2) / 2.0f;
51   };
52 
53   // expected-note@+1 {{called by 'usage'}}
54   foo1();
55 }
56 
57 template <typename t>
58 void foo2(){};
59 
60 // expected-note@+3 {{'P' defined here}}
61 // expected-error@+2 {{'P' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
62 // expected-note@+1 2{{'foo' defined here}}
63 __float128 foo(__float128 P) { return P; }
64 
65 template <typename Name, typename Func>
66 __attribute__((sycl_kernel)) void kernel(Func kernelFunc) {
67   // expected-note@+1 5{{called by 'kernel}}
68   kernelFunc();
69 }
70 
71 int main() {
72   // expected-note@+1 {{'CapturedToDevice' defined here}}
73   __float128 CapturedToDevice = 1;
74   host_ok();
75   kernel<class variables>([=]() {
76     decltype(CapturedToDevice) D;
77     // expected-error@+1 {{'CapturedToDevice' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
78     auto C = CapturedToDevice;
79     Z<__float128> S;
80     // expected-error@+2 {{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
81     // expected-error@+1 {{'field1' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
82     S.field1 += 1;
83     // expected-error@+2 {{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
84     // expected-error@+1 {{'field' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
85     S.field = 1;
86   });
87 
88   kernel<class functions>([=]() {
89     // expected-note@+1 2{{called by 'operator()'}}
90     usage();
91     // expected-note@+1 {{'BBBB' defined here}}
92     BIGTY BBBB;
93     // expected-note@+3 {{called by 'operator()'}}
94     // expected-error@+2 {{'BBBB' requires 128 bit size 'BIGTY' (aka '__float128') type support, but target 'spir64' does not support it}}
95     // expected-error@+1 2{{'foo' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}}
96     auto A = foo(BBBB);
97   });
98 
99   kernel<class ok>([=]() {
100     Z<__float128> S;
101     foo2<__float128>();
102     auto A = sizeof(CapturedToDevice);
103   });
104 
105   return 0;
106 }
107