1 // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s 2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s 3 // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 4 5 // RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck %s 6 // RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s 7 // RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s 8 // expected-no-diagnostics 9 10 #ifndef HEADER 11 #define HEADER 12 13 // CHECK: namespace N1 { 14 namespace N1 15 { 16 // CHECK: class vec { 17 class vec { 18 public: 19 int len; 20 double *data; 21 }; 22 // CHECK: }; 23 24 // CHECK: class vecchild : public N1::vec { 25 class vecchild : public vec { 26 public: 27 int lenc; 28 }; 29 // CHECK: }; 30 31 #pragma omp declare mapper(id: vec v) map(v.len) 32 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len){{$}} 33 }; 34 // CHECK: } 35 // CHECK: ; 36 37 template <class T> 38 class dat { 39 public: 40 class datin { 41 public: 42 T in; 43 }; 44 int i; 45 T d; 46 #pragma omp declare mapper(id: N1::vec v) map(v.len) 47 #pragma omp declare mapper(id: datin v) map(v.in) 48 }; 49 50 // CHECK: template <class T> class dat { 51 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len){{$}} 52 // CHECK: #pragma omp declare mapper (id : dat::datin v) map(tofrom: v.in){{$}} 53 // CHECK: }; 54 // CHECK: template<> class dat<double> { 55 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len){{$}} 56 // CHECK: #pragma omp declare mapper (id : dat<double>::datin v) map(tofrom: v.in){{$}} 57 // CHECK: }; 58 59 #pragma omp declare mapper(default : N1::vec kk) map(kk.len) map(kk.data[0:2]) 60 // CHECK: #pragma omp declare mapper (default : N1::vec kk) map(tofrom: kk.len) map(tofrom: kk.data[0:2]){{$}} 61 #pragma omp declare mapper(dat<double> d) map(to: d.d) 62 // CHECK: #pragma omp declare mapper (default : dat<double> d) map(to: d.d){{$}} 63 64 template <typename T> 65 T foo(T a) { 66 struct foodatchild { 67 T k; 68 }; 69 struct foodat { 70 T a; 71 struct foodatchild b; 72 }; 73 #pragma omp declare mapper(id: struct foodat v) map(v.a) 74 #pragma omp declare mapper(idd: struct foodatchild v) map(v.k) 75 #pragma omp declare mapper(id: N1::vec v) map(v.len) 76 { 77 #pragma omp declare mapper(id: N1::vec v) map(v.len) 78 } 79 struct foodat fd; 80 #pragma omp target map(mapper(id) alloc: fd) 81 { fd.a++; } 82 #pragma omp target map(mapper(idd) alloc: fd.b) 83 { fd.b.k++; } 84 #pragma omp target update to(mapper(id): fd) 85 #pragma omp target update to(mapper(idd): fd.b) 86 #pragma omp target update from(mapper(id): fd) 87 #pragma omp target update from(mapper(idd): fd.b) 88 return 0; 89 } 90 91 // CHECK: template <typename T> T foo(T a) { 92 // CHECK: #pragma omp declare mapper (id : struct foodat v) map(tofrom: v.a) 93 // CHECK: #pragma omp declare mapper (idd : struct foodatchild v) map(tofrom: v.k) 94 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len) 95 // CHECK: { 96 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len) 97 // CHECK: } 98 // CHECK: #pragma omp target map(mapper(id),alloc: fd) 99 // CHECK: #pragma omp target map(mapper(idd),alloc: fd.b) 100 // CHECK: #pragma omp target update to(mapper(id): fd) 101 // CHECK: #pragma omp target update to(mapper(idd): fd.b) 102 // CHECK: #pragma omp target update from(mapper(id): fd) 103 // CHECK: #pragma omp target update from(mapper(idd): fd.b) 104 // CHECK: } 105 // CHECK: template<> int foo<int>(int a) { 106 // CHECK: #pragma omp declare mapper (id : struct foodat v) map(tofrom: v.a) 107 // CHECK: #pragma omp declare mapper (idd : struct foodatchild v) map(tofrom: v.k) 108 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len) 109 // CHECK: { 110 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len) 111 // CHECK: } 112 // CHECK: #pragma omp target map(mapper(id),alloc: fd) 113 // CHECK: #pragma omp target map(mapper(idd),alloc: fd.b) 114 // CHECK: #pragma omp target update to(mapper(id): fd) 115 // CHECK: #pragma omp target update to(mapper(idd): fd.b) 116 // CHECK: #pragma omp target update from(mapper(id): fd) 117 // CHECK: #pragma omp target update from(mapper(idd): fd.b) 118 // CHECK: } 119 120 // CHECK: int main() { 121 int main() { 122 N1::vec vv, vvv; 123 N1::vecchild vc; 124 dat<double> dd; 125 #pragma omp target map(mapper(N1::id) tofrom: vv) map(mapper(dat<double>::id) alloc: vvv) 126 // CHECK: #pragma omp target map(mapper(N1::id),tofrom: vv) map(mapper(dat<double>::id),alloc: vvv) 127 { vv.len++; } 128 #pragma omp target map(mapper(N1::id) tofrom: vc) 129 // CHECK: #pragma omp target map(mapper(N1::id),tofrom: vc) 130 { vc.len++; } 131 #pragma omp target map(mapper(default) tofrom: dd) 132 // CHECK: #pragma omp target map(mapper(default),tofrom: dd) 133 { dd.d++; } 134 135 #pragma omp target update to(mapper(N1::id) : vc) 136 // CHECK: #pragma omp target update to(mapper(N1::id): vc) 137 #pragma omp target update to(mapper(dat<double>::id): vvv) 138 // CHECK: #pragma omp target update to(mapper(dat<double>::id): vvv) 139 140 #pragma omp target update from(mapper(N1::id) : vc) 141 // CHECK: #pragma omp target update from(mapper(N1::id): vc) 142 #pragma omp target update from(mapper(dat<double>::id): vvv) 143 // CHECK: #pragma omp target update from(mapper(dat<double>::id): vvv) 144 145 #pragma omp declare mapper(id: N1::vec v) map(v.len) 146 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len) 147 { 148 #pragma omp declare mapper(id: N1::vec v) map(v.len) 149 // CHECK: #pragma omp declare mapper (id : N1::vec v) map(tofrom: v.len) 150 } 151 return foo<int>(0); 152 } 153 // CHECK: } 154 155 #endif 156