1 // RUN: %clang_cc1 -verify -fopenmp -std=c++11 -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4 // expected-no-diagnostics 5 6 #ifndef HEADER 7 #define HEADER 8 9 struct ST { 10 int *a; 11 }; 12 typedef int arr[10]; 13 typedef ST STarr[10]; 14 struct SA { 15 const int da[5] = { 0 }; 16 ST g[10]; 17 STarr &rg = g; 18 int i; 19 int &j = i; 20 int *k = &j; 21 int *&z = k; 22 int aa[10]; 23 arr &raa = aa; funcSA24 void func(int arg) { 25 #pragma omp target is_device_ptr(k) 26 {} 27 #pragma omp target is_device_ptr(z) 28 {} 29 #pragma omp target is_device_ptr(aa) // OK 30 {} 31 #pragma omp target is_device_ptr(raa) // OK 32 {} 33 #pragma omp target is_device_ptr(g) // OK 34 {} 35 #pragma omp target is_device_ptr(rg) // OK 36 {} 37 #pragma omp target is_device_ptr(da) // OK 38 {} 39 return; 40 } 41 }; 42 // CHECK: struct SA 43 // CHECK-NEXT: const int da[5] = {0}; 44 // CHECK-NEXT: ST g[10]; 45 // CHECK-NEXT: STarr &rg = this->g; 46 // CHECK-NEXT: int i; 47 // CHECK-NEXT: int &j = this->i; 48 // CHECK-NEXT: int *k = &this->j; 49 // CHECK-NEXT: int *&z = this->k; 50 // CHECK-NEXT: int aa[10]; 51 // CHECK-NEXT: arr &raa = this->aa; 52 // CHECK-NEXT: func( 53 // CHECK-NEXT: #pragma omp target is_device_ptr(this->k) 54 // CHECK-NEXT: { 55 // CHECK-NEXT: } 56 // CHECK-NEXT: #pragma omp target is_device_ptr(this->z) 57 // CHECK-NEXT: { 58 // CHECK-NEXT: } 59 // CHECK-NEXT: #pragma omp target is_device_ptr(this->aa) 60 // CHECK-NEXT: { 61 // CHECK-NEXT: } 62 // CHECK-NEXT: #pragma omp target is_device_ptr(this->raa) 63 // CHECK-NEXT: { 64 // CHECK-NEXT: } 65 // CHECK-NEXT: #pragma omp target is_device_ptr(this->g) 66 // CHECK-NEXT: { 67 // CHECK-NEXT: } 68 // CHECK-NEXT: #pragma omp target is_device_ptr(this->rg) 69 // CHECK-NEXT: { 70 // CHECK-NEXT: } 71 // CHECK-NEXT: #pragma omp target is_device_ptr(this->da) 72 73 struct SB { 74 unsigned A; 75 unsigned B; 76 float Arr[100]; 77 float *Ptr; fooSB78 float *foo() { 79 return &Arr[0]; 80 } 81 }; 82 83 struct SC { 84 unsigned A : 2; 85 unsigned B : 3; 86 unsigned C; 87 unsigned D; 88 float Arr[100]; 89 SB S; 90 SB ArrS[100]; 91 SB *PtrS; 92 SB *&RPtrS; 93 float *Ptr; 94 SCSC95 SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} 96 }; 97 98 union SD { 99 unsigned A; 100 float B; 101 }; 102 103 struct S1; 104 extern S1 a; 105 class S2 { 106 mutable int a; 107 public: S2()108 S2():a(0) { } S2(S2 & s2)109 S2(S2 &s2):a(s2.a) { } 110 static float S2s; 111 static const float S2sc; 112 }; 113 const float S2::S2sc = 0; 114 const S2 b; 115 const S2 ba[5]; 116 class S3 { 117 int a; 118 public: S3()119 S3():a(0) { } S3(S3 & s3)120 S3(S3 &s3):a(s3.a) { } 121 }; 122 const S3 c; 123 const S3 ca[5]; 124 extern const int f; 125 class S4 { 126 int a; 127 S4(); 128 S4(const S4 &s4); 129 public: S4(int v)130 S4(int v):a(v) { } 131 }; 132 class S5 { 133 int a; S5()134 S5():a(0) {} S5(const S5 & s5)135 S5(const S5 &s5):a(s5.a) { } 136 public: S5(int v)137 S5(int v):a(v) { } 138 }; 139 140 S3 h; 141 #pragma omp threadprivate(h) 142 143 typedef struct { 144 int a; 145 } S6; 146 147 template <typename T> tmain(T argc)148T tmain(T argc) { 149 const T da[5] = { 0 }; 150 S6 h[10]; 151 auto &rh = h; 152 T i; 153 T &j = i; 154 T *k = &j; 155 T *&z = k; 156 T aa[10]; 157 auto &raa = aa; 158 #pragma omp target is_device_ptr(k) 159 {} 160 #pragma omp target is_device_ptr(z) 161 {} 162 #pragma omp target is_device_ptr(aa) 163 {} 164 #pragma omp target is_device_ptr(raa) 165 {} 166 #pragma omp target is_device_ptr(h) 167 {} 168 #pragma omp target is_device_ptr(rh) 169 {} 170 #pragma omp target is_device_ptr(da) 171 {} 172 return 0; 173 } 174 175 // CHECK: template <typename T = int> int tmain(int argc) { 176 // CHECK-NEXT: const int da[5] = {0}; 177 // CHECK-NEXT: S6 h[10]; 178 // CHECK-NEXT: auto &rh = h; 179 // CHECK-NEXT: int i; 180 // CHECK-NEXT: int &j = i; 181 // CHECK-NEXT: int *k = &j; 182 // CHECK-NEXT: int *&z = k; 183 // CHECK-NEXT: int aa[10]; 184 // CHECK-NEXT: auto &raa = aa; 185 // CHECK-NEXT: #pragma omp target is_device_ptr(k) 186 // CHECK-NEXT: { 187 // CHECK-NEXT: } 188 // CHECK-NEXT: #pragma omp target is_device_ptr(z) 189 // CHECK-NEXT: { 190 // CHECK-NEXT: } 191 // CHECK-NEXT: #pragma omp target is_device_ptr(aa) 192 // CHECK-NEXT: { 193 // CHECK-NEXT: } 194 // CHECK-NEXT: #pragma omp target is_device_ptr(raa) 195 // CHECK-NEXT: { 196 // CHECK-NEXT: } 197 // CHECK-NEXT: #pragma omp target is_device_ptr(h) 198 // CHECK-NEXT: { 199 // CHECK-NEXT: } 200 // CHECK-NEXT: #pragma omp target is_device_ptr(rh) 201 // CHECK-NEXT: { 202 // CHECK-NEXT: } 203 // CHECK-NEXT: #pragma omp target is_device_ptr(da) 204 205 // CHECK: template <typename T = int *> int *tmain(int *argc) { 206 // CHECK-NEXT: int *const da[5] = {0}; 207 // CHECK-NEXT: S6 h[10]; 208 // CHECK-NEXT: auto &rh = h; 209 // CHECK-NEXT: int *i; 210 // CHECK-NEXT: int *&j = i; 211 // CHECK-NEXT: int **k = &j; 212 // CHECK-NEXT: int **&z = k; 213 // CHECK-NEXT: int *aa[10]; 214 // CHECK-NEXT: auto &raa = aa; 215 // CHECK-NEXT: #pragma omp target is_device_ptr(k) 216 // CHECK-NEXT: { 217 // CHECK-NEXT: } 218 // CHECK-NEXT: #pragma omp target is_device_ptr(z) 219 // CHECK-NEXT: { 220 // CHECK-NEXT: } 221 // CHECK-NEXT: #pragma omp target is_device_ptr(aa) 222 // CHECK-NEXT: { 223 // CHECK-NEXT: } 224 // CHECK-NEXT: #pragma omp target is_device_ptr(raa) 225 // CHECK-NEXT: { 226 // CHECK-NEXT: } 227 // CHECK-NEXT: #pragma omp target is_device_ptr(h) 228 // CHECK-NEXT: { 229 // CHECK-NEXT: } 230 // CHECK-NEXT: #pragma omp target is_device_ptr(rh) 231 // CHECK-NEXT: { 232 // CHECK-NEXT: } 233 // CHECK-NEXT: #pragma omp target is_device_ptr(da) 234 235 // CHECK-LABEL: int main(int argc, char **argv) { main(int argc,char ** argv)236int main(int argc, char **argv) { 237 const int da[5] = { 0 }; 238 S6 h[10]; 239 auto &rh = h; 240 int i; 241 int &j = i; 242 int *k = &j; 243 int *&z = k; 244 int aa[10]; 245 auto &raa = aa; 246 // CHECK-NEXT: const int da[5] = {0}; 247 // CHECK-NEXT: S6 h[10]; 248 // CHECK-NEXT: auto &rh = h; 249 // CHECK-NEXT: int i; 250 // CHECK-NEXT: int &j = i; 251 // CHECK-NEXT: int *k = &j; 252 // CHECK-NEXT: int *&z = k; 253 // CHECK-NEXT: int aa[10]; 254 // CHECK-NEXT: auto &raa = aa; 255 #pragma omp target is_device_ptr(k) 256 // CHECK-NEXT: #pragma omp target is_device_ptr(k) 257 {} 258 // CHECK-NEXT: { 259 // CHECK-NEXT: } 260 #pragma omp target is_device_ptr(z) 261 // CHECK-NEXT: #pragma omp target is_device_ptr(z) 262 {} 263 // CHECK-NEXT: { 264 // CHECK-NEXT: } 265 #pragma omp target is_device_ptr(aa) 266 // CHECK-NEXT: #pragma omp target is_device_ptr(aa) 267 {} 268 // CHECK-NEXT: { 269 // CHECK-NEXT: } 270 #pragma omp target is_device_ptr(raa) 271 // CHECK-NEXT: #pragma omp target is_device_ptr(raa) 272 {} 273 // CHECK-NEXT: { 274 // CHECK-NEXT: } 275 #pragma omp target is_device_ptr(h) 276 // CHECK-NEXT: #pragma omp target is_device_ptr(h) 277 {} 278 // CHECK-NEXT: { 279 // CHECK-NEXT: } 280 #pragma omp target is_device_ptr(rh) 281 // CHECK-NEXT: #pragma omp target is_device_ptr(rh) 282 {} 283 // CHECK-NEXT: { 284 // CHECK-NEXT: } 285 #pragma omp target is_device_ptr(da) 286 // CHECK-NEXT: #pragma omp target is_device_ptr(da) 287 {} 288 // CHECK-NEXT: { 289 // CHECK-NEXT: } 290 return tmain<int>(argc) + *tmain<int *>(&argc); 291 } 292 293 294 #endif 295