[EXTINT][OMP] Fix _ExtInt type checking in device code
[lldb.git] / clang / test / OpenMP / nvptx_unsupported_type_messages.cpp
1 // Test target codegen - host bc file has to be created first.
2 // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-host.bc
3 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple x86_64-unknown-linux -fopenmp-targets=nvptx64-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -fsyntax-only
4 // RUN: %clang_cc1 -fopenmp -x c++ -triple powerpc64le-unknown-linux-gnu -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-host.bc
5 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-linux-gnu -fopenmp-targets=nvptx64-nvidia-cuda %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-host.bc -fsyntax-only
6
7 struct T {
8   char a;
9 #ifndef _ARCH_PPC
10   // expected-note@+1 {{'f' defined here}}
11   __float128 f;
12 #else
13   // expected-note@+1 {{'f' defined here}}
14   long double f;
15 #endif
16   char c;
17   T() : a(12), f(15) {}
18 #ifndef _ARCH_PPC
19 // expected-error@+5 {{'f' requires 128 bit size '__float128' type support, but device 'nvptx64-unknown-unknown' does not support it}}
20 #else
21 // expected-error@+3 {{'f' requires 128 bit size 'long double' type support, but device 'nvptx64-unknown-unknown' does not support it}}
22 #endif
23   T &operator+(T &b) {
24     f += b.a;
25     return *this;
26   }
27 };
28
29 struct T1 {
30   char a;
31   __int128 f;
32   __int128 f1;
33   char c;
34   T1() : a(12), f(15) {}
35   T1 &operator/(T1 &b) {
36     f /= b.a;
37     return *this;
38   }
39 };
40
41 #ifndef _ARCH_PPC
42 // expected-note@+1 {{'boo' defined here}}
43 void boo(__float128 A) { return; }
44 #else
45 // expected-note@+1 {{'boo' defined here}}
46 void boo(long double A) { return; }
47 #endif
48 #pragma omp declare target
49 T a = T();
50 T f = a;
51 void foo(T a = T()) {
52   a = a + f; // expected-note {{called by 'foo'}}
53 #ifndef _ARCH_PPC
54 // expected-error@+4 {{'boo' requires 128 bit size '__float128' type support, but device 'nvptx64-unknown-unknown' does not support it}}
55 #else
56 // expected-error@+2 {{'boo' requires 128 bit size 'long double' type support, but device 'nvptx64-unknown-unknown' does not support it}}
57 #endif
58   boo(0);
59   return;
60 }
61 T bar() {
62   return T();
63 }
64
65 void baz() {
66   T t = bar();
67 }
68 T1 a1 = T1();
69 T1 f1 = a1;
70 void foo1(T1 a = T1()) {
71   a = a / f1;
72   return;
73 }
74 T1 bar1() {
75   return T1();
76 }
77 void baz1() {
78   T1 t = bar1();
79 }
80 #pragma omp end declare target
81
82 #ifndef _ARCH_PPC
83 // expected-note@+1 3{{'f' defined here}}
84 __float128 foo1(__float128 f) {
85 #pragma omp target map(f)
86   // expected-error@+1 3{{'f' requires 128 bit size '__float128' type support, but device 'nvptx64-unknown-unknown' does not support it}}
87   f = 1;
88   return f;
89 }
90 #else
91 // expected-note@+1 3{{'f' defined here}}
92 long double foo1(long double f) {
93 #pragma omp target map(f)
94   // expected-error@+1 3{{'f' requires 128 bit size 'long double' type support, but device 'nvptx64-unknown-unknown' does not support it}}
95   f = 1;
96   return f;
97 }
98 #endif
99
100 T foo3() {
101   T S;
102 #pragma omp target map(S)
103   S.a = 1;
104   return S;
105 }
106
107 // Allow all sorts of stuff on host
108 #ifndef _ARCH_PPC
109 __float128 q, b;
110 __float128 c = q + b;
111 #else
112 long double q, b;
113 long double c = q + b;
114 #endif
115
116 void hostFoo() {
117   boo(c - b);
118 }
119
120 long double qa, qb;
121 decltype(qa + qb) qc;
122 double qd[sizeof(-(-(qc * 2)))];
123
124 struct A { };
125
126 template <bool>
127 struct A_type { typedef A type; };
128
129 template <class Sp, class Tp>
130 struct B {
131   enum { value = bool(Sp::value) || bool(Tp::value) };
132   typedef typename A_type<value>::type type;
133 };
134
135 void bar(_ExtInt(66) a) {
136   auto b = a;
137 }