| // RUN: %clang_cc1 -triple spir64 -fsycl-is-device -verify -fsyntax-only %s | 
 | // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsycl-is-device -fsyntax-only %s | 
 |  | 
 | typedef _Complex float __cfloat128 __attribute__ ((__mode__ (__TC__))); | 
 | typedef __float128 BIGTY; | 
 |  | 
 | template <class T> | 
 | class Z { | 
 | public: | 
 |   // expected-note@+1 {{'field' defined here}} | 
 |   T field; | 
 |   // expected-note@+1 2{{'field1' defined here}} | 
 |   __float128 field1; | 
 |   using BIGTYPE = __float128; | 
 |   // expected-note@+1 {{'bigfield' defined here}} | 
 |   BIGTYPE bigfield; | 
 | }; | 
 |  | 
 | void host_ok(void) { | 
 |   __float128 A; | 
 |   int B = sizeof(__float128); | 
 |   Z<__float128> C; | 
 |   C.field1 = A; | 
 | } | 
 |  | 
 | long double ld_func(long double arg); | 
 |  | 
 | void usage() { | 
 |   // expected-note@+1 3{{'A' defined here}} | 
 |   __float128 A; | 
 |   Z<__float128> C; | 
 |   // expected-error@+3 2{{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |   // expected-error@+2 {{'A' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |   // expected-error@+1 {{'field1' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |   C.field1 = A; | 
 |   // expected-error@+2 {{expression requires 128 bit size 'BIGTYPE' (aka '__float128') type support, but target 'spir64' does not support it}} | 
 |   // expected-error@+1 {{'bigfield' requires 128 bit size 'BIGTYPE' (aka '__float128') type support, but target 'spir64' does not support it}} | 
 |   C.bigfield += 1.0; | 
 |  | 
 |   // expected-error@+1 {{'A' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |   auto foo1 = [=]() { | 
 |     __float128 AA; | 
 |     // expected-note@+2 {{'BB' defined here}} | 
 |     // expected-error@+1 {{'A' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     auto BB = A; | 
 |     // expected-error@+2 {{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     // expected-error@+1 {{'BB' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     BB += 1; | 
 |  | 
 |     float F1 = 0.1f; | 
 |     float F2 = 0.1f; | 
 |     // expected-error@+1 3{{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     float F3 = ((__float128)F1 * (__float128)F2) / 2.0f; | 
 |  | 
 |     // assume that long double is supported | 
 |     float F4 = ld_func(F3); | 
 |   }; | 
 |  | 
 |   // expected-note@+1 {{called by 'usage'}} | 
 |   foo1(); | 
 | } | 
 |  | 
 | template <typename t> | 
 | void foo2(){}; | 
 |  | 
 | // expected-note@+3 {{'P' defined here}} | 
 | // expected-error@+2 {{'P' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 | // expected-note@+1 2{{'foo' defined here}} | 
 | __float128 foo(__float128 P) { return P; } | 
 |  | 
 | template <typename Name, typename Func> | 
 | __attribute__((sycl_kernel)) void kernel(Func kernelFunc) { | 
 |   // expected-note@+1 5{{called by 'kernel}} | 
 |   kernelFunc(); | 
 | } | 
 |  | 
 | int main() { | 
 |   // expected-note@+1 {{'CapturedToDevice' defined here}} | 
 |   __float128 CapturedToDevice = 1; | 
 |   host_ok(); | 
 |   kernel<class variables>([=]() { | 
 |     decltype(CapturedToDevice) D; | 
 |     // expected-error@+1 {{'CapturedToDevice' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     auto C = CapturedToDevice; | 
 |     Z<__float128> S; | 
 |     // expected-error@+2 {{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     // expected-error@+1 {{'field1' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     S.field1 += 1; | 
 |     // expected-error@+2 {{expression requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     // expected-error@+1 {{'field' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     S.field = 1; | 
 |   }); | 
 |  | 
 |   kernel<class functions>([=]() { | 
 |     // expected-note@+1 2{{called by 'operator()'}} | 
 |     usage(); | 
 |     // expected-note@+1 {{'BBBB' defined here}} | 
 |     BIGTY BBBB; | 
 |     // expected-note@+3 {{called by 'operator()'}} | 
 |     // expected-error@+2 {{'BBBB' requires 128 bit size 'BIGTY' (aka '__float128') type support, but target 'spir64' does not support it}} | 
 |     // expected-error@+1 2{{'foo' requires 128 bit size '__float128' type support, but target 'spir64' does not support it}} | 
 |     auto A = foo(BBBB); | 
 |   }); | 
 |  | 
 |   kernel<class ok>([=]() { | 
 |     Z<__float128> S; | 
 |     foo2<__float128>(); | 
 |     auto A = sizeof(CapturedToDevice); | 
 |   }); | 
 |  | 
 |   return 0; | 
 | } |