1 // RUN: %clang_cc1 -verify=expected,ge50,lt51 -fopenmp -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 2 // RUN: %clang_cc1 -verify=expected,lt50,lt51 -fopenmp -fopenmp-version=40 -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 3 // RUN: %clang_cc1 -verify=expected,lt50,lt51 -fopenmp -fopenmp-version=45 -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 4 // RUN: %clang_cc1 -verify=expected,ge50,lt51 -fopenmp -fopenmp-version=50 -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 5 // RUN: %clang_cc1 -verify=expected,ge50,ge51 -fopenmp -fopenmp-version=51 -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 6 // RUN: %clang_cc1 -DCCODE -verify -fopenmp -ferror-limit 200 -x c %s -Wno-openmp -Wuninitialized 7 8 // RUN: %clang_cc1 -verify=expected,ge50,lt51 -fopenmp-simd -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 9 // RUN: %clang_cc1 -verify=expected,lt50,lt51 -fopenmp-simd -fopenmp-version=40 -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 10 // RUN: %clang_cc1 -verify=expected,lt50,lt51 -fopenmp-simd -fopenmp-version=45 -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 11 // RUN: %clang_cc1 -verify=expected,ge50,lt51 -fopenmp-simd -fopenmp-version=50 -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 12 // RUN: %clang_cc1 -verify=expected,ge50,ge51 -fopenmp-simd -fopenmp-version=51 -ferror-limit 200 %s -Wno-openmp-target -Wuninitialized 13 // RUN: %clang_cc1 -DCCODE -verify -fopenmp-simd -ferror-limit 200 -x c %s -Wno-openmp-mapping -Wuninitialized 14 #ifdef CCODE 15 void foo(int arg) { 16 const int n = 0; 17 18 double marr[10][10][10]; 19 20 #pragma omp target map(marr[2][0:2][0:2]) // expected-error {{array section does not specify contiguous storage}} 21 {} 22 #pragma omp target map(marr[:][0:][:]) 23 {} 24 #pragma omp target map(marr[:][1:][:]) // expected-error {{array section does not specify contiguous storage}} 25 {} 26 #pragma omp target map(marr[:][n:][:]) 27 {} 28 } 29 #else 30 31 void xxx(int argc) { 32 int map; // expected-note {{initialize the variable 'map' to silence this warning}} 33 #pragma omp target map(tofrom: map) // expected-warning {{variable 'map' is uninitialized when used here}} 34 for (int i = 0; i < 10; ++i) 35 ; 36 } 37 38 39 struct SREF { 40 int &a; 41 int b; 42 SREF(int &a) : a(a) {} 43 }; 44 45 template <typename T, int I> 46 struct SA { 47 static int ss; 48 #pragma omp threadprivate(ss) // expected-note {{defined as threadprivate or thread local}} 49 float a; 50 int b[12]; 51 float *c; 52 T d; 53 float e[I]; 54 T *f; 55 int bf : 20; 56 void func(int arg) { 57 SREF sref(arg); 58 #pragma omp target 59 { 60 a = 0.0; 61 func(arg); 62 bf = 20; 63 } 64 #pragma omp target map(arg,a,d,sref.b) 65 {} 66 #pragma omp target map(arg[2:2],a,d) // expected-error {{subscripted value is not an array or pointer}} 67 {} 68 #pragma omp target map(arg,a*2) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}} 69 {} 70 #pragma omp target map(arg,(c+1)[2]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 71 {} 72 #pragma omp target map(arg,a[:2],d) // expected-error {{subscripted value is not an array or pointer}} 73 {} 74 #pragma omp target map(arg,a,d[:2]) // expected-error {{subscripted value is not an array or pointer}} 75 {} 76 77 #pragma omp target map(to:ss) // expected-error {{threadprivate variables are not allowed in 'map' clause}} 78 {} 79 80 #pragma omp target map(to:b,e) 81 {} 82 #pragma omp target map(to:b,e) map(to:b) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} 83 {} 84 #pragma omp target map(to:b[:2],e) 85 {} 86 #pragma omp target map(to:b,e[:]) 87 {} 88 #pragma omp target map(b[-1:]) // expected-error {{array section must be a subset of the original array}} 89 {} 90 #pragma omp target map(b[:-1]) // expected-error {{section length is evaluated to a negative value -1}} 91 {} 92 #pragma omp target map(b[true:true]) 93 {} 94 95 #pragma omp target map(: c,f) // expected-error {{missing map type}} 96 {} 97 #pragma omp target map(always, tofrom: c,f) 98 {} 99 #pragma omp target map(always, tofrom: c[1:2],f) 100 {} 101 #pragma omp target map(always, tofrom: c,f[1:2]) 102 {} 103 #pragma omp target map(always, tofrom: c[:],f) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 104 {} 105 #pragma omp target map(always, tofrom: c,f[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 106 {} 107 #pragma omp target map(always) // expected-error {{use of undeclared identifier 'always'}} 108 {} 109 #pragma omp target map(close, tofrom: c,f) 110 {} 111 #pragma omp target map(close, tofrom: c[1:2],f) 112 {} 113 #pragma omp target map(close, tofrom: c,f[1:2]) 114 {} 115 #pragma omp target map(close, tofrom: c[:],f) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 116 {} 117 #pragma omp target map(close, tofrom: c,f[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 118 {} 119 #pragma omp target map(close) // expected-error {{use of undeclared identifier 'close'}} 120 {} 121 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 122 #pragma omp target map(present, tofrom: c,f) 123 {} 124 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 125 #pragma omp target map(present, tofrom: c[1:2],f) 126 {} 127 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 128 #pragma omp target map(present, tofrom: c,f[1:2]) 129 {} 130 // expected-error@+2 {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 131 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 132 #pragma omp target map(present, tofrom: c[:],f) 133 {} 134 // expected-error@+2 {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 135 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 136 #pragma omp target map(present, tofrom: c,f[:]) 137 {} 138 // expected-error@+1 {{use of undeclared identifier 'present'}} 139 #pragma omp target map(present) 140 {} 141 #pragma omp target map(close, close, tofrom: a) // expected-error {{same map type modifier has been specified more than once}} 142 {} 143 #pragma omp target map(always, close, always, close, tofrom: a) // expected-error 2 {{same map type modifier has been specified more than once}} 144 {} 145 // ge51-error@+2 {{same map type modifier has been specified more than once}} 146 // lt51-error@+1 2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 147 #pragma omp target map(present, present, tofrom: a) 148 {} 149 // expected-error@+3 2 {{same map type modifier has been specified more than once}} 150 // ge51-error@+2 1 {{same map type modifier has been specified more than once}} 151 // lt51-error@+1 2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 152 #pragma omp target map(always, close, present, always, close, present, tofrom: a) 153 {} 154 #pragma omp target map( , tofrom: a) // expected-error {{missing map type modifier}} 155 {} 156 #pragma omp target map( , , tofrom: a) // expected-error {{missing map type modifier}} expected-error {{missing map type modifier}} 157 {} 158 #pragma omp target map( , , : a) // expected-error {{missing map type modifier}} expected-error {{missing map type modifier}} expected-error {{missing map type}} 159 {} 160 // ge51-error@+3 2 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 161 // lt51-error@+2 2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 162 // expected-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 163 #pragma omp target map( d, f, bf: a) 164 {} 165 // expected-error@+4 {{missing map type modifier}} 166 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 167 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 168 // expected-error@+1 {{missing map type}} 169 #pragma omp target map( , f, : a) 170 {} 171 #pragma omp target map(always close: a) // expected-error {{missing map type}} 172 {} 173 #pragma omp target map(always close bf: a) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 174 {} 175 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 176 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 177 // expected-error@+1 {{missing map type}} 178 #pragma omp target map(always tofrom close: a) 179 {} 180 // ge51-error@+2 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 181 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 182 #pragma omp target map(tofrom from: a) 183 {} 184 #pragma omp target map(close bf: a) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 185 {} 186 #pragma omp target map(([b[I]][bf])f) // lt50-error {{expected ',' or ']' in lambda capture list}} lt50-error {{expected ')'}} lt50-note {{to match this '('}} 187 {} 188 return; 189 } 190 }; 191 192 struct SB { 193 unsigned A; 194 unsigned B; 195 float Arr[100]; 196 float *Ptr; 197 float *foo() { 198 return &Arr[0]; 199 } 200 }; 201 202 struct SC { 203 unsigned A : 2; 204 unsigned B : 3; 205 unsigned C; 206 unsigned D; 207 float Arr[100]; 208 SB S; 209 SB ArrS[100]; 210 SB *PtrS; 211 SB *&RPtrS; 212 float *Ptr; 213 214 SC(SB *&_RPtrS) : RPtrS(_RPtrS) {} 215 }; 216 217 union SD { 218 unsigned A; 219 float B; 220 }; 221 222 void SAclient(int arg) { 223 SA<int,123> s; 224 s.func(arg); // expected-note {{in instantiation of member function}} 225 double marr[10][10][10]; 226 double marr2[5][10][1]; 227 double mvla[5][arg][10]; 228 double ***mptr; 229 const int n = 0; 230 const int m = 1; 231 double mvla2[5][arg][m+n+10]; 232 233 SB *p; 234 235 SD u; 236 SC r(p),t(p); 237 #pragma omp target map(r) 238 {} 239 #pragma omp target map(marr[2] [0:2] [0:2]) // expected-error {{array section does not specify contiguous storage}} 240 {} 241 #pragma omp target map(marr[:] [0:2] [0:2]) // expected-error {{array section does not specify contiguous storage}} 242 {} 243 #pragma omp target map(marr[2][3] [0:2]) 244 {} 245 #pragma omp target map(marr[:][:][:]) 246 {} 247 #pragma omp target map(marr[:2][:][:]) 248 {} 249 #pragma omp target map(marr [arg:][:][:]) 250 {} 251 #pragma omp target map(marr [arg:]) 252 {} 253 #pragma omp target map(marr [arg:][:arg][:]) // correct if arg is the size of dimension 2 254 {} 255 #pragma omp target map(marr[:arg][:]) 256 {} 257 #pragma omp target map(marr[:arg] [n:]) 258 {} 259 #pragma omp target map(marr[:][:arg] [n:]) // correct if arg is the size of dimension 2 260 {} 261 #pragma omp target map(marr[:][:m] [n:]) // expected-error {{array section does not specify contiguous storage}} 262 {} 263 #pragma omp target map(marr [n:m][:arg] [n:]) 264 {} 265 #pragma omp target map(marr[:2][:1][:]) // expected-error {{array section does not specify contiguous storage}} 266 {} 267 #pragma omp target map(marr[:2] [1:][:]) // expected-error {{array section does not specify contiguous storage}} 268 {} 269 #pragma omp target map(marr[:2][:][:1]) // expected-error {{array section does not specify contiguous storage}} 270 {} 271 #pragma omp target map(marr[:2][:] [1:]) // expected-error {{array section does not specify contiguous storage}} 272 {} 273 #pragma omp target map(marr[:1][:2][:]) 274 {} 275 #pragma omp target map(marr[:1][0][:]) 276 {} 277 #pragma omp target map(marr[:arg][:2][:]) // correct if arg is 1 278 {} 279 #pragma omp target map(marr[:1] [3:1][:2]) 280 {} 281 #pragma omp target map(marr[:1] [3:arg][:2]) // correct if arg is 1 282 {} 283 #pragma omp target map(marr[:1] [3:2][:2]) // expected-error {{array section does not specify contiguous storage}} 284 {} 285 #pragma omp target map(marr[:2][:10][:]) 286 {} 287 #pragma omp target map(marr[:2][:][:5 + 5]) 288 {} 289 #pragma omp target map(marr[:2] [2 + 2 - 4:] [0:5 + 5]) 290 {} 291 292 #pragma omp target map(marr[:1][:2][0]) // expected-error {{array section does not specify contiguous storage}} 293 {} 294 #pragma omp target map(marr2[:1][:2][0]) 295 {} 296 297 #pragma omp target map(mvla[:1][:][0]) // correct if the size of dimension 2 is 1. 298 {} 299 #pragma omp target map(mvla[:2][:arg][:]) // correct if arg is the size of dimension 2. 300 {} 301 #pragma omp target map(mvla[:1][:2][0]) // expected-error {{array section does not specify contiguous storage}} 302 {} 303 #pragma omp target map(mvla[1] [2:arg][:]) 304 {} 305 #pragma omp target map(mvla[:1][:][:]) 306 {} 307 #pragma omp target map(mvla2[:1][:2][:11]) 308 {} 309 #pragma omp target map(mvla2[:1][:2][:10]) // expected-error {{array section does not specify contiguous storage}} 310 {} 311 312 #pragma omp target map(mptr[:2] [2 + 2 - 4:1] [0:5 + 5]) // expected-error {{array section does not specify contiguous storage}} 313 {} 314 #pragma omp target map(mptr[:1][:2 - 1] [2:4 - 3]) 315 {} 316 #pragma omp target map(mptr[:1][:arg] [2:4 - 3]) // correct if arg is 1. 317 {} 318 #pragma omp target map(mptr[:1][:2 - 1] [0:2]) 319 {} 320 #pragma omp target map(mptr[:1][:2] [0:2]) // expected-error {{array section does not specify contiguous storage}} 321 {} 322 #pragma omp target map(mptr[:1][:] [0:2]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 323 {} 324 #pragma omp target map(mptr[:2][:1] [0:2]) // expected-error {{array section does not specify contiguous storage}} 325 {} 326 327 #pragma omp target map(r.ArrS[0].B) 328 {} 329 #pragma omp target map(r.ArrS[:1].B) // expected-error {{OpenMP array section is not allowed here}} 330 {} 331 #pragma omp target map(r.ArrS[:arg].B) // expected-error {{OpenMP array section is not allowed here}} 332 {} 333 #pragma omp target map(r.ArrS[0].Arr [1:23]) 334 {} 335 #pragma omp target map(r.ArrS[0].Arr [1:arg]) 336 {} 337 #pragma omp target map(r.ArrS[0].Arr [arg:23]) 338 {} 339 #pragma omp target map(r.ArrS[0].Error) // expected-error {{no member named 'Error' in 'SB'}} 340 {} 341 #pragma omp target map(r.ArrS[0].A, r.ArrS[1].A) // expected-error {{multiple array elements associated with the same variable are not allowed in map clauses of the same construct}} expected-note {{used here}} 342 {} 343 #pragma omp target map(r.ArrS[0].A, t.ArrS[1].A) 344 {} 345 #pragma omp target map(r.PtrS[0], r.PtrS->B) // expected-error {{same pointer dereferenced in multiple different ways in map clause expressions}} expected-note {{used here}} 346 {} 347 #pragma omp target map(r.PtrS, r.PtrS->B) // expected-error {{pointer cannot be mapped along with a section derived from itself}} expected-note {{used here}} 348 {} 349 #pragma omp target map(r.PtrS->A, r.PtrS->B) 350 {} 351 #pragma omp target map(r.RPtrS[0], r.RPtrS->B) // expected-error {{same pointer dereferenced in multiple different ways in map clause expressions}} expected-note {{used here}} 352 {} 353 #pragma omp target map(r.RPtrS, r.RPtrS->B) // expected-error {{pointer cannot be mapped along with a section derived from itself}} expected-note {{used here}} 354 {} 355 #pragma omp target map(r.RPtrS->A, r.RPtrS->B) 356 {} 357 #pragma omp target map(r.S.Arr[:12]) 358 {} 359 #pragma omp target map(r.S.foo() [:12]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}} 360 {} 361 #pragma omp target map(r.C, r.D) 362 {} 363 #pragma omp target map(r.C, r.C) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} 364 {} 365 #pragma omp target map(r.C) map(r.C) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} 366 {} 367 #pragma omp target map(r.C, r.S) // this would be an error only caught at runtime - Sema would have to make sure there is not way for the missing data between fields to be mapped somewhere else. 368 {} 369 #pragma omp target map(r, r.S) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} 370 {} 371 #pragma omp target map(r.C, t.C) 372 {} 373 #pragma omp target map(r.A) // expected-error {{bit fields cannot be used to specify storage in a 'map' clause}} 374 {} 375 #pragma omp target map(r.Arr) 376 {} 377 #pragma omp target map(r.Arr [3:5]) 378 {} 379 #pragma omp target map(r.Ptr [3:5]) 380 {} 381 #pragma omp target map(r.ArrS [3:5].A) // expected-error {{OpenMP array section is not allowed here}} 382 {} 383 #pragma omp target map(r.ArrS [3:5].Arr [6:7]) // expected-error {{OpenMP array section is not allowed here}} 384 {} 385 #pragma omp target map(r.ArrS[3].Arr [6:7]) 386 {} 387 #pragma omp target map(r.S.Arr [4:5]) 388 {} 389 #pragma omp target map(r.S.Ptr [4:5]) 390 {} 391 #pragma omp target map(r.S.Ptr[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 392 {} 393 #pragma omp target map((p + 1)->A) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 394 {} 395 #pragma omp target map(u.B) // expected-error {{mapping of union members is not allowed}} 396 {} 397 #pragma omp target 398 { 399 u.B = 0; 400 r.S.foo(); 401 } 402 403 #pragma omp target data map(to \ 404 : r.C) //expected-note {{used here}} 405 { 406 #pragma omp target map(r.D) // expected-error {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}} 407 {} 408 } 409 410 #pragma omp target data map(to \ 411 : t.Ptr) //expected-note {{used here}} 412 { 413 #pragma omp target map(t.Ptr[:23]) // expected-error {{pointer cannot be mapped along with a section derived from itself}} 414 {} 415 } 416 417 #pragma omp target data map(to \ 418 : t.C, t.D) 419 { 420 #pragma omp target data map(to \ 421 : t.C) 422 { 423 #pragma omp target map(t.D) 424 {} 425 } 426 } 427 #pragma omp target data map(marr[:][:][:]) 428 { 429 #pragma omp target data map(marr) 430 {} 431 } 432 433 #pragma omp target data map(to \ 434 : t) 435 { 436 #pragma omp target data map(to \ 437 : t.C) 438 { 439 #pragma omp target map(t.D) 440 {} 441 } 442 } 443 } 444 void foo() { 445 } 446 447 bool foobool(int argc) { 448 return argc; 449 } 450 451 struct S1; // expected-note 2 {{declared here}} 452 extern S1 a; 453 class S2 { 454 mutable int a; 455 public: 456 S2():a(0) { } 457 S2(S2 &s2):a(s2.a) { } 458 static float S2s; 459 static const float S2sc; 460 }; 461 const float S2::S2sc = 0; 462 const S2 b; 463 const S2 ba[5]; 464 class S3 { 465 int a; 466 public: 467 S3():a(0) { } 468 S3(S3 &s3):a(s3.a) { } 469 }; 470 const S3 c; 471 const S3 ca[5]; 472 extern const int f; 473 class S4 { 474 int a; 475 S4(); 476 S4(const S4 &s4); 477 public: 478 S4(int v):a(v) { } 479 }; 480 class S5 { 481 int a; 482 S5():a(0) {} 483 S5(const S5 &s5):a(s5.a) { } 484 public: 485 S5(int v):a(v) { } 486 }; 487 488 template <class T> 489 struct S6; 490 491 template<> 492 struct S6<int> 493 { 494 virtual void foo(); 495 }; 496 497 S3 h; 498 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} 499 500 typedef int from; 501 502 struct dim { 503 double x, y; 504 }; 505 506 template<typename T> 507 class Array1D 508 { 509 public: 510 unsigned n1; 511 unsigned size; 512 T * dptr; 513 514 inline T& operator() (unsigned i1) { return dptr[i1]; } 515 516 Array1D() {n1=0;size=0;dptr=nullptr;} 517 }; 518 519 template <typename T, int I> // expected-note {{declared here}} 520 T tmain(T argc) { 521 const T d = 5; 522 const T da[5] = { 0 }; 523 S4 e(4); 524 S5 g(5); 525 T i, t[20]; 526 T &j = i; 527 T *k = &j; 528 T x; 529 T y; 530 T to, tofrom, always, close, present; 531 const T (&l)[5] = da; 532 #pragma omp target map // expected-error {{expected '(' after 'map'}} 533 {} 534 #pragma omp target map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} 535 {} 536 #pragma omp target map() // expected-error {{expected expression}} 537 {} 538 #pragma omp target map(alloc) // expected-error {{use of undeclared identifier 'alloc'}} 539 {} 540 #pragma omp target map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}} 541 {} 542 #pragma omp target map(to:) // expected-error {{expected expression}} 543 {} 544 #pragma omp target map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 545 {} 546 #pragma omp target map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 547 {} 548 #pragma omp target map(x) 549 foo(); 550 #pragma omp target map(tofrom: t[:I]) 551 foo(); 552 #pragma omp target map(T: a) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} expected-error {{incomplete type 'S1' where a complete type is required}} 553 foo(); 554 #pragma omp target map(T) // expected-error {{'T' does not refer to a value}} 555 foo(); 556 #pragma omp target map(I) // lt50-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error 2 {{expected addressable lvalue in 'map' clause}} 557 foo(); 558 #pragma omp target map(S2::S2s) 559 foo(); 560 #pragma omp target map(S2::S2sc) 561 foo(); 562 #pragma omp target map(x) 563 foo(); 564 #pragma omp target map(to: x) 565 foo(); 566 #pragma omp target map(to: to) 567 foo(); 568 #pragma omp target map(to) 569 foo(); 570 #pragma omp target map(to, x) 571 foo(); 572 #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}} 573 #pragma omp target data map(tofrom: argc > 0 ? x : y) // lt50-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error 2 {{expected addressable lvalue in 'map' clause}} 574 #pragma omp target data map(argc) 575 #pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}} 576 #pragma omp target data map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} warn-warning 2 {{Type 'const S2' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning 2 {{Type 'const S3' is not trivially copyable and not guaranteed to be mapped correctly}} 577 #pragma omp target data map(ba) // warn-warning 2 {{Type 'const S2 [5]' is not trivially copyable and not guaranteed to be mapped correctly}} 578 #pragma omp target data map(ca) // warn-warning 2 {{Type 'const S3 [5]' is not trivially copyable and not guaranteed to be mapped correctly}} 579 #pragma omp target data map(da) 580 #pragma omp target data map(S2::S2s) 581 #pragma omp target data map(S2::S2sc) 582 #pragma omp target data map(e, g) // warn-warning 2 {{Type 'S4' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning 2 {{Type 'S5' is not trivially copyable and not guaranteed to be mapped correctly}} 583 #pragma omp target data map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}} 584 #pragma omp target data map(k) map(k) // expected-error 2 {{variable already marked as mapped in current construct}} expected-note 2 {{used here}} 585 #pragma omp target map(k), map(k[:5]) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} expected-note 2 {{used here}} 586 foo(); 587 #pragma omp target data map(da) 588 #pragma omp target map(da[:4]) 589 foo(); 590 #pragma omp target data map(k, j, l) // expected-note 2 {{used here}} 591 #pragma omp target data map(k[:4]) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} 592 #pragma omp target data map(j) 593 #pragma omp target map(l) map(l[:5]) // expected-error 2 {{variable already marked as mapped in current construct}} expected-note 2 {{used here}} 594 foo(); 595 #pragma omp target data map(k[:4], j, l[:5]) // expected-note 2 {{used here}} 596 #pragma omp target data map(k) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} 597 #pragma omp target data map(j) 598 #pragma omp target map(l) 599 foo(); 600 601 #pragma omp target data map(always, tofrom: x) 602 #pragma omp target data map(always: x) // expected-error {{missing map type}} 603 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 604 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 605 // expected-error@+1 {{missing map type}} 606 #pragma omp target data map(tofrom, always: x) 607 #pragma omp target data map(always, tofrom: always, tofrom, x) 608 #pragma omp target map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}} 609 foo(); 610 611 #pragma omp target data map(close, tofrom: x) 612 #pragma omp target data map(close: x) // expected-error {{missing map type}} 613 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 614 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 615 // expected-error@+1 {{missing map type}} 616 #pragma omp target data map(tofrom, close: x) 617 #pragma omp target data map(close, tofrom: close, tofrom, x) 618 foo(); 619 620 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 621 #pragma omp target data map(present, tofrom: x) 622 // ge51-error@+2 {{missing map type}} 623 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 624 #pragma omp target data map(present: x) 625 // ge51-error@+4 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 626 // lt51-error@+3 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 627 // ge51-error@+2 {{missing map type}} 628 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 629 #pragma omp target data map(tofrom, present: x) 630 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 631 #pragma omp target data map(present, tofrom: present, tofrom, x) 632 foo(); 633 634 T marr[10][10], iarr[5]; 635 #pragma omp target data map(marr[10][0:2:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} 636 {} 637 #pragma omp target data map(iarr[:2:d]) // expected-error {{expected ']'}} expected-note {{to match this '['}} 638 {} 639 return 0; 640 } 641 642 struct SA1{ 643 int a; 644 struct SA1 *p; 645 int b[10]; 646 }; 647 struct SB1{ 648 int a; 649 struct SA1 s; 650 struct SA1 sa[10]; 651 struct SA1 *sp[10]; 652 struct SA1 *p; 653 }; 654 struct SC1{ 655 int a; 656 struct SB1 s; 657 struct SB1 *p; 658 int b[10]; 659 }; 660 661 class S8 { 662 public: 663 virtual void foo() = 0; 664 } *s8; 665 666 class S9 { 667 public: 668 virtual void foo() {} 669 } s9; 670 671 672 int main(int argc, char **argv) { 673 const int d = 5; 674 const int da[5] = { 0 }; 675 S4 e(4); 676 S5 g(5); 677 int i; 678 int &j = i; 679 int *k = &j; 680 S6<int> m; 681 int x; 682 int y; 683 int to, tofrom, always, close, present; 684 const int (&l)[5] = da; 685 SC1 s; 686 SC1 *p; 687 int Arr[10]; 688 #pragma omp target data map // expected-error {{expected '(' after 'map'}} lt50-error {{expected at least one 'map' or 'use_device_ptr' clause for '#pragma omp target data'}} ge50-error {{expected at least one 'map', 'use_device_ptr', or 'use_device_addr' clause for '#pragma omp target data'}} 689 #pragma omp target data map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} 690 #pragma omp target data map() // expected-error {{expected expression}} 691 #pragma omp target data map(alloc) // expected-error {{use of undeclared identifier 'alloc'}} 692 #pragma omp target data map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}} 693 #pragma omp target data map(to:) // expected-error {{expected expression}} 694 #pragma omp target data map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 695 #pragma omp target data map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 696 #pragma omp target map(x) 697 foo(); 698 #pragma omp target map(to: x) 699 foo(); 700 #pragma omp target map(to: to) 701 foo(); 702 #pragma omp target map(to) 703 foo(); 704 #pragma omp target map(to, x) 705 foo(); 706 #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}} 707 #pragma omp target data map(tofrom: argc > 0 ? argv[1] : argv[2]) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} ge50-error {{expected addressable lvalue in 'map' clause}} 708 #pragma omp target data map(argc) 709 #pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}} 710 #pragma omp target data map(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} warn-warning {{Type 'const S2' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning {{Type 'const S3' is not trivially copyable and not guaranteed to be mapped correctly}} 711 #pragma omp target data map(argv[1]) 712 #pragma omp target data map(ba) // warn-warning {{Type 'const S2 [5]' is not trivially copyable and not guaranteed to be mapped correctly}} 713 #pragma omp target data map(ca) // warn-warning {{Type 'const S3 [5]' is not trivially copyable and not guaranteed to be mapped correctly}} 714 #pragma omp target data map(da) 715 #pragma omp target data map(S2::S2s) 716 #pragma omp target data map(S2::S2sc) 717 #pragma omp target data map(e, g) // warn-warning {{Type 'S4' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning {{Type 'S5' is not trivially copyable and not guaranteed to be mapped correctly}} 718 #pragma omp target data map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}} 719 #pragma omp target data map(k), map(k) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} 720 #pragma omp target map(k), map(k[:5]) // expected-error {{pointer cannot be mapped along with a section derived from itself}} expected-note {{used here}} 721 foo(); 722 #pragma omp target data map(da) 723 #pragma omp target map(da[:4]) 724 foo(); 725 #pragma omp target data map(k, j, l) // expected-note {{used here}} 726 #pragma omp target data map(k[:4]) // expected-error {{pointer cannot be mapped along with a section derived from itself}} 727 #pragma omp target data map(j) 728 #pragma omp target map(l) map(l[:5]) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} 729 foo(); 730 #pragma omp target data map(k[:4], j, l[:5]) // expected-note {{used here}} 731 #pragma omp target data map(k) // expected-error {{pointer cannot be mapped along with a section derived from itself}} 732 #pragma omp target data map(j) 733 #pragma omp target map(l) 734 foo(); 735 736 #pragma omp target data map(always, tofrom: x) 737 #pragma omp target data map(always: x) // expected-error {{missing map type}} 738 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 739 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 740 // expected-error@+1 {{missing map type}} 741 #pragma omp target data map(tofrom, always: x) 742 #pragma omp target data map(always, tofrom: always, tofrom, x) 743 #pragma omp target map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}} 744 foo(); 745 #pragma omp target data map(close, tofrom: x) 746 #pragma omp target data map(close: x) // expected-error {{missing map type}} 747 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 748 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 749 // expected-error@+1 {{missing map type}} 750 #pragma omp target data map(tofrom, close: x) 751 foo(); 752 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 753 #pragma omp target data map(present, tofrom: x) 754 // ge51-error@+2 {{missing map type}} 755 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 756 #pragma omp target data map(present: x) 757 // ge51-error@+4 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 758 // lt51-error@+3 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 759 // ge51-error@+2 {{missing map type}} 760 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 761 #pragma omp target data map(tofrom, present: x) 762 foo(); 763 #pragma omp target private(j) map(j) // expected-error {{private variable cannot be in a map clause in '#pragma omp target' directive}} expected-note {{defined as private}} 764 {} 765 #pragma omp target firstprivate(j) map(j) // expected-error {{firstprivate variable cannot be in a map clause in '#pragma omp target' directive}} expected-note {{defined as firstprivate}} 766 {} 767 #pragma omp target map(m) // warn-warning {{Type 'S6<int>' is not trivially copyable and not guaranteed to be mapped correctly}} 768 {} 769 // expected-note@+1 {{used here}} 770 #pragma omp target map(s.s.s) 771 // expected-error@+1 {{variable already marked as mapped in current construct}} 772 { s.a++; } 773 // expected-note@+1 {{used here}} 774 #pragma omp target map(s.s.s.a) 775 // expected-error@+1 {{variable already marked as mapped in current construct}} 776 { s.a++; } 777 // expected-note@+1 {{used here}} 778 #pragma omp target map(s.b[:5]) 779 // expected-error@+1 {{variable already marked as mapped in current construct}} 780 { s.a++; } 781 #pragma omp target map(s.p[:5]) 782 { s.a++; } 783 // expected-note@+1 {{used here}} 784 #pragma omp target map(s.s.sa[3].a) 785 // expected-error@+1 {{variable already marked as mapped in current construct}} 786 { s.a++; } 787 // expected-note@+1 {{used here}} 788 #pragma omp target map(s.s.sp[3]->a) 789 // expected-error@+1 {{variable already marked as mapped in current construct}} 790 { s.a++; } 791 // expected-note@+1 {{used here}} 792 #pragma omp target map(s.p->a) 793 // expected-error@+1 {{variable already marked as mapped in current construct}} 794 { s.a++; } 795 // expected-note@+1 {{used here}} 796 #pragma omp target map(s.s.p->a) 797 // expected-error@+1 {{variable already marked as mapped in current construct}} 798 { s.a++; } 799 // expected-note@+1 {{used here}} 800 #pragma omp target map(s.s.s.b[:2]) 801 // expected-error@+1 {{variable already marked as mapped in current construct}} 802 { s.a++; } 803 // expected-note@+1 {{used here}} 804 #pragma omp target map(s.s.p->b[:2]) 805 // expected-error@+1 {{variable already marked as mapped in current construct}} 806 { s.a++; } 807 // expected-note@+1 {{used here}} 808 #pragma omp target map(s.p->p->p->a) 809 // expected-error@+1 {{variable already marked as mapped in current construct}} 810 { s.a++; } 811 #pragma omp target map(s.s.s.b[:2]) 812 { s.s.s.b[0]++; } 813 #pragma omp target map(s8[0:1], s9) // warn-warning {{Type 'class S8' is not trivially copyable and not guaranteed to be mapped correctly}} warn-warning {{Type 'class S9' is not trivially copyable and not guaranteed to be mapped correctly}} 814 {} 815 816 int **BB, *offset, *a; 817 818 #pragma omp target map(**(BB+*offset)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 819 {} 820 #pragma omp target map(**(BB+y)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 821 {} 822 #pragma omp target map(*(a+*offset)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 823 {} 824 #pragma omp target map(**(*offset+BB)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 825 {} 826 #pragma omp target map(**(y+BB)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 827 {} 828 #pragma omp target map(*(*offset+a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 829 {} 830 #pragma omp target map(**(*offset+BB+*a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 831 {} 832 #pragma omp target map(**(*(*(&offset))+BB+*a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 833 {} 834 #pragma omp target map(*(a+(a))) // expected-error {{invalid operands to binary expression ('int *' and 'int *')}} 835 {} 836 #pragma omp target map(*(1+*a+*a)) // expected-error {{indirection requires pointer operand ('int' invalid)}} 837 {} 838 839 #pragma omp target map(delete: a) // expected-error {{map type 'delete' is not allowed for '#pragma omp target'}} 840 {} 841 #pragma omp target map(release: a) // expected-error {{map type 'release' is not allowed for '#pragma omp target'}} 842 {} 843 844 int marr[10][10], iarr[5]; 845 846 #pragma omp target map(marr[10][0:2:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} 847 {} 848 #pragma omp target map(iarr[:2:d]) // expected-error {{expected ']'}} expected-note {{to match this '['}} 849 {} 850 851 #pragma omp target data map(Arr[0:4]) // lt50-note {{used here}} 852 { 853 #pragma omp target 854 Arr[0] = 2; // lt50-error {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}} 855 } 856 857 Array1D<dim> pos; 858 859 #pragma omp target enter data map(to:pos) 860 #pragma omp target enter data map(to:pos.dptr[0:pos.size]) 861 #pragma omp target teams distribute parallel for 862 for(int i=0; i<100; i++) { 863 pos(i).x = i; 864 pos(i).y = i+1; 865 } 866 867 return tmain<int, 3>(argc)+tmain<from, 4>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<int, 4>' requested here}} 868 } 869 #endif 870