// expected-no-diagnostics #ifndef HEADER #define HEADER // RUN: %clang_cc1 -DOMP45 -verify -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s --check-prefix=OMP45 // RUN: %clang_cc1 -DOMP45 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s // 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 // RUN: %clang_cc1 -DOMP45 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s | FileCheck %s --check-prefix=OMP45 // RUN: %clang_cc1 -DOMP45 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s // 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 #ifdef OMP45 void foo() {} template T tmain(T argc, T *argv) { T i, j, a[20], always, close; #pragma omp target foo(); #pragma omp target if (target:argc > 0) foo(); #pragma omp target if (C) foo(); #pragma omp target map(i) foo(); #pragma omp target map(a[0:10], i) foo(); #pragma omp target map(to: i) map(from: j) foo(); #pragma omp target map(always,alloc: i) foo(); #pragma omp target map(always from: i) foo(); #pragma omp target map(always) {always++;} #pragma omp target map(always,i) {always++;i++;} #pragma omp target map(close,alloc: i) foo(); #pragma omp target map(close from: i) foo(); #pragma omp target map(close) {close++;} #pragma omp target map(close,i) {close++;i++;} #pragma omp target nowait foo(); #pragma omp target depend(in : argc, argv[i:argc], a[:]) foo(); #pragma omp target defaultmap(tofrom: scalar) foo(); return 0; } // OMP45: template T tmain(T argc, T *argv) { // OMP45-NEXT: T i, j, a[20] // OMP45-NEXT: #pragma omp target{{$}} // OMP45-NEXT: foo(); // OMP45-NEXT: #pragma omp target if(target: argc > 0) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target if(C) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(to: i) map(from: j) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(always,alloc: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(always,from: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: always) // OMP45-NEXT: { // OMP45-NEXT: always++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(tofrom: always,i) // OMP45-NEXT: { // OMP45-NEXT: always++; // OMP45-NEXT: i++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(close,alloc: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(close,from: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: close) // OMP45-NEXT: { // OMP45-NEXT: close++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(tofrom: close,i) // OMP45-NEXT: { // OMP45-NEXT: close++; // OMP45-NEXT: i++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target nowait // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar) // OMP45-NEXT: foo() // OMP45: template<> int tmain(int argc, int *argv) { // OMP45-NEXT: int i, j, a[20] // OMP45-NEXT: #pragma omp target // OMP45-NEXT: foo(); // OMP45-NEXT: #pragma omp target if(target: argc > 0) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target if(5) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(to: i) map(from: j) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(always,alloc: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(always,from: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: always) // OMP45-NEXT: { // OMP45-NEXT: always++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(tofrom: always,i) // OMP45-NEXT: { // OMP45-NEXT: always++; // OMP45-NEXT: i++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(close,alloc: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(close,from: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: close) // OMP45-NEXT: { // OMP45-NEXT: close++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(tofrom: close,i) // OMP45-NEXT: { // OMP45-NEXT: close++; // OMP45-NEXT: i++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target nowait // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar) // OMP45-NEXT: foo() // OMP45: template<> char tmain(char argc, char *argv) { // OMP45-NEXT: char i, j, a[20] // OMP45-NEXT: #pragma omp target // OMP45-NEXT: foo(); // OMP45-NEXT: #pragma omp target if(target: argc > 0) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target if(1) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(to: i) map(from: j) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(always,alloc: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(always,from: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: always) // OMP45-NEXT: { // OMP45-NEXT: always++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(tofrom: always,i) // OMP45-NEXT: { // OMP45-NEXT: always++; // OMP45-NEXT: i++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(close,alloc: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(close,from: i) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target map(tofrom: close) // OMP45-NEXT: { // OMP45-NEXT: close++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target map(tofrom: close,i) // OMP45-NEXT: { // OMP45-NEXT: close++; // OMP45-NEXT: i++; // OMP45-NEXT: } // OMP45-NEXT: #pragma omp target nowait // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) // OMP45-NEXT: foo() // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar) // OMP45-NEXT: foo() // OMP45-LABEL: class S { class S { void foo() { // OMP45-NEXT: void foo() { int a = 0; // OMP45-NEXT: int a = 0; #pragma omp target map(this[0]) // OMP45-NEXT: #pragma omp target map(tofrom: this[0]) a++; // OMP45-NEXT: a++; #pragma omp target map(this[:1]) // OMP45-NEXT: #pragma omp target map(tofrom: this[:1]) a++; // OMP45-NEXT: a++; #pragma omp target map((this)[0]) // OMP45-NEXT: #pragma omp target map(tofrom: (this)[0]) a++; // OMP45-NEXT: a++; #pragma omp target map(this[:a]) // OMP45-NEXT: #pragma omp target map(tofrom: this[:a]) a++; // OMP45-NEXT: a++; #pragma omp target map(this[a:1]) // OMP45-NEXT: #pragma omp target map(tofrom: this[a:1]) a++; // OMP45-NEXT: a++; #pragma omp target map(this[a]) // OMP45-NEXT: #pragma omp target map(tofrom: this[a]) a++; // OMP45-NEXT: a++; } // OMP45-NEXT: } }; // OMP45-NEXT: }; // OMP45-LABEL: int main(int argc, char **argv) { int main (int argc, char **argv) { int i, j, a[20], always, close; // OMP45-NEXT: int i, j, a[20] #pragma omp target // OMP45-NEXT: #pragma omp target foo(); // OMP45-NEXT: foo(); #pragma omp target if (argc > 0) // OMP45-NEXT: #pragma omp target if(argc > 0) foo(); // OMP45-NEXT: foo(); #pragma omp target map(i) if(argc>0) // OMP45-NEXT: #pragma omp target map(tofrom: i) if(argc > 0) foo(); // OMP45-NEXT: foo(); #pragma omp target map(i) // OMP45-NEXT: #pragma omp target map(tofrom: i) foo(); // OMP45-NEXT: foo(); #pragma omp target map(a[0:10], i) // OMP45-NEXT: #pragma omp target map(tofrom: a[0:10],i) foo(); // OMP45-NEXT: foo(); #pragma omp target map(to: i) map(from: j) // OMP45-NEXT: #pragma omp target map(to: i) map(from: j) foo(); // OMP45-NEXT: foo(); #pragma omp target map(always,alloc: i) // OMP45-NEXT: #pragma omp target map(always,alloc: i) foo(); // OMP45-NEXT: foo(); #pragma omp target map(always from: i) // OMP45-NEXT: #pragma omp target map(always,from: i) foo(); // OMP45-NEXT: foo(); #pragma omp target map(always) // OMP45-NEXT: #pragma omp target map(tofrom: always) {always++;} // OMP45-NEXT: { // OMP45-NEXT: always++; // OMP45-NEXT: } #pragma omp target map(always,i) // OMP45-NEXT: #pragma omp target map(tofrom: always,i) {always++;i++;} // OMP45-NEXT: { // OMP45-NEXT: always++; // OMP45-NEXT: i++; // OMP45-NEXT: } #pragma omp target map(close,alloc: i) // OMP45-NEXT: #pragma omp target map(close,alloc: i) foo(); // OMP45-NEXT: foo(); #pragma omp target map(close from: i) // OMP45-NEXT: #pragma omp target map(close,from: i) foo(); // OMP45-NEXT: foo(); #pragma omp target map(close) // OMP45-NEXT: #pragma omp target map(tofrom: close) {close++;} // OMP45-NEXT: { // OMP45-NEXT: close++; // OMP45-NEXT: } #pragma omp target map(close,i) // OMP45-NEXT: #pragma omp target map(tofrom: close,i) {close++;i++;} // OMP45-NEXT: { // OMP45-NEXT: close++; // OMP45-NEXT: i++; // OMP45-NEXT: } #pragma omp target nowait // OMP45-NEXT: #pragma omp target nowait foo(); // OMP45-NEXT: foo(); #pragma omp target depend(in : argc, argv[i:argc], a[:]) // OMP45-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) foo(); // OMP45-NEXT: foo(); #pragma omp target defaultmap(tofrom: scalar) // OMP45-NEXT: #pragma omp target defaultmap(tofrom: scalar) foo(); // OMP45-NEXT: foo(); return tmain(argc, &argc) + tmain(argv[0][0], argv[0]); } #endif #ifdef OMP5 ///==========================================================================/// // RUN: %clang_cc1 -DOMP5 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s --check-prefix OMP5 // RUN: %clang_cc1 -DOMP5 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s // 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 // RUN: %clang_cc1 -DOMP5 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s --check-prefix OMP5 // RUN: %clang_cc1 -DOMP5 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s // 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 typedef void **omp_allocator_handle_t; extern const omp_allocator_handle_t omp_null_allocator; extern const omp_allocator_handle_t omp_default_mem_alloc; extern const omp_allocator_handle_t omp_large_cap_mem_alloc; extern const omp_allocator_handle_t omp_const_mem_alloc; extern const omp_allocator_handle_t omp_high_bw_mem_alloc; extern const omp_allocator_handle_t omp_low_lat_mem_alloc; extern const omp_allocator_handle_t omp_cgroup_mem_alloc; extern const omp_allocator_handle_t omp_pteam_mem_alloc; extern const omp_allocator_handle_t omp_thread_mem_alloc; void foo() {} #pragma omp declare target void bar() {} #pragma omp end declare target int a; #pragma omp declare target link(a) template T tmain(T argc, T *argv) { T i, j, a[20], always, close; #pragma omp target device(argc) foo(); #pragma omp target if (target:argc > 0) device(device_num: C) foo(); #pragma omp target if (C) device(ancestor: argc) foo(); #pragma omp target map(i) foo(); #pragma omp target map(a[0:10], i) foo(); #pragma omp target map(to: i) map(from: j) foo(); #pragma omp target map(always,alloc: i) foo(); #pragma omp target map(always from: i) foo(); #pragma omp target map(always) {always++;} #pragma omp target map(always,i) {always++;i++;} #pragma omp target map(close,alloc: i) foo(); #pragma omp target map(close from: i) foo(); #pragma omp target map(close) {close++;} #pragma omp target map(close,i) {close++;i++;} #pragma omp target nowait foo(); #pragma omp target depend(in : argc, argv[i:argc], a[:]) foo(); #pragma omp target defaultmap(alloc: scalar) foo(); #pragma omp target defaultmap(to: scalar) foo(); #pragma omp target defaultmap(from: scalar) foo(); #pragma omp target defaultmap(tofrom: scalar) foo(); #pragma omp target defaultmap(firstprivate: scalar) foo(); #pragma omp target defaultmap(none: scalar) foo(); #pragma omp target defaultmap(default: scalar) foo(); #pragma omp target defaultmap(alloc: aggregate) foo(); #pragma omp target defaultmap(to: aggregate) foo(); #pragma omp target defaultmap(from: aggregate) foo(); #pragma omp target defaultmap(tofrom: aggregate) foo(); #pragma omp target defaultmap(firstprivate: aggregate) foo(); #pragma omp target defaultmap(none: aggregate) foo(); #pragma omp target defaultmap(default: aggregate) foo(); #pragma omp target defaultmap(alloc: pointer) foo(); #pragma omp target defaultmap(to: pointer) foo(); #pragma omp target defaultmap(from: pointer) foo(); #pragma omp target defaultmap(tofrom: pointer) foo(); #pragma omp target defaultmap(firstprivate: pointer) foo(); #pragma omp target defaultmap(none: pointer) foo(); #pragma omp target defaultmap(default: pointer) foo(); #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) foo(); #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) foo(); #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) foo(); #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) foo(); #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) foo(); int *g; #pragma omp target is_device_ptr(g) defaultmap(none: pointer) g++; #pragma omp target private(g) defaultmap(none: pointer) g++; #pragma omp target firstprivate(g) defaultmap(none: pointer) g++; #pragma omp target defaultmap(none: scalar) map(to: i) i++; #pragma omp target defaultmap(none: aggregate) map(to: a) a[3]++; #pragma omp target defaultmap(none: scalar) bar(); return 0; } // OMP5: template T tmain(T argc, T *argv) { // OMP5-NEXT: T i, j, a[20] // OMP5-NEXT: #pragma omp target device(argc){{$}} // OMP5-NEXT: foo(); // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: C) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target if(C) device(ancestor: argc) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(always,alloc: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(always,from: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: always) // OMP5-NEXT: { // OMP5-NEXT: always++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(tofrom: always,i) // OMP5-NEXT: { // OMP5-NEXT: always++; // OMP5-NEXT: i++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(close,alloc: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(close,from: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: close) // OMP5-NEXT: { // OMP5-NEXT: close++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(tofrom: close,i) // OMP5-NEXT: { // OMP5-NEXT: close++; // OMP5-NEXT: i++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target nowait // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5: template<> int tmain(int argc, int *argv) { // OMP5-NEXT: int i, j, a[20] // OMP5-NEXT: #pragma omp target // OMP5-NEXT: foo(); // OMP5-NEXT: #pragma omp target if(target: argc > 0) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target if(5) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(always,alloc: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(always,from: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: always) // OMP5-NEXT: { // OMP5-NEXT: always++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(tofrom: always,i) // OMP5-NEXT: { // OMP5-NEXT: always++; // OMP5-NEXT: i++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(close,alloc: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(close,from: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: close) // OMP5-NEXT: { // OMP5-NEXT: close++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(tofrom: close,i) // OMP5-NEXT: { // OMP5-NEXT: close++; // OMP5-NEXT: i++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target nowait // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5: template<> char tmain(char argc, char *argv) { // OMP5-NEXT: char i, j, a[20] // OMP5-NEXT: #pragma omp target device(argc) // OMP5-NEXT: foo(); // OMP5-NEXT: #pragma omp target if(target: argc > 0) device(device_num: 1) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target if(1) device(ancestor: argc) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(always,alloc: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(always,from: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: always) // OMP5-NEXT: { // OMP5-NEXT: always++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(tofrom: always,i) // OMP5-NEXT: { // OMP5-NEXT: always++; // OMP5-NEXT: i++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(close,alloc: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(close,from: i) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target map(tofrom: close) // OMP5-NEXT: { // OMP5-NEXT: close++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target map(tofrom: close,i) // OMP5-NEXT: { // OMP5-NEXT: close++; // OMP5-NEXT: i++; // OMP5-NEXT: } // OMP5-NEXT: #pragma omp target nowait // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) // OMP5-NEXT: foo() // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) // OMP5-NEXT: foo() // OMP5-NEXT: int *g; // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer) // OMP5-NEXT: g++; // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer) // OMP5-NEXT: g++; // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer) // OMP5-NEXT: g++; // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i) // OMP5-NEXT: i++; // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a) // OMP5-NEXT: a[3]++; // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) // OMP5-NEXT: bar(); // OMP5-LABEL: class S { class S { void foo() { // OMP5-NEXT: void foo() { int a = 0; // OMP5-NEXT: int a = 0; #pragma omp target map(this[0]) // OMP5-NEXT: #pragma omp target map(tofrom: this[0]) a++; // OMP5-NEXT: a++; #pragma omp target map(this[:1]) // OMP5-NEXT: #pragma omp target map(tofrom: this[:1]) a++; // OMP5-NEXT: a++; #pragma omp target map((this)[0]) // OMP5-NEXT: #pragma omp target map(tofrom: (this)[0]) a++; // OMP5-NEXT: a++; #pragma omp target map(this[:a]) // OMP5-NEXT: #pragma omp target map(tofrom: this[:a]) a++; // OMP5-NEXT: a++; #pragma omp target map(this[a:1]) // OMP5-NEXT: #pragma omp target map(tofrom: this[a:1]) a++; // OMP5-NEXT: a++; #pragma omp target map(this[a]) // OMP5-NEXT: #pragma omp target map(tofrom: this[a]) a++; // OMP5-NEXT: a++; } // OMP5-NEXT: } }; // OMP5-NEXT: }; // OMP5-LABEL: int main(int argc, char **argv) { int main (int argc, char **argv) { int i, j, a[20], always, close; // OMP5-NEXT: int i, j, a[20] #pragma omp target // OMP5-NEXT: #pragma omp target foo(); // OMP5-NEXT: foo(); #pragma omp target if (argc > 0) // OMP5-NEXT: #pragma omp target if(argc > 0) foo(); // OMP5-NEXT: foo(); #pragma omp target map(i) if(argc>0) // OMP5-NEXT: #pragma omp target map(tofrom: i) if(argc > 0) foo(); // OMP5-NEXT: foo(); #pragma omp target map(i) // OMP5-NEXT: #pragma omp target map(tofrom: i) foo(); // OMP5-NEXT: foo(); #pragma omp target map(a[0:10], i) // OMP5-NEXT: #pragma omp target map(tofrom: a[0:10],i) foo(); // OMP5-NEXT: foo(); #pragma omp target map(to: i) map(from: j) // OMP5-NEXT: #pragma omp target map(to: i) map(from: j) foo(); // OMP5-NEXT: foo(); #pragma omp target map(always,alloc: i) // OMP5-NEXT: #pragma omp target map(always,alloc: i) foo(); // OMP5-NEXT: foo(); #pragma omp target map(always from: i) // OMP5-NEXT: #pragma omp target map(always,from: i) foo(); // OMP5-NEXT: foo(); #pragma omp target map(always) // OMP5-NEXT: #pragma omp target map(tofrom: always) {always++;} // OMP5-NEXT: { // OMP5-NEXT: always++; // OMP5-NEXT: } #pragma omp target map(always,i) // OMP5-NEXT: #pragma omp target map(tofrom: always,i) {always++;i++;} // OMP5-NEXT: { // OMP5-NEXT: always++; // OMP5-NEXT: i++; // OMP5-NEXT: } #pragma omp target map(close,alloc: i) // OMP5-NEXT: #pragma omp target map(close,alloc: i) foo(); // OMP5-NEXT: foo(); #pragma omp target map(close from: i) // OMP5-NEXT: #pragma omp target map(close,from: i) foo(); // OMP5-NEXT: foo(); #pragma omp target map(close) // OMP5-NEXT: #pragma omp target map(tofrom: close) {close++;} // OMP5-NEXT: { // OMP5-NEXT: close++; // OMP5-NEXT: } #pragma omp target map(close,i) // OMP5-NEXT: #pragma omp target map(tofrom: close,i) {close++;i++;} // OMP5-NEXT: { // OMP5-NEXT: close++; // OMP5-NEXT: i++; // OMP5-NEXT: } #pragma omp target nowait // OMP5-NEXT: #pragma omp target nowait foo(); // OMP5-NEXT: foo(); #pragma omp target depend(in : argc, argv[i:argc], a[:]) // OMP5-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(alloc: scalar) // OMP5-NEXT: #pragma omp target defaultmap(alloc: scalar) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(to: scalar) // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(from: scalar) // OMP5-NEXT: #pragma omp target defaultmap(from: scalar) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(tofrom: scalar) // OMP5-NEXT: #pragma omp target defaultmap(tofrom: scalar) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(firstprivate: scalar) // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: scalar) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(none: scalar) // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(default: scalar) // OMP5-NEXT: #pragma omp target defaultmap(default: scalar) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(alloc: aggregate) // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(to: aggregate) // OMP5-NEXT: #pragma omp target defaultmap(to: aggregate) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(from: aggregate) // OMP5-NEXT: #pragma omp target defaultmap(from: aggregate) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(tofrom: aggregate) // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(firstprivate: aggregate) // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: aggregate) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(none: aggregate) // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(default: aggregate) // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(alloc: pointer) // OMP5-NEXT: #pragma omp target defaultmap(alloc: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(to: pointer) // OMP5-NEXT: #pragma omp target defaultmap(to: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(from: pointer) // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(tofrom: pointer) // OMP5-NEXT: #pragma omp target defaultmap(tofrom: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(firstprivate: pointer) // OMP5-NEXT: #pragma omp target defaultmap(firstprivate: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(none: pointer) // OMP5-NEXT: #pragma omp target defaultmap(none: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(default: pointer) // OMP5-NEXT: #pragma omp target defaultmap(default: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) // OMP5-NEXT: #pragma omp target defaultmap(to: scalar) defaultmap(tofrom: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) // OMP5-NEXT: #pragma omp target defaultmap(from: pointer) defaultmap(none: aggregate) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) // OMP5-NEXT: #pragma omp target defaultmap(default: aggregate) defaultmap(alloc: scalar) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) // OMP5-NEXT: #pragma omp target defaultmap(alloc: aggregate) defaultmap(firstprivate: scalar) defaultmap(tofrom: pointer) foo(); // OMP5-NEXT: foo(); #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) // OMP5-NEXT: #pragma omp target defaultmap(tofrom: aggregate) defaultmap(to: pointer) defaultmap(alloc: scalar) foo(); // OMP5-NEXT: foo(); int *g; // OMP5-NEXT: int *g; #pragma omp target is_device_ptr(g) defaultmap(none: pointer) // OMP5-NEXT: #pragma omp target is_device_ptr(g) defaultmap(none: pointer) g++; // OMP5-NEXT: g++; #pragma omp target private(g) defaultmap(none: pointer) // OMP5-NEXT: #pragma omp target private(g) defaultmap(none: pointer) g++; // OMP5-NEXT: g++; #pragma omp target firstprivate(g) defaultmap(none: pointer) // OMP5-NEXT: #pragma omp target firstprivate(g) defaultmap(none: pointer) g++; // OMP5-NEXT: g++; #pragma omp target defaultmap(none: scalar) map(to: i) // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) map(to: i) i++; // OMP5-NEXT: i++; #pragma omp target defaultmap(none: aggregate) map(to: a) // OMP5-NEXT: #pragma omp target defaultmap(none: aggregate) map(to: a) a[3]++; // OMP5-NEXT: a[3]++; #pragma omp target defaultmap(none: scalar) // OMP5-NEXT: #pragma omp target defaultmap(none: scalar) bar(); // OMP5-NEXT: bar(); #pragma omp target defaultmap(none) // OMP5-NEXT: #pragma omp target defaultmap(none) // OMP5-NEXT: bar(); bar(); #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) // 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) // OMP5-NEXT: bar(); bar(); return tmain(argc, &argc) + tmain(argv[0][0], argv[0]); } #endif //OMP5 #ifdef OMP51 ///==========================================================================/// // RUN: %clang_cc1 -DOMP51 -verify -fopenmp -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix OMP51 // RUN: %clang_cc1 -DOMP51 -fopenmp -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s // 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 // RUN: %clang_cc1 -DOMP51 -verify -fopenmp-simd -fopenmp-version=51 -ast-print %s | FileCheck %s --check-prefix OMP51 // RUN: %clang_cc1 -DOMP51 -fopenmp-simd -fopenmp-version=51 -x c++ -std=c++11 -emit-pch -o %t %s // 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 void foo() {} template T tmain(T argc, T *argv) { #pragma omp target defaultmap(present: scalar) foo(); #pragma omp target defaultmap(present: aggregate) foo(); #pragma omp target defaultmap(present: pointer) foo(); return 0; } // OMP51: template T tmain(T argc, T *argv) { // OMP51-NEXT: #pragma omp target defaultmap(present: scalar) // OMP51-NEXT: foo() // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate) // OMP51-NEXT: foo() // OMP51-NEXT: #pragma omp target defaultmap(present: pointer) // OMP51-NEXT: foo() // OMP51-LABEL: int main(int argc, char **argv) { int main (int argc, char **argv) { #pragma omp target defaultmap(present: scalar) // OMP51-NEXT: #pragma omp target defaultmap(present: scalar) foo(); // OMP51-NEXT: foo(); #pragma omp target defaultmap(present: aggregate) // OMP51-NEXT: #pragma omp target defaultmap(present: aggregate) foo(); // OMP51-NEXT: foo(); #pragma omp target defaultmap(present: pointer) // OMP51-NEXT: #pragma omp target defaultmap(present: pointer) foo(); // OMP51-NEXT: foo(); return tmain(argc, &argc) + tmain(argv[0][0], argv[0]); } #endif // OMP51 #endif