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 // RUN: %clang_cc1 -DOMP5 -verify -fopenmp -fopenmp-version=99 -DOMP99 -ast-print %s | FileCheck %s --check-prefixes=OMP5,REV 347 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=99 -DOMP99 -x c++ -std=c++11 -emit-pch -o %t %s 348 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=99 -DOMP99 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefixes=OMP5,REV 349 350 // RUN: %clang_cc1 -DOMP5 -verify -fopenmp-simd -fopenmp-version=99 -DOMP99 -ast-print %s | FileCheck %s --check-prefixes=OMP5,REV 351 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=99 -DOMP99 -x c++ -std=c++11 -emit-pch -o %t %s 352 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=99 -DOMP99 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefixes=OMP5,REV 353 354 #ifdef OMP99 355 #pragma omp requires reverse_offload 356 #endif 357 typedef void **omp_allocator_handle_t; 358 extern const omp_allocator_handle_t omp_null_allocator; 359 extern const omp_allocator_handle_t omp_default_mem_alloc; 360 extern const omp_allocator_handle_t omp_large_cap_mem_alloc; 361 extern const omp_allocator_handle_t omp_const_mem_alloc; 362 extern const omp_allocator_handle_t omp_high_bw_mem_alloc; 363 extern const omp_allocator_handle_t omp_low_lat_mem_alloc; 364 extern const omp_allocator_handle_t omp_cgroup_mem_alloc; 365 extern const omp_allocator_handle_t omp_pteam_mem_alloc; 366 extern const omp_allocator_handle_t omp_thread_mem_alloc; 367 368 void foo() {} 369 370 #pragma omp declare target 371 void bar() {} 372 #pragma omp end declare target 373 374 int a; 375 #pragma omp declare target link(a) 376 377 template <typename T, int C> 378 T tmain(T argc, T *argv) { 379 T i, j, a[20], always, close; 380 #pragma omp target device(argc) 381 foo(); 382 #pragma omp target if (target:argc > 0) device(device_num: C) 383 foo(); 384 #ifdef OMP99 385 #pragma omp target if (C) device(ancestor: argc) 386 foo(); 387 #endif 388 #pragma omp target map(i) 389 foo(); 390 #pragma omp target map(a[0:10], i) 391 foo(); 392 #pragma omp target map(to: i) map(from: j) 393 foo(); 394 #pragma omp target map(always,alloc: i) 395 foo(); 396 #pragma omp target map(always from: i) 397 foo(); 398 #pragma omp target map(always) 399 {always++;} 400 #pragma omp target map(always,i) 401 {always++;i++;} 402 #pragma omp target map(close,alloc: i) 403 foo(); 404 #pragma omp target map(close from: i) 405 foo(); 406 #pragma omp target map(close) 407 {close++;} 408 #pragma omp target map(close,i) 409 {close++;i++;} 410 #pragma omp target nowait 411 foo(); 412 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 413 foo(); 414 #pragma omp target defaultmap(alloc: scalar) 415 foo(); 416 #pragma omp target defaultmap(to: scalar) 417 foo(); 418 #pragma omp target defaultmap(from: scalar) 419 foo(); 420 #pragma omp target defaultmap(tofrom: scalar) 421 foo(); 422 #pragma omp target defaultmap(firstprivate: scalar) 423 foo(); 424 #pragma omp target defaultmap(none: scalar) 425 foo(); 426 #pragma omp target defaultmap(default: scalar) 427 foo(); 428 #pragma omp target defaultmap(alloc: aggregate) 429 foo(); 430 #pragma omp target defaultmap(to: aggregate) 431 foo(); 432 #pragma omp target defaultmap(from: aggregate) 433 foo(); 434 #pragma omp target defaultmap(tofrom: aggregate) 435 foo(); 436 #pragma omp target defaultmap(firstprivate: aggregate) 437 foo(); 438 #pragma omp target defaultmap(none: aggregate) 439 foo(); 440 #pragma omp target defaultmap(default: aggregate) 441 foo(); 442 #pragma omp target defaultmap(alloc: pointer) 443 foo(); 444 #pragma omp target defaultmap(to: pointer) 445 foo(); 446 #pragma omp target defaultmap(from: pointer) 447 foo(); 448 #pragma omp target defaultmap(tofrom: pointer) 449 foo(); 450 #pragma omp target defaultmap(firstprivate: pointer) 451 foo(); 452 #pragma omp target defaultmap(none: pointer) 453 foo(); 454 #pragma omp target defaultmap(default: pointer) 455 foo(); 456 #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 457 foo(); 458 #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 459 foo(); 460 #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 461 foo(); 462 #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 463 foo(); 464 #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 465 foo(); 466 467 int *g; 468 469 #pragma omp target is_device_ptr(g) defaultmap(none: pointer) 470 g++; 471 #pragma omp target private(g) defaultmap(none: pointer) 472 g++; 473 #pragma omp target firstprivate(g) defaultmap(none: pointer) 474 g++; 475 #pragma omp target defaultmap(none: scalar) map(to: i) 476 i++; 477 #pragma omp target defaultmap(none: aggregate) map(to: a) 478 a[3]++; 479 #pragma omp target defaultmap(none: scalar) 480 bar(); 481 482 return 0; 483 } 484 485 // OMP5: template <typename T, int C> T tmain(T argc, T *argv) { 486 // OMP5-NEXT: T i, j, a[20] 487 // OMP5-NEXT: #pragma omp target device(argc){{$}} 488 // OMP5-NEXT: foo(); 489 // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: C) 490 // OMP5-NEXT: foo() 491 // REV: #pragma omp target if(C) device(ancestor: argc) 492 // REV-NEXT: foo() 493 // OMP5-NEXT: #pragma omp target map(tofrom: i) 494 // OMP5-NEXT: foo() 495 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) 496 // OMP5-NEXT: foo() 497 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) 498 // OMP5-NEXT: foo() 499 // OMP5-NEXT: #pragma omp target map(always,alloc: i) 500 // OMP5-NEXT: foo() 501 // OMP5-NEXT: #pragma omp target map(always,from: i) 502 // OMP5-NEXT: foo() 503 // OMP5-NEXT: #pragma omp target map(tofrom: always) 504 // OMP5-NEXT: { 505 // OMP5-NEXT: always++; 506 // OMP5-NEXT: } 507 // OMP5-NEXT: #pragma omp target map(tofrom: always,i) 508 // OMP5-NEXT: { 509 // OMP5-NEXT: always++; 510 // OMP5-NEXT: i++; 511 // OMP5-NEXT: } 512 // OMP5-NEXT: #pragma omp target map(close,alloc: i) 513 // OMP5-NEXT: foo() 514 // OMP5-NEXT: #pragma omp target map(close,from: i) 515 // OMP5-NEXT: foo() 516 // OMP5-NEXT: #pragma omp target map(tofrom: close) 517 // OMP5-NEXT: { 518 // OMP5-NEXT: close++; 519 // OMP5-NEXT: } 520 // OMP5-NEXT: #pragma omp target map(tofrom: close,i) 521 // OMP5-NEXT: { 522 // OMP5-NEXT: close++; 523 // OMP5-NEXT: i++; 524 // OMP5-NEXT: } 525 // OMP5-NEXT: #pragma omp target nowait 526 // OMP5-NEXT: foo() 527 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 528 // OMP5-NEXT: foo() 529 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) 530 // OMP5-NEXT: foo() 531 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) 532 // OMP5-NEXT: foo() 533 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) 534 // OMP5-NEXT: foo() 535 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) 536 // OMP5-NEXT: foo() 537 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) 538 // OMP5-NEXT: foo() 539 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 540 // OMP5-NEXT: foo() 541 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) 542 // OMP5-NEXT: foo() 543 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) 544 // OMP5-NEXT: foo() 545 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) 546 // OMP5-NEXT: foo() 547 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) 548 // OMP5-NEXT: foo() 549 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) 550 // OMP5-NEXT: foo() 551 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) 552 // OMP5-NEXT: foo() 553 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) 554 // OMP5-NEXT: foo() 555 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) 556 // OMP5-NEXT: foo() 557 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) 558 // OMP5-NEXT: foo() 559 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) 560 // OMP5-NEXT: foo() 561 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) 562 // OMP5-NEXT: foo() 563 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) 564 // OMP5-NEXT: foo() 565 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) 566 // OMP5-NEXT: foo() 567 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) 568 // OMP5-NEXT: foo() 569 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) 570 // OMP5-NEXT: foo() 571 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 572 // OMP5-NEXT: foo() 573 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 574 // OMP5-NEXT: foo() 575 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 576 // OMP5-NEXT: foo() 577 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 578 // OMP5-NEXT: foo() 579 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 580 // OMP5-NEXT: foo() 581 // OMP5: template<> int tmain<int, 5>(int argc, int *argv) { 582 // OMP5-NEXT: int i, j, a[20] 583 // OMP5-NEXT: #pragma omp target 584 // OMP5-NEXT: foo(); 585 // OMP5-NEXT: #pragma omp target if(target: argc > 0) 586 // OMP5-NEXT: foo() 587 // REV: #pragma omp target if(5) 588 // REV-NEXT: foo() 589 // OMP5-NEXT: #pragma omp target map(tofrom: i) 590 // OMP5-NEXT: foo() 591 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) 592 // OMP5-NEXT: foo() 593 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) 594 // OMP5-NEXT: foo() 595 // OMP5-NEXT: #pragma omp target map(always,alloc: i) 596 // OMP5-NEXT: foo() 597 // OMP5-NEXT: #pragma omp target map(always,from: i) 598 // OMP5-NEXT: foo() 599 // OMP5-NEXT: #pragma omp target map(tofrom: always) 600 // OMP5-NEXT: { 601 // OMP5-NEXT: always++; 602 // OMP5-NEXT: } 603 // OMP5-NEXT: #pragma omp target map(tofrom: always,i) 604 // OMP5-NEXT: { 605 // OMP5-NEXT: always++; 606 // OMP5-NEXT: i++; 607 // OMP5-NEXT: } 608 // OMP5-NEXT: #pragma omp target map(close,alloc: i) 609 // OMP5-NEXT: foo() 610 // OMP5-NEXT: #pragma omp target map(close,from: i) 611 // OMP5-NEXT: foo() 612 // OMP5-NEXT: #pragma omp target map(tofrom: close) 613 // OMP5-NEXT: { 614 // OMP5-NEXT: close++; 615 // OMP5-NEXT: } 616 // OMP5-NEXT: #pragma omp target map(tofrom: close,i) 617 // OMP5-NEXT: { 618 // OMP5-NEXT: close++; 619 // OMP5-NEXT: i++; 620 // OMP5-NEXT: } 621 // OMP5-NEXT: #pragma omp target nowait 622 // OMP5-NEXT: foo() 623 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 624 // OMP5-NEXT: foo() 625 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) 626 // OMP5-NEXT: foo() 627 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) 628 // OMP5-NEXT: foo() 629 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) 630 // OMP5-NEXT: foo() 631 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) 632 // OMP5-NEXT: foo() 633 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) 634 // OMP5-NEXT: foo() 635 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 636 // OMP5-NEXT: foo() 637 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) 638 // OMP5-NEXT: foo() 639 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) 640 // OMP5-NEXT: foo() 641 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) 642 // OMP5-NEXT: foo() 643 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) 644 // OMP5-NEXT: foo() 645 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) 646 // OMP5-NEXT: foo() 647 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) 648 // OMP5-NEXT: foo() 649 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) 650 // OMP5-NEXT: foo() 651 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) 652 // OMP5-NEXT: foo() 653 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) 654 // OMP5-NEXT: foo() 655 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) 656 // OMP5-NEXT: foo() 657 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) 658 // OMP5-NEXT: foo() 659 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) 660 // OMP5-NEXT: foo() 661 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) 662 // OMP5-NEXT: foo() 663 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) 664 // OMP5-NEXT: foo() 665 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) 666 // OMP5-NEXT: foo() 667 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 668 // OMP5-NEXT: foo() 669 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 670 // OMP5-NEXT: foo() 671 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 672 // OMP5-NEXT: foo() 673 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 674 // OMP5-NEXT: foo() 675 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 676 // OMP5-NEXT: foo() 677 // OMP5: template<> char tmain<char, 1>(char argc, char *argv) { 678 // OMP5-NEXT: char i, j, a[20] 679 // OMP5-NEXT: #pragma omp target device(argc) 680 // OMP5-NEXT: foo(); 681 // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: 1) 682 // OMP5-NEXT: foo() 683 // REV: #pragma omp target if(1) device(ancestor: argc) 684 // REV-NEXT: foo() 685 // OMP5-NEXT: #pragma omp target map(tofrom: i) 686 // OMP5-NEXT: foo() 687 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) 688 // OMP5-NEXT: foo() 689 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) 690 // OMP5-NEXT: foo() 691 // OMP5-NEXT: #pragma omp target map(always,alloc: i) 692 // OMP5-NEXT: foo() 693 // OMP5-NEXT: #pragma omp target map(always,from: i) 694 // OMP5-NEXT: foo() 695 // OMP5-NEXT: #pragma omp target map(tofrom: always) 696 // OMP5-NEXT: { 697 // OMP5-NEXT: always++; 698 // OMP5-NEXT: } 699 // OMP5-NEXT: #pragma omp target map(tofrom: always,i) 700 // OMP5-NEXT: { 701 // OMP5-NEXT: always++; 702 // OMP5-NEXT: i++; 703 // OMP5-NEXT: } 704 // OMP5-NEXT: #pragma omp target map(close,alloc: i) 705 // OMP5-NEXT: foo() 706 // OMP5-NEXT: #pragma omp target map(close,from: i) 707 // OMP5-NEXT: foo() 708 // OMP5-NEXT: #pragma omp target map(tofrom: close) 709 // OMP5-NEXT: { 710 // OMP5-NEXT: close++; 711 // OMP5-NEXT: } 712 // OMP5-NEXT: #pragma omp target map(tofrom: close,i) 713 // OMP5-NEXT: { 714 // OMP5-NEXT: close++; 715 // OMP5-NEXT: i++; 716 // OMP5-NEXT: } 717 // OMP5-NEXT: #pragma omp target nowait 718 // OMP5-NEXT: foo() 719 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 720 // OMP5-NEXT: foo() 721 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) 722 // OMP5-NEXT: foo() 723 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) 724 // OMP5-NEXT: foo() 725 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) 726 // OMP5-NEXT: foo() 727 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) 728 // OMP5-NEXT: foo() 729 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) 730 // OMP5-NEXT: foo() 731 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 732 // OMP5-NEXT: foo() 733 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) 734 // OMP5-NEXT: foo() 735 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) 736 // OMP5-NEXT: foo() 737 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) 738 // OMP5-NEXT: foo() 739 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) 740 // OMP5-NEXT: foo() 741 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) 742 // OMP5-NEXT: foo() 743 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) 744 // OMP5-NEXT: foo() 745 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) 746 // OMP5-NEXT: foo() 747 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) 748 // OMP5-NEXT: foo() 749 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) 750 // OMP5-NEXT: foo() 751 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) 752 // OMP5-NEXT: foo() 753 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) 754 // OMP5-NEXT: foo() 755 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) 756 // OMP5-NEXT: foo() 757 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) 758 // OMP5-NEXT: foo() 759 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) 760 // OMP5-NEXT: foo() 761 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) 762 // OMP5-NEXT: foo() 763 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 764 // OMP5-NEXT: foo() 765 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 766 // OMP5-NEXT: foo() 767 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 768 // OMP5-NEXT: foo() 769 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 770 // OMP5-NEXT: foo() 771 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 772 // OMP5-NEXT: foo() 773 // OMP5-NEXT: int *g; 774 // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer) 775 // OMP5-NEXT: g++; 776 // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer) 777 // OMP5-NEXT: g++; 778 // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer) 779 // OMP5-NEXT: g++; 780 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i) 781 // OMP5-NEXT: i++; 782 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a) 783 // OMP5-NEXT: a[3]++; 784 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 785 // OMP5-NEXT: bar(); 786 787 // OMP5-LABEL: class S { 788 class S { 789 void foo() { 790 // OMP5-NEXT: void foo() { 791 int a = 0; 792 // OMP5-NEXT: int a = 0; 793 #pragma omp target map(this[0]) 794 // OMP5-NEXT: #pragma omp target map(tofrom: this[0]) 795 a++; 796 // OMP5-NEXT: a++; 797 #pragma omp target map(this[:1]) 798 // OMP5-NEXT: #pragma omp target map(tofrom: this[:1]) 799 a++; 800 // OMP5-NEXT: a++; 801 #pragma omp target map((this)[0]) 802 // OMP5-NEXT: #pragma omp target map(tofrom: (this)[0]) 803 a++; 804 // OMP5-NEXT: a++; 805 #pragma omp target map(this[:a]) 806 // OMP5-NEXT: #pragma omp target map(tofrom: this[:a]) 807 a++; 808 // OMP5-NEXT: a++; 809 #pragma omp target map(this[a:1]) 810 // OMP5-NEXT: #pragma omp target map(tofrom: this[a:1]) 811 a++; 812 // OMP5-NEXT: a++; 813 #pragma omp target map(this[a]) 814 // OMP5-NEXT: #pragma omp target map(tofrom: this[a]) 815 a++; 816 // OMP5-NEXT: a++; 817 } 818 // OMP5-NEXT: } 819 }; 820 // OMP5-NEXT: }; 821 822 // OMP5-LABEL: int main(int argc, char **argv) { 823 int main (int argc, char **argv) { 824 int i, j, a[20], always, close; 825 // OMP5-NEXT: int i, j, a[20] 826 #pragma omp target 827 // OMP5-NEXT: #pragma omp target 828 foo(); 829 // OMP5-NEXT: foo(); 830 #pragma omp target if (argc > 0) 831 // OMP5-NEXT: #pragma omp target if(argc > 0) 832 foo(); 833 // OMP5-NEXT: foo(); 834 835 #pragma omp target map(i) if(argc>0) 836 // OMP5-NEXT: #pragma omp target map(tofrom: i) if(argc > 0) 837 foo(); 838 // OMP5-NEXT: foo(); 839 840 #pragma omp target map(i) 841 // OMP5-NEXT: #pragma omp target map(tofrom: i) 842 foo(); 843 // OMP5-NEXT: foo(); 844 845 #pragma omp target map(a[0:10], i) 846 // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) 847 foo(); 848 // OMP5-NEXT: foo(); 849 850 #pragma omp target map(to: i) map(from: j) 851 // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) 852 foo(); 853 // OMP5-NEXT: foo(); 854 855 #pragma omp target map(always,alloc: i) 856 // OMP5-NEXT: #pragma omp target map(always,alloc: i) 857 foo(); 858 // OMP5-NEXT: foo(); 859 860 #pragma omp target map(always from: i) 861 // OMP5-NEXT: #pragma omp target map(always,from: i) 862 foo(); 863 // OMP5-NEXT: foo(); 864 865 #pragma omp target map(always) 866 // OMP5-NEXT: #pragma omp target map(tofrom: always) 867 {always++;} 868 // OMP5-NEXT: { 869 // OMP5-NEXT: always++; 870 // OMP5-NEXT: } 871 872 #pragma omp target map(always,i) 873 // OMP5-NEXT: #pragma omp target map(tofrom: always,i) 874 {always++;i++;} 875 // OMP5-NEXT: { 876 // OMP5-NEXT: always++; 877 // OMP5-NEXT: i++; 878 // OMP5-NEXT: } 879 880 #pragma omp target map(close,alloc: i) 881 // OMP5-NEXT: #pragma omp target map(close,alloc: i) 882 foo(); 883 // OMP5-NEXT: foo(); 884 885 #pragma omp target map(close from: i) 886 // OMP5-NEXT: #pragma omp target map(close,from: i) 887 foo(); 888 // OMP5-NEXT: foo(); 889 890 #pragma omp target map(close) 891 // OMP5-NEXT: #pragma omp target map(tofrom: close) 892 {close++;} 893 // OMP5-NEXT: { 894 // OMP5-NEXT: close++; 895 // OMP5-NEXT: } 896 897 #pragma omp target map(close,i) 898 // OMP5-NEXT: #pragma omp target map(tofrom: close,i) 899 {close++;i++;} 900 // OMP5-NEXT: { 901 // OMP5-NEXT: close++; 902 // OMP5-NEXT: i++; 903 // OMP5-NEXT: } 904 905 #pragma omp target nowait 906 // OMP5-NEXT: #pragma omp target nowait 907 foo(); 908 // OMP5-NEXT: foo(); 909 910 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 911 // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 912 foo(); 913 // OMP5-NEXT: foo(); 914 915 #pragma omp target defaultmap(alloc: scalar) 916 // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) 917 foo(); 918 // OMP5-NEXT: foo(); 919 920 #pragma omp target defaultmap(to: scalar) 921 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) 922 foo(); 923 // OMP5-NEXT: foo(); 924 925 #pragma omp target defaultmap(from: scalar) 926 // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) 927 foo(); 928 // OMP5-NEXT: foo(); 929 930 #pragma omp target defaultmap(tofrom: scalar) 931 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) 932 foo(); 933 // OMP5-NEXT: foo(); 934 935 #pragma omp target defaultmap(firstprivate: scalar) 936 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) 937 foo(); 938 // OMP5-NEXT: foo(); 939 940 #pragma omp target defaultmap(none: scalar) 941 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 942 foo(); 943 // OMP5-NEXT: foo(); 944 945 #pragma omp target defaultmap(default: scalar) 946 // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) 947 foo(); 948 // OMP5-NEXT: foo(); 949 950 #pragma omp target defaultmap(alloc: aggregate) 951 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) 952 foo(); 953 // OMP5-NEXT: foo(); 954 955 #pragma omp target defaultmap(to: aggregate) 956 // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) 957 foo(); 958 // OMP5-NEXT: foo(); 959 960 #pragma omp target defaultmap(from: aggregate) 961 // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) 962 foo(); 963 // OMP5-NEXT: foo(); 964 965 #pragma omp target defaultmap(tofrom: aggregate) 966 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) 967 foo(); 968 // OMP5-NEXT: foo(); 969 970 #pragma omp target defaultmap(firstprivate: aggregate) 971 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) 972 foo(); 973 // OMP5-NEXT: foo(); 974 975 #pragma omp target defaultmap(none: aggregate) 976 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) 977 foo(); 978 // OMP5-NEXT: foo(); 979 980 #pragma omp target defaultmap(default: aggregate) 981 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) 982 foo(); 983 // OMP5-NEXT: foo(); 984 985 #pragma omp target defaultmap(alloc: pointer) 986 // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) 987 foo(); 988 // OMP5-NEXT: foo(); 989 990 #pragma omp target defaultmap(to: pointer) 991 // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) 992 foo(); 993 // OMP5-NEXT: foo(); 994 995 #pragma omp target defaultmap(from: pointer) 996 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) 997 foo(); 998 // OMP5-NEXT: foo(); 999 1000 #pragma omp target defaultmap(tofrom: pointer) 1001 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) 1002 foo(); 1003 // OMP5-NEXT: foo(); 1004 1005 #pragma omp target defaultmap(firstprivate: pointer) 1006 // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) 1007 foo(); 1008 // OMP5-NEXT: foo(); 1009 1010 #pragma omp target defaultmap(none: pointer) 1011 // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) 1012 foo(); 1013 // OMP5-NEXT: foo(); 1014 1015 #pragma omp target defaultmap(default: pointer) 1016 // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) 1017 foo(); 1018 // OMP5-NEXT: foo(); 1019 1020 #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 1021 // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) 1022 foo(); 1023 // OMP5-NEXT: foo(); 1024 1025 #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 1026 // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) 1027 foo(); 1028 // OMP5-NEXT: foo(); 1029 1030 #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 1031 // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) 1032 foo(); 1033 // OMP5-NEXT: foo(); 1034 1035 #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 1036 // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) 1037 foo(); 1038 // OMP5-NEXT: foo(); 1039 1040 #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 1041 // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) 1042 foo(); 1043 // OMP5-NEXT: foo(); 1044 1045 int *g; 1046 // OMP5-NEXT: int *g; 1047 1048 #pragma omp target is_device_ptr(g) defaultmap(none: pointer) 1049 // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer) 1050 g++; 1051 // OMP5-NEXT: g++; 1052 1053 #pragma omp target private(g) defaultmap(none: pointer) 1054 // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer) 1055 g++; 1056 // OMP5-NEXT: g++; 1057 1058 #pragma omp target firstprivate(g) defaultmap(none: pointer) 1059 // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer) 1060 g++; 1061 // OMP5-NEXT: g++; 1062 1063 #pragma omp target defaultmap(none: scalar) map(to: i) 1064 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i) 1065 i++; 1066 // OMP5-NEXT: i++; 1067 1068 #pragma omp target defaultmap(none: aggregate) map(to: a) 1069 // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a) 1070 a[3]++; 1071 // OMP5-NEXT: a[3]++; 1072 1073 #pragma omp target defaultmap(none: scalar) 1074 // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) 1075 bar(); 1076 // OMP5-NEXT: bar(); 1077 #pragma omp target defaultmap(none) 1078 // OMP5-NEXT: #pragma omp target defaultmap(none) 1079 // OMP5-NEXT: bar(); 1080 bar(); 1081 #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) 1082 // 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) 1083 // OMP5-NEXT: bar(); 1084 bar(); 1085 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 1086 } 1087 1088 #endif //OMP5 1089 1090 #ifdef OMP51 1091 1092 ///==========================================================================/// 1093 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix OMP51 1094 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s 1095 // 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 1096 1097 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix OMP51 1098 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s 1099 // 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 1100 1101 void foo() {} 1102 1103 template <typename T, int C> 1104 T tmain(T argc, T *argv) { 1105 #pragma omp target defaultmap(present: scalar) 1106 foo(); 1107 #pragma omp target defaultmap(present: aggregate) 1108 foo(); 1109 #pragma omp target defaultmap(present: pointer) 1110 foo(); 1111 1112 return 0; 1113 } 1114 1115 // OMP51: template <typename T, int C> T tmain(T argc, T *argv) { 1116 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar) 1117 // OMP51-NEXT: foo() 1118 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate) 1119 // OMP51-NEXT: foo() 1120 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer) 1121 // OMP51-NEXT: foo() 1122 1123 // OMP51-LABEL: int main(int argc, char **argv) { 1124 int main (int argc, char **argv) { 1125 #pragma omp target defaultmap(present: scalar) 1126 // OMP51-NEXT: #pragma omp target defaultmap(present: scalar) 1127 foo(); 1128 // OMP51-NEXT: foo(); 1129 #pragma omp target defaultmap(present: aggregate) 1130 // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate) 1131 foo(); 1132 // OMP51-NEXT: foo(); 1133 #pragma omp target defaultmap(present: pointer) 1134 // OMP51-NEXT: #pragma omp target defaultmap(present: pointer) 1135 foo(); 1136 // OMP51-NEXT: foo(); 1137 1138 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 1139 } 1140 #endif // OMP51 1141 1142 #ifdef OMPX 1143 1144 // RUN: %clang_cc1 -DOMPX -verify -fopenmp -fopenmp-extensions -ast-print %s | FileCheck %s --check-prefix=OMPX 1145 // RUN: %clang_cc1 -DOMPX -fopenmp -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s 1146 // RUN: %clang_cc1 -DOMPX -fopenmp -fopenmp-extensions -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=OMPX 1147 1148 // RUN: %clang_cc1 -DOMPX -verify -fopenmp-simd -fopenmp-extensions -ast-print %s | FileCheck %s --check-prefix=OMPX 1149 // RUN: %clang_cc1 -DOMPX -fopenmp-simd -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s 1150 // RUN: %clang_cc1 -DOMPX -fopenmp-simd -fopenmp-extensions -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s --check-prefix=OMPX 1151 1152 void foo() {} 1153 1154 template <typename T, int C> 1155 T tmain(T argc, T *argv) { 1156 T i, ompx_hold; 1157 #pragma omp target map(ompx_hold,alloc: i) 1158 foo(); 1159 #pragma omp target map(ompx_hold from: i) 1160 foo(); 1161 #pragma omp target map(ompx_hold) 1162 {ompx_hold++;} 1163 #pragma omp target map(ompx_hold,i) 1164 {ompx_hold++;i++;} 1165 return 0; 1166 } 1167 1168 // OMPX: template <typename T, int C> T tmain(T argc, T *argv) { 1169 // OMPX-NEXT: T i, ompx_hold; 1170 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: i) 1171 // OMPX-NEXT: foo() 1172 // OMPX-NEXT: #pragma omp target map(ompx_hold,from: i) 1173 // OMPX-NEXT: foo() 1174 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold) 1175 // OMPX-NEXT: { 1176 // OMPX-NEXT: ompx_hold++; 1177 // OMPX-NEXT: } 1178 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold,i) 1179 // OMPX-NEXT: { 1180 // OMPX-NEXT: ompx_hold++; 1181 // OMPX-NEXT: i++; 1182 // OMPX-NEXT: } 1183 1184 // OMPX-LABEL: int main(int argc, char **argv) { 1185 // OMPX-NEXT: int i, ompx_hold; 1186 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: i) 1187 // OMPX-NEXT: foo(); 1188 // OMPX-NEXT: #pragma omp target map(ompx_hold,from: i) 1189 // OMPX-NEXT: foo(); 1190 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold) 1191 // OMPX-NEXT: { 1192 // OMPX-NEXT: ompx_hold++; 1193 // OMPX-NEXT: } 1194 // OMPX-NEXT: #pragma omp target map(tofrom: ompx_hold,i) 1195 // OMPX-NEXT: { 1196 // OMPX-NEXT: ompx_hold++; 1197 // OMPX-NEXT: i++; 1198 // OMPX-NEXT: } 1199 int main (int argc, char **argv) { 1200 int i, ompx_hold; 1201 #pragma omp target map(ompx_hold,alloc: i) 1202 foo(); 1203 #pragma omp target map(ompx_hold from: i) 1204 foo(); 1205 #pragma omp target map(ompx_hold) 1206 {ompx_hold++;} 1207 #pragma omp target map(ompx_hold,i) 1208 {ompx_hold++;i++;} 1209 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 1210 } 1211 1212 #endif 1213 #endif 1214