1 2 3 // expected-no-diagnostics 4 #ifndef HEADER 5 #define HEADER 6 7 // RUN: %clang_cc1 -DOMP45 -verify -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s --check-prefix=OMP45 8 // RUN: %clang_cc1 -DOMP45 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s 9 // RUN: %clang_cc1 -DOMP45 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=OMP45 10 11 // RUN: %clang_cc1 -DOMP45 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s | FileCheck %s --check-prefix=OMP45 12 // RUN: %clang_cc1 -DOMP45 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s 13 // RUN: %clang_cc1 -DOMP45 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=OMP45 14 #ifdef OMP45 15 16 void foo() {} 17 18 template <typename T, int C> 19 T tmain(T argc, T *argv) { 20 T i, j, a[20], always, close; 21 #pragma omp target 22 foo(); 23 #pragma omp target if (target:argc > 0) 24 foo(); 25 #pragma omp target if (C) 26 foo(); 27 #pragma omp target map(i) 28 foo(); 29 #pragma omp target map(a[0:10], i) 30 foo(); 31 #pragma omp target map(to: i) map(from: j) 32 foo(); 33 #pragma omp target map(always,alloc: i) 34 foo(); 35 #pragma omp target map(always from: i) 36 foo(); 37 #pragma omp target map(always) 38 {always++;} 39 #pragma omp target map(always,i) 40 {always++;i++;} 41 #pragma omp target map(close,alloc: i) 42 foo(); 43 #pragma omp target map(close from: i) 44 foo(); 45 #pragma omp target map(close) 46 {close++;} 47 #pragma omp target map(close,i) 48 {close++;i++;} 49 #pragma omp target nowait 50 foo(); 51 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 52 foo(); 53 #pragma omp target defaultmap(tofrom: scalar) 54 foo(); 55 return 0; 56 } 57 58 // OMP45: template <typename T, int C> T tmain(T argc, T *argv) { 59 // OMP45-NEXT: T i, j, a[20] 60 // OMP45-NEXT: #pragma omp target{{$}} 61 // OMP45-NEXT: foo(); 62 // OMP45-NEXT: #pragma omp target if(target: argc > 0) 63 // OMP45-NEXT: foo() 64 // OMP45-NEXT: #pragma omp target if(C) 65 // OMP45-NEXT: foo() 66 // OMP45-NEXT: #pragma omp target map(tofrom: i) 67 // OMP45-NEXT: foo() 68 // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i) 69 // OMP45-NEXT: foo() 70 // OMP45-NEXT: #pragma omp target map(to: i) map(from: j) 71 // OMP45-NEXT: foo() 72 // OMP45-NEXT: #pragma omp target map(always,alloc: i) 73 // OMP45-NEXT: foo() 74 // OMP45-NEXT: #pragma omp target map(always,from: i) 75 // OMP45-NEXT: foo() 76 // OMP45-NEXT: #pragma omp target map(tofrom: always) 77 // OMP45-NEXT: { 78 // OMP45-NEXT: always++; 79 // OMP45-NEXT: } 80 // OMP45-NEXT: #pragma omp target map(tofrom: always,i) 81 // OMP45-NEXT: { 82 // OMP45-NEXT: always++; 83 // OMP45-NEXT: i++; 84 // OMP45-NEXT: } 85 // OMP45-NEXT: #pragma omp target map(close,alloc: i) 86 // OMP45-NEXT: foo() 87 // OMP45-NEXT: #pragma omp target map(close,from: i) 88 // OMP45-NEXT: foo() 89 // OMP45-NEXT: #pragma omp target map(tofrom: close) 90 // OMP45-NEXT: { 91 // OMP45-NEXT: close++; 92 // OMP45-NEXT: } 93 // OMP45-NEXT: #pragma omp target map(tofrom: close,i) 94 // OMP45-NEXT: { 95 // OMP45-NEXT: close++; 96 // OMP45-NEXT: i++; 97 // OMP45-NEXT: } 98 // OMP45-NEXT: #pragma omp target nowait 99 // OMP45-NEXT: foo() 100 // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 101 // OMP45-NEXT: foo() 102 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar) 103 // OMP45-NEXT: foo() 104 // OMP45: template<> int tmain<int, 5>(int argc, int *argv) { 105 // OMP45-NEXT: int i, j, a[20] 106 // OMP45-NEXT: #pragma omp target 107 // OMP45-NEXT: foo(); 108 // OMP45-NEXT: #pragma omp target if(target: argc > 0) 109 // OMP45-NEXT: foo() 110 // OMP45-NEXT: #pragma omp target if(5) 111 // OMP45-NEXT: foo() 112 // OMP45-NEXT: #pragma omp target map(tofrom: i) 113 // OMP45-NEXT: foo() 114 // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i) 115 // OMP45-NEXT: foo() 116 // OMP45-NEXT: #pragma omp target map(to: i) map(from: j) 117 // OMP45-NEXT: foo() 118 // OMP45-NEXT: #pragma omp target map(always,alloc: i) 119 // OMP45-NEXT: foo() 120 // OMP45-NEXT: #pragma omp target map(always,from: i) 121 // OMP45-NEXT: foo() 122 // OMP45-NEXT: #pragma omp target map(tofrom: always) 123 // OMP45-NEXT: { 124 // OMP45-NEXT: always++; 125 // OMP45-NEXT: } 126 // OMP45-NEXT: #pragma omp target map(tofrom: always,i) 127 // OMP45-NEXT: { 128 // OMP45-NEXT: always++; 129 // OMP45-NEXT: i++; 130 // OMP45-NEXT: } 131 // OMP45-NEXT: #pragma omp target map(close,alloc: i) 132 // OMP45-NEXT: foo() 133 // OMP45-NEXT: #pragma omp target map(close,from: i) 134 // OMP45-NEXT: foo() 135 // OMP45-NEXT: #pragma omp target map(tofrom: close) 136 // OMP45-NEXT: { 137 // OMP45-NEXT: close++; 138 // OMP45-NEXT: } 139 // OMP45-NEXT: #pragma omp target map(tofrom: close,i) 140 // OMP45-NEXT: { 141 // OMP45-NEXT: close++; 142 // OMP45-NEXT: i++; 143 // OMP45-NEXT: } 144 // OMP45-NEXT: #pragma omp target nowait 145 // OMP45-NEXT: foo() 146 // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 147 // OMP45-NEXT: foo() 148 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar) 149 // OMP45-NEXT: foo() 150 // OMP45: template<> char tmain<char, 1>(char argc, char *argv) { 151 // OMP45-NEXT: char i, j, a[20] 152 // OMP45-NEXT: #pragma omp target 153 // OMP45-NEXT: foo(); 154 // OMP45-NEXT: #pragma omp target if(target: argc > 0) 155 // OMP45-NEXT: foo() 156 // OMP45-NEXT: #pragma omp target if(1) 157 // OMP45-NEXT: foo() 158 // OMP45-NEXT: #pragma omp target map(tofrom: i) 159 // OMP45-NEXT: foo() 160 // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i) 161 // OMP45-NEXT: foo() 162 // OMP45-NEXT: #pragma omp target map(to: i) map(from: j) 163 // OMP45-NEXT: foo() 164 // OMP45-NEXT: #pragma omp target map(always,alloc: i) 165 // OMP45-NEXT: foo() 166 // OMP45-NEXT: #pragma omp target map(always,from: i) 167 // OMP45-NEXT: foo() 168 // OMP45-NEXT: #pragma omp target map(tofrom: always) 169 // OMP45-NEXT: { 170 // OMP45-NEXT: always++; 171 // OMP45-NEXT: } 172 // OMP45-NEXT: #pragma omp target map(tofrom: always,i) 173 // OMP45-NEXT: { 174 // OMP45-NEXT: always++; 175 // OMP45-NEXT: i++; 176 // OMP45-NEXT: } 177 // OMP45-NEXT: #pragma omp target map(close,alloc: i) 178 // OMP45-NEXT: foo() 179 // OMP45-NEXT: #pragma omp target map(close,from: i) 180 // OMP45-NEXT: foo() 181 // OMP45-NEXT: #pragma omp target map(tofrom: close) 182 // OMP45-NEXT: { 183 // OMP45-NEXT: close++; 184 // OMP45-NEXT: } 185 // OMP45-NEXT: #pragma omp target map(tofrom: close,i) 186 // OMP45-NEXT: { 187 // OMP45-NEXT: close++; 188 // OMP45-NEXT: i++; 189 // OMP45-NEXT: } 190 // OMP45-NEXT: #pragma omp target nowait 191 // OMP45-NEXT: foo() 192 // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 193 // OMP45-NEXT: foo() 194 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar) 195 // OMP45-NEXT: foo() 196 197 // OMP45-LABEL: class S { 198 class S { 199 void foo() { 200 // OMP45-NEXT: void foo() { 201 int a = 0; 202 // OMP45-NEXT: int a = 0; 203 #pragma omp target map(this[0]) 204 // OMP45-NEXT: #pragma omp target map(tofrom: this[0]) 205 a++; 206 // OMP45-NEXT: a++; 207 #pragma omp target map(this[:1]) 208 // OMP45-NEXT: #pragma omp target map(tofrom: this[:1]) 209 a++; 210 // OMP45-NEXT: a++; 211 #pragma omp target map((this)[0]) 212 // OMP45-NEXT: #pragma omp target map(tofrom: (this)[0]) 213 a++; 214 // OMP45-NEXT: a++; 215 #pragma omp target map(this[:a]) 216 // OMP45-NEXT: #pragma omp target map(tofrom: this[:a]) 217 a++; 218 // OMP45-NEXT: a++; 219 #pragma omp target map(this[a:1]) 220 // OMP45-NEXT: #pragma omp target map(tofrom: this[a:1]) 221 a++; 222 // OMP45-NEXT: a++; 223 #pragma omp target map(this[a]) 224 // OMP45-NEXT: #pragma omp target map(tofrom: this[a]) 225 a++; 226 // OMP45-NEXT: a++; 227 } 228 // OMP45-NEXT: } 229 }; 230 // OMP45-NEXT: }; 231 232 // OMP45-LABEL: int main(int argc, char **argv) { 233 int main (int argc, char **argv) { 234 int i, j, a[20], always, close; 235 // OMP45-NEXT: int i, j, a[20] 236 #pragma omp target 237 // OMP45-NEXT: #pragma omp target 238 foo(); 239 // OMP45-NEXT: foo(); 240 #pragma omp target if (argc > 0) 241 // OMP45-NEXT: #pragma omp target if(argc > 0) 242 foo(); 243 // OMP45-NEXT: foo(); 244 245 #pragma omp target map(i) if(argc>0) 246 // OMP45-NEXT: #pragma omp target map(tofrom: i) if(argc > 0) 247 foo(); 248 // OMP45-NEXT: foo(); 249 250 #pragma omp target map(i) 251 // OMP45-NEXT: #pragma omp target map(tofrom: i) 252 foo(); 253 // OMP45-NEXT: foo(); 254 255 #pragma omp target map(a[0:10], i) 256 // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i) 257 foo(); 258 // OMP45-NEXT: foo(); 259 260 #pragma omp target map(to: i) map(from: j) 261 // OMP45-NEXT: #pragma omp target map(to: i) map(from: j) 262 foo(); 263 // OMP45-NEXT: foo(); 264 265 #pragma omp target map(always,alloc: i) 266 // OMP45-NEXT: #pragma omp target map(always,alloc: i) 267 foo(); 268 // OMP45-NEXT: foo(); 269 270 #pragma omp target map(always from: i) 271 // OMP45-NEXT: #pragma omp target map(always,from: i) 272 foo(); 273 // OMP45-NEXT: foo(); 274 275 #pragma omp target map(always) 276 // OMP45-NEXT: #pragma omp target map(tofrom: always) 277 {always++;} 278 // OMP45-NEXT: { 279 // OMP45-NEXT: always++; 280 // OMP45-NEXT: } 281 282 #pragma omp target map(always,i) 283 // OMP45-NEXT: #pragma omp target map(tofrom: always,i) 284 {always++;i++;} 285 // OMP45-NEXT: { 286 // OMP45-NEXT: always++; 287 // OMP45-NEXT: i++; 288 // OMP45-NEXT: } 289 290 #pragma omp target map(close,alloc: i) 291 // OMP45-NEXT: #pragma omp target map(close,alloc: i) 292 foo(); 293 // OMP45-NEXT: foo(); 294 295 #pragma omp target map(close from: i) 296 // OMP45-NEXT: #pragma omp target map(close,from: i) 297 foo(); 298 // OMP45-NEXT: foo(); 299 300 #pragma omp target map(close) 301 // OMP45-NEXT: #pragma omp target map(tofrom: close) 302 {close++;} 303 // OMP45-NEXT: { 304 // OMP45-NEXT: close++; 305 // OMP45-NEXT: } 306 307 #pragma omp target map(close,i) 308 // OMP45-NEXT: #pragma omp target map(tofrom: close,i) 309 {close++;i++;} 310 // OMP45-NEXT: { 311 // OMP45-NEXT: close++; 312 // OMP45-NEXT: i++; 313 // OMP45-NEXT: } 314 315 #pragma omp target nowait 316 // OMP45-NEXT: #pragma omp target nowait 317 foo(); 318 // OMP45-NEXT: foo(); 319 320 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 321 // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 322 foo(); 323 // OMP45-NEXT: foo(); 324 325 #pragma omp target defaultmap(tofrom: scalar) 326 // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar) 327 foo(); 328 // OMP45-NEXT: foo(); 329 330 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 331 } 332 333 #endif 334 335 #ifdef OMP5 336 337 ///==========================================================================/// 338 // RUN: %clang_cc1 -DOMP5 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s --check-prefix OMP5 339 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 340 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix OMP5 341 342 // RUN: %clang_cc1 -DOMP5 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s --check-prefix OMP5 343 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s 344 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix OMP5 345 346 typedef void **omp_allocator_handle_t; 347 extern const omp_allocator_handle_t omp_null_allocator; 348 extern const omp_allocator_handle_t omp_default_mem_alloc; 349 extern const omp_allocator_handle_t omp_large_cap_mem_alloc; 350 extern const omp_allocator_handle_t omp_const_mem_alloc; 351 extern const omp_allocator_handle_t omp_high_bw_mem_alloc; 352 extern const omp_allocator_handle_t omp_low_lat_mem_alloc; 353 extern const omp_allocator_handle_t omp_cgroup_mem_alloc; 354 extern const omp_allocator_handle_t omp_pteam_mem_alloc; 355 extern const omp_allocator_handle_t omp_thread_mem_alloc; 356 357 void foo() {} 358 359 #pragma omp declare target 360 void bar() {} 361 #pragma omp end declare target 362 363 int a; 364 #pragma omp declare target link(a) 365 366 template <typename T, int C> 367 T tmain(T argc, T *argv) { 368 T i, j, a[20], always, close; 369 #pragma omp target device(argc) 370 foo(); 371 #pragma omp target if (target:argc > 0) device(device_num: C) 372 foo(); 373 #pragma omp target if (C) device(ancestor: argc) 374 foo(); 375 #pragma omp target map(i) 376 foo(); 377 #pragma omp target map(a[0:10], i) 378 foo(); 379 #pragma omp target map(to: i) map(from: j) 380 foo(); 381 #pragma omp target map(always,alloc: i) 382 foo(); 383 #pragma omp target map(always from: i) 384 foo(); 385 #pragma omp target map(always) 386 {always++;} 387 #pragma omp target map(always,i) 388 {always++;i++;} 389 #pragma omp target map(close,alloc: i) 390 foo(); 391 #pragma omp target map(close from: i) 392 foo(); 393 #pragma omp target map(close) 394 {close++;} 395 #pragma omp target map(close,i) 396 {close++;i++;} 397 #pragma omp target nowait 398 foo(); 399 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 400 foo(); 401 #pragma omp target defaultmap(alloc: scalar) 402 foo(); 403 #pragma omp target defaultmap(to: scalar) 404 foo(); 405 #pragma omp target defaultmap(from: scalar) 406 foo(); 407 #pragma omp target defaultmap(tofrom: scalar) 408 foo(); 409 #pragma omp target defaultmap(firstprivate: scalar) 410 foo(); 411 #pragma omp target defaultmap(none: scalar) 412 foo(); 413 #pragma omp target defaultmap(default: scalar) 414 foo(); 415 #pragma omp target defaultmap(alloc: aggregate) 416 foo(); 417 #pragma omp target defaultmap(to: aggregate) 418 foo(); 419 #pragma omp target defaultmap(from: aggregate) 420 foo(); 421 #pragma omp target defaultmap(tofrom: aggregate) 422 foo(); 423 #pragma omp target defaultmap(firstprivate: aggregate) 424 foo(); 425 #pragma omp target defaultmap(none: aggregate) 426 foo(); 427 #pragma omp target defaultmap(default: aggregate) 428 foo(); 429 #pragma omp target defaultmap(alloc: pointer) 430 foo(); 431 #pragma omp target defaultmap(to: pointer) 432 foo(); 433 #pragma omp target defaultmap(from: pointer) 434 foo(); 435 #pragma omp target defaultmap(tofrom: pointer) 436 foo(); 437 #pragma omp target defaultmap(firstprivate: pointer) 438 foo(); 439 #pragma omp target defaultmap(none: pointer) 440 foo(); 441 #pragma omp target defaultmap(default: pointer) 442 foo(); 443 #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 444 foo(); 445 #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 446 foo(); 447 #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 448 foo(); 449 #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 450 foo(); 451 #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 452 foo(); 453 454 int *g; 455 456 #pragma omp target is_device_ptr(g) defaultmap(none: pointer) 457 g++; 458 #pragma omp target private(g) defaultmap(none: pointer) 459 g++; 460 #pragma omp target firstprivate(g) defaultmap(none: pointer) 461 g++; 462 #pragma omp target defaultmap(none: scalar) map(to: i) 463 i++; 464 #pragma omp target defaultmap(none: aggregate) map(to: a) 465 a[3]++; 466 #pragma omp target defaultmap(none: scalar) 467 bar(); 468 469 return 0; 470 } 471 472 // OMP5: template <typename T, int C> T tmain(T argc, T *argv) { 473 // OMP5-NEXT: T i, j, a[20] 474 // OMP5-NEXT: #pragma omp target device(argc){{$}} 475 // OMP5-NEXT: foo(); 476 // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: C) 477 // OMP5-NEXT: foo() 478 // OMP5-NEXT: #pragma omp target if(C) device(ancestor: argc) 479 // OMP5-NEXT: foo() 480 // OMP5-NEXT: #pragma omp target map(tofrom: i) 481 // OMP5-NEXT: foo() 482 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) 483 // OMP5-NEXT: foo() 484 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) 485 // OMP5-NEXT: foo() 486 // OMP5-NEXT: #pragma omp target map(always,alloc: i) 487 // OMP5-NEXT: foo() 488 // OMP5-NEXT: #pragma omp target map(always,from: i) 489 // OMP5-NEXT: foo() 490 // OMP5-NEXT: #pragma omp target map(tofrom: always) 491 // OMP5-NEXT: { 492 // OMP5-NEXT: always++; 493 // OMP5-NEXT: } 494 // OMP5-NEXT: #pragma omp target map(tofrom: always,i) 495 // OMP5-NEXT: { 496 // OMP5-NEXT: always++; 497 // OMP5-NEXT: i++; 498 // OMP5-NEXT: } 499 // OMP5-NEXT: #pragma omp target map(close,alloc: i) 500 // OMP5-NEXT: foo() 501 // OMP5-NEXT: #pragma omp target map(close,from: i) 502 // OMP5-NEXT: foo() 503 // OMP5-NEXT: #pragma omp target map(tofrom: close) 504 // OMP5-NEXT: { 505 // OMP5-NEXT: close++; 506 // OMP5-NEXT: } 507 // OMP5-NEXT: #pragma omp target map(tofrom: close,i) 508 // OMP5-NEXT: { 509 // OMP5-NEXT: close++; 510 // OMP5-NEXT: i++; 511 // OMP5-NEXT: } 512 // OMP5-NEXT: #pragma omp target nowait 513 // OMP5-NEXT: foo() 514 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 515 // OMP5-NEXT: foo() 516 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) 517 // OMP5-NEXT: foo() 518 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) 519 // OMP5-NEXT: foo() 520 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) 521 // OMP5-NEXT: foo() 522 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) 523 // OMP5-NEXT: foo() 524 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) 525 // OMP5-NEXT: foo() 526 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 527 // OMP5-NEXT: foo() 528 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) 529 // OMP5-NEXT: foo() 530 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) 531 // OMP5-NEXT: foo() 532 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) 533 // OMP5-NEXT: foo() 534 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) 535 // OMP5-NEXT: foo() 536 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) 537 // OMP5-NEXT: foo() 538 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) 539 // OMP5-NEXT: foo() 540 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) 541 // OMP5-NEXT: foo() 542 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) 543 // OMP5-NEXT: foo() 544 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) 545 // OMP5-NEXT: foo() 546 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) 547 // OMP5-NEXT: foo() 548 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) 549 // OMP5-NEXT: foo() 550 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) 551 // OMP5-NEXT: foo() 552 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) 553 // OMP5-NEXT: foo() 554 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) 555 // OMP5-NEXT: foo() 556 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) 557 // OMP5-NEXT: foo() 558 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 559 // OMP5-NEXT: foo() 560 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 561 // OMP5-NEXT: foo() 562 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 563 // OMP5-NEXT: foo() 564 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 565 // OMP5-NEXT: foo() 566 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 567 // OMP5-NEXT: foo() 568 // OMP5: template<> int tmain<int, 5>(int argc, int *argv) { 569 // OMP5-NEXT: int i, j, a[20] 570 // OMP5-NEXT: #pragma omp target 571 // OMP5-NEXT: foo(); 572 // OMP5-NEXT: #pragma omp target if(target: argc > 0) 573 // OMP5-NEXT: foo() 574 // OMP5-NEXT: #pragma omp target if(5) 575 // OMP5-NEXT: foo() 576 // OMP5-NEXT: #pragma omp target map(tofrom: i) 577 // OMP5-NEXT: foo() 578 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) 579 // OMP5-NEXT: foo() 580 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) 581 // OMP5-NEXT: foo() 582 // OMP5-NEXT: #pragma omp target map(always,alloc: i) 583 // OMP5-NEXT: foo() 584 // OMP5-NEXT: #pragma omp target map(always,from: i) 585 // OMP5-NEXT: foo() 586 // OMP5-NEXT: #pragma omp target map(tofrom: always) 587 // OMP5-NEXT: { 588 // OMP5-NEXT: always++; 589 // OMP5-NEXT: } 590 // OMP5-NEXT: #pragma omp target map(tofrom: always,i) 591 // OMP5-NEXT: { 592 // OMP5-NEXT: always++; 593 // OMP5-NEXT: i++; 594 // OMP5-NEXT: } 595 // OMP5-NEXT: #pragma omp target map(close,alloc: i) 596 // OMP5-NEXT: foo() 597 // OMP5-NEXT: #pragma omp target map(close,from: i) 598 // OMP5-NEXT: foo() 599 // OMP5-NEXT: #pragma omp target map(tofrom: close) 600 // OMP5-NEXT: { 601 // OMP5-NEXT: close++; 602 // OMP5-NEXT: } 603 // OMP5-NEXT: #pragma omp target map(tofrom: close,i) 604 // OMP5-NEXT: { 605 // OMP5-NEXT: close++; 606 // OMP5-NEXT: i++; 607 // OMP5-NEXT: } 608 // OMP5-NEXT: #pragma omp target nowait 609 // OMP5-NEXT: foo() 610 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 611 // OMP5-NEXT: foo() 612 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) 613 // OMP5-NEXT: foo() 614 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) 615 // OMP5-NEXT: foo() 616 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) 617 // OMP5-NEXT: foo() 618 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) 619 // OMP5-NEXT: foo() 620 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) 621 // OMP5-NEXT: foo() 622 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 623 // OMP5-NEXT: foo() 624 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) 625 // OMP5-NEXT: foo() 626 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) 627 // OMP5-NEXT: foo() 628 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) 629 // OMP5-NEXT: foo() 630 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) 631 // OMP5-NEXT: foo() 632 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) 633 // OMP5-NEXT: foo() 634 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) 635 // OMP5-NEXT: foo() 636 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) 637 // OMP5-NEXT: foo() 638 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) 639 // OMP5-NEXT: foo() 640 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) 641 // OMP5-NEXT: foo() 642 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) 643 // OMP5-NEXT: foo() 644 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) 645 // OMP5-NEXT: foo() 646 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) 647 // OMP5-NEXT: foo() 648 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) 649 // OMP5-NEXT: foo() 650 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) 651 // OMP5-NEXT: foo() 652 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) 653 // OMP5-NEXT: foo() 654 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 655 // OMP5-NEXT: foo() 656 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 657 // OMP5-NEXT: foo() 658 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 659 // OMP5-NEXT: foo() 660 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 661 // OMP5-NEXT: foo() 662 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 663 // OMP5-NEXT: foo() 664 // OMP5: template<> char tmain<char, 1>(char argc, char *argv) { 665 // OMP5-NEXT: char i, j, a[20] 666 // OMP5-NEXT: #pragma omp target device(argc) 667 // OMP5-NEXT: foo(); 668 // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: 1) 669 // OMP5-NEXT: foo() 670 // OMP5-NEXT: #pragma omp target if(1) device(ancestor: argc) 671 // OMP5-NEXT: foo() 672 // OMP5-NEXT: #pragma omp target map(tofrom: i) 673 // OMP5-NEXT: foo() 674 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) 675 // OMP5-NEXT: foo() 676 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) 677 // OMP5-NEXT: foo() 678 // OMP5-NEXT: #pragma omp target map(always,alloc: i) 679 // OMP5-NEXT: foo() 680 // OMP5-NEXT: #pragma omp target map(always,from: i) 681 // OMP5-NEXT: foo() 682 // OMP5-NEXT: #pragma omp target map(tofrom: always) 683 // OMP5-NEXT: { 684 // OMP5-NEXT: always++; 685 // OMP5-NEXT: } 686 // OMP5-NEXT: #pragma omp target map(tofrom: always,i) 687 // OMP5-NEXT: { 688 // OMP5-NEXT: always++; 689 // OMP5-NEXT: i++; 690 // OMP5-NEXT: } 691 // OMP5-NEXT: #pragma omp target map(close,alloc: i) 692 // OMP5-NEXT: foo() 693 // OMP5-NEXT: #pragma omp target map(close,from: i) 694 // OMP5-NEXT: foo() 695 // OMP5-NEXT: #pragma omp target map(tofrom: close) 696 // OMP5-NEXT: { 697 // OMP5-NEXT: close++; 698 // OMP5-NEXT: } 699 // OMP5-NEXT: #pragma omp target map(tofrom: close,i) 700 // OMP5-NEXT: { 701 // OMP5-NEXT: close++; 702 // OMP5-NEXT: i++; 703 // OMP5-NEXT: } 704 // OMP5-NEXT: #pragma omp target nowait 705 // OMP5-NEXT: foo() 706 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 707 // OMP5-NEXT: foo() 708 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) 709 // OMP5-NEXT: foo() 710 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) 711 // OMP5-NEXT: foo() 712 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) 713 // OMP5-NEXT: foo() 714 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) 715 // OMP5-NEXT: foo() 716 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) 717 // OMP5-NEXT: foo() 718 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 719 // OMP5-NEXT: foo() 720 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) 721 // OMP5-NEXT: foo() 722 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) 723 // OMP5-NEXT: foo() 724 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) 725 // OMP5-NEXT: foo() 726 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) 727 // OMP5-NEXT: foo() 728 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) 729 // OMP5-NEXT: foo() 730 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) 731 // OMP5-NEXT: foo() 732 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) 733 // OMP5-NEXT: foo() 734 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) 735 // OMP5-NEXT: foo() 736 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) 737 // OMP5-NEXT: foo() 738 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) 739 // OMP5-NEXT: foo() 740 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) 741 // OMP5-NEXT: foo() 742 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) 743 // OMP5-NEXT: foo() 744 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) 745 // OMP5-NEXT: foo() 746 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) 747 // OMP5-NEXT: foo() 748 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) 749 // OMP5-NEXT: foo() 750 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 751 // OMP5-NEXT: foo() 752 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 753 // OMP5-NEXT: foo() 754 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 755 // OMP5-NEXT: foo() 756 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 757 // OMP5-NEXT: foo() 758 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 759 // OMP5-NEXT: foo() 760 // OMP5-NEXT: int *g; 761 // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer) 762 // OMP5-NEXT: g++; 763 // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer) 764 // OMP5-NEXT: g++; 765 // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer) 766 // OMP5-NEXT: g++; 767 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i) 768 // OMP5-NEXT: i++; 769 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a) 770 // OMP5-NEXT: a[3]++; 771 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 772 // OMP5-NEXT: bar(); 773 774 // OMP5-LABEL: class S { 775 class S { 776 void foo() { 777 // OMP5-NEXT: void foo() { 778 int a = 0; 779 // OMP5-NEXT: int a = 0; 780 #pragma omp target map(this[0]) 781 // OMP5-NEXT: #pragma omp target map(tofrom: this[0]) 782 a++; 783 // OMP5-NEXT: a++; 784 #pragma omp target map(this[:1]) 785 // OMP5-NEXT: #pragma omp target map(tofrom: this[:1]) 786 a++; 787 // OMP5-NEXT: a++; 788 #pragma omp target map((this)[0]) 789 // OMP5-NEXT: #pragma omp target map(tofrom: (this)[0]) 790 a++; 791 // OMP5-NEXT: a++; 792 #pragma omp target map(this[:a]) 793 // OMP5-NEXT: #pragma omp target map(tofrom: this[:a]) 794 a++; 795 // OMP5-NEXT: a++; 796 #pragma omp target map(this[a:1]) 797 // OMP5-NEXT: #pragma omp target map(tofrom: this[a:1]) 798 a++; 799 // OMP5-NEXT: a++; 800 #pragma omp target map(this[a]) 801 // OMP5-NEXT: #pragma omp target map(tofrom: this[a]) 802 a++; 803 // OMP5-NEXT: a++; 804 } 805 // OMP5-NEXT: } 806 }; 807 // OMP5-NEXT: }; 808 809 // OMP5-LABEL: int main(int argc, char **argv) { 810 int main (int argc, char **argv) { 811 int i, j, a[20], always, close; 812 // OMP5-NEXT: int i, j, a[20] 813 #pragma omp target 814 // OMP5-NEXT: #pragma omp target 815 foo(); 816 // OMP5-NEXT: foo(); 817 #pragma omp target if (argc > 0) 818 // OMP5-NEXT: #pragma omp target if(argc > 0) 819 foo(); 820 // OMP5-NEXT: foo(); 821 822 #pragma omp target map(i) if(argc>0) 823 // OMP5-NEXT: #pragma omp target map(tofrom: i) if(argc > 0) 824 foo(); 825 // OMP5-NEXT: foo(); 826 827 #pragma omp target map(i) 828 // OMP5-NEXT: #pragma omp target map(tofrom: i) 829 foo(); 830 // OMP5-NEXT: foo(); 831 832 #pragma omp target map(a[0:10], i) 833 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) 834 foo(); 835 // OMP5-NEXT: foo(); 836 837 #pragma omp target map(to: i) map(from: j) 838 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) 839 foo(); 840 // OMP5-NEXT: foo(); 841 842 #pragma omp target map(always,alloc: i) 843 // OMP5-NEXT: #pragma omp target map(always,alloc: i) 844 foo(); 845 // OMP5-NEXT: foo(); 846 847 #pragma omp target map(always from: i) 848 // OMP5-NEXT: #pragma omp target map(always,from: i) 849 foo(); 850 // OMP5-NEXT: foo(); 851 852 #pragma omp target map(always) 853 // OMP5-NEXT: #pragma omp target map(tofrom: always) 854 {always++;} 855 // OMP5-NEXT: { 856 // OMP5-NEXT: always++; 857 // OMP5-NEXT: } 858 859 #pragma omp target map(always,i) 860 // OMP5-NEXT: #pragma omp target map(tofrom: always,i) 861 {always++;i++;} 862 // OMP5-NEXT: { 863 // OMP5-NEXT: always++; 864 // OMP5-NEXT: i++; 865 // OMP5-NEXT: } 866 867 #pragma omp target map(close,alloc: i) 868 // OMP5-NEXT: #pragma omp target map(close,alloc: i) 869 foo(); 870 // OMP5-NEXT: foo(); 871 872 #pragma omp target map(close from: i) 873 // OMP5-NEXT: #pragma omp target map(close,from: i) 874 foo(); 875 // OMP5-NEXT: foo(); 876 877 #pragma omp target map(close) 878 // OMP5-NEXT: #pragma omp target map(tofrom: close) 879 {close++;} 880 // OMP5-NEXT: { 881 // OMP5-NEXT: close++; 882 // OMP5-NEXT: } 883 884 #pragma omp target map(close,i) 885 // OMP5-NEXT: #pragma omp target map(tofrom: close,i) 886 {close++;i++;} 887 // OMP5-NEXT: { 888 // OMP5-NEXT: close++; 889 // OMP5-NEXT: i++; 890 // OMP5-NEXT: } 891 892 #pragma omp target nowait 893 // OMP5-NEXT: #pragma omp target nowait 894 foo(); 895 // OMP5-NEXT: foo(); 896 897 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 898 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 899 foo(); 900 // OMP5-NEXT: foo(); 901 902 #pragma omp target defaultmap(alloc: scalar) 903 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) 904 foo(); 905 // OMP5-NEXT: foo(); 906 907 #pragma omp target defaultmap(to: scalar) 908 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) 909 foo(); 910 // OMP5-NEXT: foo(); 911 912 #pragma omp target defaultmap(from: scalar) 913 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) 914 foo(); 915 // OMP5-NEXT: foo(); 916 917 #pragma omp target defaultmap(tofrom: scalar) 918 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) 919 foo(); 920 // OMP5-NEXT: foo(); 921 922 #pragma omp target defaultmap(firstprivate: scalar) 923 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) 924 foo(); 925 // OMP5-NEXT: foo(); 926 927 #pragma omp target defaultmap(none: scalar) 928 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 929 foo(); 930 // OMP5-NEXT: foo(); 931 932 #pragma omp target defaultmap(default: scalar) 933 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) 934 foo(); 935 // OMP5-NEXT: foo(); 936 937 #pragma omp target defaultmap(alloc: aggregate) 938 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) 939 foo(); 940 // OMP5-NEXT: foo(); 941 942 #pragma omp target defaultmap(to: aggregate) 943 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) 944 foo(); 945 // OMP5-NEXT: foo(); 946 947 #pragma omp target defaultmap(from: aggregate) 948 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) 949 foo(); 950 // OMP5-NEXT: foo(); 951 952 #pragma omp target defaultmap(tofrom: aggregate) 953 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) 954 foo(); 955 // OMP5-NEXT: foo(); 956 957 #pragma omp target defaultmap(firstprivate: aggregate) 958 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) 959 foo(); 960 // OMP5-NEXT: foo(); 961 962 #pragma omp target defaultmap(none: aggregate) 963 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) 964 foo(); 965 // OMP5-NEXT: foo(); 966 967 #pragma omp target defaultmap(default: aggregate) 968 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) 969 foo(); 970 // OMP5-NEXT: foo(); 971 972 #pragma omp target defaultmap(alloc: pointer) 973 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) 974 foo(); 975 // OMP5-NEXT: foo(); 976 977 #pragma omp target defaultmap(to: pointer) 978 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) 979 foo(); 980 // OMP5-NEXT: foo(); 981 982 #pragma omp target defaultmap(from: pointer) 983 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) 984 foo(); 985 // OMP5-NEXT: foo(); 986 987 #pragma omp target defaultmap(tofrom: pointer) 988 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) 989 foo(); 990 // OMP5-NEXT: foo(); 991 992 #pragma omp target defaultmap(firstprivate: pointer) 993 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) 994 foo(); 995 // OMP5-NEXT: foo(); 996 997 #pragma omp target defaultmap(none: pointer) 998 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) 999 foo(); 1000 // OMP5-NEXT: foo(); 1001 1002 #pragma omp target defaultmap(default: pointer) 1003 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) 1004 foo(); 1005 // OMP5-NEXT: foo(); 1006 1007 #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 1008 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 1009 foo(); 1010 // OMP5-NEXT: foo(); 1011 1012 #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 1013 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 1014 foo(); 1015 // OMP5-NEXT: foo(); 1016 1017 #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 1018 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 1019 foo(); 1020 // OMP5-NEXT: foo(); 1021 1022 #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 1023 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 1024 foo(); 1025 // OMP5-NEXT: foo(); 1026 1027 #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 1028 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 1029 foo(); 1030 // OMP5-NEXT: foo(); 1031 1032 int *g; 1033 // OMP5-NEXT: int *g; 1034 1035 #pragma omp target is_device_ptr(g) defaultmap(none: pointer) 1036 // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer) 1037 g++; 1038 // OMP5-NEXT: g++; 1039 1040 #pragma omp target private(g) defaultmap(none: pointer) 1041 // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer) 1042 g++; 1043 // OMP5-NEXT: g++; 1044 1045 #pragma omp target firstprivate(g) defaultmap(none: pointer) 1046 // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer) 1047 g++; 1048 // OMP5-NEXT: g++; 1049 1050 #pragma omp target defaultmap(none: scalar) map(to: i) 1051 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i) 1052 i++; 1053 // OMP5-NEXT: i++; 1054 1055 #pragma omp target defaultmap(none: aggregate) map(to: a) 1056 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a) 1057 a[3]++; 1058 // OMP5-NEXT: a[3]++; 1059 1060 #pragma omp target defaultmap(none: scalar) 1061 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 1062 bar(); 1063 // OMP5-NEXT: bar(); 1064 #pragma omp target defaultmap(none) 1065 // OMP5-NEXT: #pragma omp target defaultmap(none) 1066 // OMP5-NEXT: bar(); 1067 bar(); 1068 #pragma omp target allocate(omp_default_mem_alloc:argv) uses_allocators(omp_default_mem_alloc,omp_large_cap_mem_alloc) allocate(omp_large_cap_mem_alloc:argc) private(argc, argv) 1069 // OMP5-NEXT: #pragma omp target allocate(omp_default_mem_alloc: argv) uses_allocators(omp_default_mem_alloc,omp_large_cap_mem_alloc) allocate(omp_large_cap_mem_alloc: argc) private(argc,argv) 1070 // OMP5-NEXT: bar(); 1071 bar(); 1072 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 1073 } 1074 1075 #endif //OMP5 1076 1077 #ifdef OMP51 1078 1079 ///==========================================================================/// 1080 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix OMP51 1081 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s 1082 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix OMP51 1083 1084 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix OMP51 1085 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s 1086 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix OMP51 1087 1088 void foo() {} 1089 1090 template <typename T, int C> 1091 T tmain(T argc, T *argv) { 1092 #pragma omp target defaultmap(present: scalar) 1093 foo(); 1094 #pragma omp target defaultmap(present: aggregate) 1095 foo(); 1096 #pragma omp target defaultmap(present: pointer) 1097 foo(); 1098 1099 return 0; 1100 } 1101 1102 // OMP51: template <typename T, int C> T tmain(T argc, T *argv) { 1103 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar) 1104 // OMP51-NEXT: foo() 1105 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate) 1106 // OMP51-NEXT: foo() 1107 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer) 1108 // OMP51-NEXT: foo() 1109 1110 // OMP51-LABEL: int main(int argc, char **argv) { 1111 int main (int argc, char **argv) { 1112 #pragma omp target defaultmap(present: scalar) 1113 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar) 1114 foo(); 1115 // OMP51-NEXT: foo(); 1116 #pragma omp target defaultmap(present: aggregate) 1117 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate) 1118 foo(); 1119 // OMP51-NEXT: foo(); 1120 #pragma omp target defaultmap(present: pointer) 1121 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer) 1122 foo(); 1123 // OMP51-NEXT: foo(); 1124 1125 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 1126 } 1127 #endif // OMP51 1128 #endif 1129