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 | |