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 template <typename T, int I> // expected-note {{declared here}} 503 T tmain(T argc) { 504 const T d = 5; 505 const T da[5] = { 0 }; 506 S4 e(4); 507 S5 g(5); 508 T i, t[20]; 509 T &j = i; 510 T *k = &j; 511 T x; 512 T y; 513 T to, tofrom, always, close, present; 514 const T (&l)[5] = da; 515 #pragma omp target map // expected-error {{expected '(' after 'map'}} 516 {} 517 #pragma omp target map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} 518 {} 519 #pragma omp target map() // expected-error {{expected expression}} 520 {} 521 #pragma omp target map(alloc) // expected-error {{use of undeclared identifier 'alloc'}} 522 {} 523 #pragma omp target map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}} 524 {} 525 #pragma omp target map(to:) // expected-error {{expected expression}} 526 {} 527 #pragma omp target map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 528 {} 529 #pragma omp target map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 530 {} 531 #pragma omp target map(x) 532 foo(); 533 #pragma omp target map(tofrom: t[:I]) 534 foo(); 535 #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}} 536 foo(); 537 #pragma omp target map(T) // expected-error {{'T' does not refer to a value}} 538 foo(); 539 #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}} 540 foo(); 541 #pragma omp target map(S2::S2s) 542 foo(); 543 #pragma omp target map(S2::S2sc) 544 foo(); 545 #pragma omp target map(x) 546 foo(); 547 #pragma omp target map(to: x) 548 foo(); 549 #pragma omp target map(to: to) 550 foo(); 551 #pragma omp target map(to) 552 foo(); 553 #pragma omp target map(to, x) 554 foo(); 555 #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}} 556 #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}} 557 #pragma omp target data map(argc) 558 #pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}} 559 #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}} 560 #pragma omp target data map(ba) // warn-warning 2 {{Type 'const S2 [5]' is not trivially copyable and not guaranteed to be mapped correctly}} 561 #pragma omp target data map(ca) // warn-warning 2 {{Type 'const S3 [5]' is not trivially copyable and not guaranteed to be mapped correctly}} 562 #pragma omp target data map(da) 563 #pragma omp target data map(S2::S2s) 564 #pragma omp target data map(S2::S2sc) 565 #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}} 566 #pragma omp target data map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}} 567 #pragma omp target data map(k) map(k) // expected-error 2 {{variable already marked as mapped in current construct}} expected-note 2 {{used here}} 568 #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}} 569 foo(); 570 #pragma omp target data map(da) 571 #pragma omp target map(da[:4]) 572 foo(); 573 #pragma omp target data map(k, j, l) // expected-note 2 {{used here}} 574 #pragma omp target data map(k[:4]) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} 575 #pragma omp target data map(j) 576 #pragma omp target map(l) map(l[:5]) // expected-error 2 {{variable already marked as mapped in current construct}} expected-note 2 {{used here}} 577 foo(); 578 #pragma omp target data map(k[:4], j, l[:5]) // expected-note 2 {{used here}} 579 #pragma omp target data map(k) // expected-error 2 {{pointer cannot be mapped along with a section derived from itself}} 580 #pragma omp target data map(j) 581 #pragma omp target map(l) 582 foo(); 583 584 #pragma omp target data map(always, tofrom: x) 585 #pragma omp target data map(always: x) // expected-error {{missing map type}} 586 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 587 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 588 // expected-error@+1 {{missing map type}} 589 #pragma omp target data map(tofrom, always: x) 590 #pragma omp target data map(always, tofrom: always, tofrom, x) 591 #pragma omp target map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}} 592 foo(); 593 594 #pragma omp target data map(close, tofrom: x) 595 #pragma omp target data map(close: x) // expected-error {{missing map type}} 596 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 597 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 598 // expected-error@+1 {{missing map type}} 599 #pragma omp target data map(tofrom, close: x) 600 #pragma omp target data map(close, tofrom: close, tofrom, x) 601 foo(); 602 603 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 604 #pragma omp target data map(present, tofrom: x) 605 // ge51-error@+2 {{missing map type}} 606 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 607 #pragma omp target data map(present: x) 608 // ge51-error@+4 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 609 // lt51-error@+3 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 610 // ge51-error@+2 {{missing map type}} 611 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 612 #pragma omp target data map(tofrom, present: x) 613 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 614 #pragma omp target data map(present, tofrom: present, tofrom, x) 615 foo(); 616 617 T marr[10][10], iarr[5]; 618 #pragma omp target data map(marr[10][0:2:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} 619 {} 620 #pragma omp target data map(iarr[:2:d]) // expected-error {{expected ']'}} expected-note {{to match this '['}} 621 {} 622 return 0; 623 } 624 625 struct SA1{ 626 int a; 627 struct SA1 *p; 628 int b[10]; 629 }; 630 struct SB1{ 631 int a; 632 struct SA1 s; 633 struct SA1 sa[10]; 634 struct SA1 *sp[10]; 635 struct SA1 *p; 636 }; 637 struct SC1{ 638 int a; 639 struct SB1 s; 640 struct SB1 *p; 641 int b[10]; 642 }; 643 644 class S8 { 645 public: 646 virtual void foo() = 0; 647 } *s8; 648 649 class S9 { 650 public: 651 virtual void foo() {} 652 } s9; 653 654 655 int main(int argc, char **argv) { 656 const int d = 5; 657 const int da[5] = { 0 }; 658 S4 e(4); 659 S5 g(5); 660 int i; 661 int &j = i; 662 int *k = &j; 663 S6<int> m; 664 int x; 665 int y; 666 int to, tofrom, always, close, present; 667 const int (&l)[5] = da; 668 SC1 s; 669 SC1 *p; 670 int Arr[10]; 671 #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'}} 672 #pragma omp target data map( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} 673 #pragma omp target data map() // expected-error {{expected expression}} 674 #pragma omp target data map(alloc) // expected-error {{use of undeclared identifier 'alloc'}} 675 #pragma omp target data map(to argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected ',' or ')' in 'map' clause}} 676 #pragma omp target data map(to:) // expected-error {{expected expression}} 677 #pragma omp target data map(from: argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 678 #pragma omp target data map(x: y) // expected-error {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 679 #pragma omp target map(x) 680 foo(); 681 #pragma omp target map(to: x) 682 foo(); 683 #pragma omp target map(to: to) 684 foo(); 685 #pragma omp target map(to) 686 foo(); 687 #pragma omp target map(to, x) 688 foo(); 689 #pragma omp target data map(to x) // expected-error {{expected ',' or ')' in 'map' clause}} 690 #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}} 691 #pragma omp target data map(argc) 692 #pragma omp target data map(S1) // expected-error {{'S1' does not refer to a value}} 693 #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}} 694 #pragma omp target data map(argv[1]) 695 #pragma omp target data map(ba) // warn-warning {{Type 'const S2 [5]' is not trivially copyable and not guaranteed to be mapped correctly}} 696 #pragma omp target data map(ca) // warn-warning {{Type 'const S3 [5]' is not trivially copyable and not guaranteed to be mapped correctly}} 697 #pragma omp target data map(da) 698 #pragma omp target data map(S2::S2s) 699 #pragma omp target data map(S2::S2sc) 700 #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}} 701 #pragma omp target data map(h) // expected-error {{threadprivate variables are not allowed in 'map' clause}} 702 #pragma omp target data map(k), map(k) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} 703 #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}} 704 foo(); 705 #pragma omp target data map(da) 706 #pragma omp target map(da[:4]) 707 foo(); 708 #pragma omp target data map(k, j, l) // expected-note {{used here}} 709 #pragma omp target data map(k[:4]) // expected-error {{pointer cannot be mapped along with a section derived from itself}} 710 #pragma omp target data map(j) 711 #pragma omp target map(l) map(l[:5]) // expected-error {{variable already marked as mapped in current construct}} expected-note {{used here}} 712 foo(); 713 #pragma omp target data map(k[:4], j, l[:5]) // expected-note {{used here}} 714 #pragma omp target data map(k) // expected-error {{pointer cannot be mapped along with a section derived from itself}} 715 #pragma omp target data map(j) 716 #pragma omp target map(l) 717 foo(); 718 719 #pragma omp target data map(always, tofrom: x) 720 #pragma omp target data map(always: x) // expected-error {{missing map type}} 721 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 722 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 723 // expected-error@+1 {{missing map type}} 724 #pragma omp target data map(tofrom, always: x) 725 #pragma omp target data map(always, tofrom: always, tofrom, x) 726 #pragma omp target map(tofrom j) // expected-error {{expected ',' or ')' in 'map' clause}} 727 foo(); 728 #pragma omp target data map(close, tofrom: x) 729 #pragma omp target data map(close: x) // expected-error {{missing map type}} 730 // ge51-error@+3 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 731 // lt51-error@+2 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 732 // expected-error@+1 {{missing map type}} 733 #pragma omp target data map(tofrom, close: x) 734 foo(); 735 // lt51-error@+1 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 736 #pragma omp target data map(present, tofrom: x) 737 // ge51-error@+2 {{missing map type}} 738 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 739 #pragma omp target data map(present: x) 740 // ge51-error@+4 {{incorrect map type modifier, expected 'always', 'close', 'mapper', or 'present'}} 741 // lt51-error@+3 {{incorrect map type modifier, expected 'always', 'close', or 'mapper'}} 742 // ge51-error@+2 {{missing map type}} 743 // lt51-error@+1 {{incorrect map type, expected one of 'to', 'from', 'tofrom', 'alloc', 'release', or 'delete'}} 744 #pragma omp target data map(tofrom, present: x) 745 foo(); 746 #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}} 747 {} 748 #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}} 749 {} 750 #pragma omp target map(m) // warn-warning {{Type 'S6<int>' is not trivially copyable and not guaranteed to be mapped correctly}} 751 {} 752 // expected-note@+1 {{used here}} 753 #pragma omp target map(s.s.s) 754 // expected-error@+1 {{variable already marked as mapped in current construct}} 755 { s.a++; } 756 // expected-note@+1 {{used here}} 757 #pragma omp target map(s.s.s.a) 758 // expected-error@+1 {{variable already marked as mapped in current construct}} 759 { s.a++; } 760 // expected-note@+1 {{used here}} 761 #pragma omp target map(s.b[:5]) 762 // expected-error@+1 {{variable already marked as mapped in current construct}} 763 { s.a++; } 764 #pragma omp target map(s.p[:5]) 765 { s.a++; } 766 // expected-note@+1 {{used here}} 767 #pragma omp target map(s.s.sa[3].a) 768 // expected-error@+1 {{variable already marked as mapped in current construct}} 769 { s.a++; } 770 // expected-note@+1 {{used here}} 771 #pragma omp target map(s.s.sp[3]->a) 772 // expected-error@+1 {{variable already marked as mapped in current construct}} 773 { s.a++; } 774 // expected-note@+1 {{used here}} 775 #pragma omp target map(s.p->a) 776 // expected-error@+1 {{variable already marked as mapped in current construct}} 777 { s.a++; } 778 // expected-note@+1 {{used here}} 779 #pragma omp target map(s.s.p->a) 780 // expected-error@+1 {{variable already marked as mapped in current construct}} 781 { s.a++; } 782 // expected-note@+1 {{used here}} 783 #pragma omp target map(s.s.s.b[:2]) 784 // expected-error@+1 {{variable already marked as mapped in current construct}} 785 { s.a++; } 786 // expected-note@+1 {{used here}} 787 #pragma omp target map(s.s.p->b[:2]) 788 // expected-error@+1 {{variable already marked as mapped in current construct}} 789 { s.a++; } 790 // expected-note@+1 {{used here}} 791 #pragma omp target map(s.p->p->p->a) 792 // expected-error@+1 {{variable already marked as mapped in current construct}} 793 { s.a++; } 794 #pragma omp target map(s.s.s.b[:2]) 795 { s.s.s.b[0]++; } 796 #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}} 797 {} 798 799 int **BB, *offset, *a; 800 801 #pragma omp target map(**(BB+*offset)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 802 {} 803 #pragma omp target map(**(BB+y)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 804 {} 805 #pragma omp target map(*(a+*offset)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 806 {} 807 #pragma omp target map(**(*offset+BB)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 808 {} 809 #pragma omp target map(**(y+BB)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 810 {} 811 #pragma omp target map(*(*offset+a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 812 {} 813 #pragma omp target map(**(*offset+BB+*a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 814 {} 815 #pragma omp target map(**(*(*(&offset))+BB+*a)) // lt50-error {{expected expression containing only member accesses and/or array sections based on named variables}} 816 {} 817 #pragma omp target map(*(a+(a))) // expected-error {{invalid operands to binary expression ('int *' and 'int *')}} 818 {} 819 #pragma omp target map(*(1+*a+*a)) // expected-error {{indirection requires pointer operand ('int' invalid)}} 820 {} 821 822 #pragma omp target map(delete: a) // expected-error {{map type 'delete' is not allowed for '#pragma omp target'}} 823 {} 824 #pragma omp target map(release: a) // expected-error {{map type 'release' is not allowed for '#pragma omp target'}} 825 {} 826 827 int marr[10][10], iarr[5]; 828 829 #pragma omp target map(marr[10][0:2:2]) // expected-error {{expected ']'}} expected-note {{to match this '['}} 830 {} 831 #pragma omp target map(iarr[:2:d]) // expected-error {{expected ']'}} expected-note {{to match this '['}} 832 {} 833 834 #pragma omp target data map(Arr[0:4]) // lt50-note {{used here}} 835 { 836 #pragma omp target 837 Arr[0] = 2; // lt50-error {{original storage of expression in data environment is shared but data environment do not fully contain mapped expression storage}} 838 } 839 840 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}} 841 } 842 #endif 843