1 | // RUN: %clang_cc1 -verify -fopenmp -ast-print %s -Wno-openmp-target | 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 -Wno-openmp-target | FileCheck %s |
4 | |
5 | // RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s -Wno-openmp-target | 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 -Wno-openmp-target | FileCheck %s |
8 | // expected-no-diagnostics |
9 | |
10 | #ifndef HEADER |
11 | #define HEADER |
12 | |
13 | void foo() {} |
14 | |
15 | int x; |
16 | #pragma omp threadprivate(x) |
17 | |
18 | struct S { |
19 | S(): a(0) {} |
20 | S(int v) : a(v) {} |
21 | int a; |
22 | typedef int type; |
23 | }; |
24 | |
25 | template <typename T> |
26 | class S7 : public T { |
27 | protected: |
28 | T a; |
29 | S7() : a(0) {} |
30 | |
31 | public: |
32 | S7(typename T::type v) : a(v) { |
33 | #pragma omp target |
34 | #pragma omp teams distribute parallel for private(a) private(this->a) private(T::a) |
35 | for (int k = 0; k < a.a; ++k) |
36 | ++this->a.a; |
37 | } |
38 | S7 &operator=(S7 &s) { |
39 | #pragma omp target |
40 | #pragma omp teams distribute parallel for private(a) private(this->a) |
41 | for (int k = 0; k < s.a.a; ++k) |
42 | ++s.a.a; |
43 | |
44 | foo(); |
45 | return *this; |
46 | } |
47 | void foo() { |
48 | int b, argv, d, c, e, f; |
49 | #pragma omp target |
50 | #pragma omp teams distribute parallel for default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) copyin(x) |
51 | for (int k = 0; k < a.a; ++k) |
52 | ++a.a; |
53 | } |
54 | }; |
55 | // CHECK: #pragma omp target |
56 | // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) private(T::a) |
57 | // CHECK: #pragma omp target |
58 | // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) |
59 | // CHECK: #pragma omp target |
60 | // CHECK-NEXT: #pragma omp teams distribute parallel for default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) copyin(x) |
61 | |
62 | class S8 : public S7<S> { |
63 | S8() {} |
64 | |
65 | public: |
66 | S8(int v) : S7<S>(v){ |
67 | #pragma omp target |
68 | #pragma omp teams distribute parallel for private(a) private(this->a) private(S7<S>::a) |
69 | for (int k = 0; k < a.a; ++k) |
70 | ++this->a.a; |
71 | } |
72 | S8 &operator=(S8 &s) { |
73 | #pragma omp target |
74 | #pragma omp teams distribute parallel for private(a) private(this->a) |
75 | for (int k = 0; k < s.a.a; ++k) |
76 | ++s.a.a; |
77 | |
78 | bar(); |
79 | return *this; |
80 | } |
81 | void bar() { |
82 | int b, argv, d, c, e, f8; |
83 | #pragma omp target |
84 | #pragma omp teams distribute parallel for allocate(b) default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f8) thread_limit(d) copyin(x) allocate(argv) |
85 | for (int k = 0; k < a.a; ++k) |
86 | ++a.a; |
87 | } |
88 | }; |
89 | // CHECK: #pragma omp target |
90 | // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) private(this->S::a) |
91 | // CHECK: #pragma omp target |
92 | // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) private(this->S7<S>::a) |
93 | // CHECK: #pragma omp target |
94 | // CHECK-NEXT: #pragma omp teams distribute parallel for private(this->a) private(this->a) |
95 | // CHECK: #pragma omp target |
96 | // CHECK-NEXT: #pragma omp teams distribute parallel for allocate(b) default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f8) thread_limit(d) copyin(x) allocate(argv) |
97 | |
98 | template <class T, int N> |
99 | T tmain(T argc) { |
100 | T b = argc, c, d, e, f, g; |
101 | static T a; |
102 | // CHECK: static T a; |
103 | const T clen = 5; |
104 | const T alen = 16; |
105 | int arr[10]; |
106 | #pragma omp target |
107 | #pragma omp teams distribute parallel for |
108 | for (int i=0; i < 2; ++i) |
109 | a = 2; |
110 | // CHECK: #pragma omp target |
111 | // CHECK-NEXT: #pragma omp teams distribute parallel for{{$}} |
112 | // CHECK-NEXT: for (int i = 0; i < 2; ++i) |
113 | // CHECK-NEXT: a = 2; |
114 | #pragma omp target |
115 | #pragma omp teams distribute parallel for private(argc, b), firstprivate(c, d), collapse(2) |
116 | for (int i = 0; i < 10; ++i) |
117 | for (int j = 0; j < 10; ++j) |
118 | foo(); |
119 | // CHECK: #pragma omp target |
120 | // CHECK-NEXT: #pragma omp teams distribute parallel for private(argc,b) firstprivate(c,d) collapse(2) |
121 | // CHECK-NEXT: for (int i = 0; i < 10; ++i) |
122 | // CHECK-NEXT: for (int j = 0; j < 10; ++j) |
123 | // CHECK-NEXT: foo(); |
124 | for (int i = 0; i < 10; ++i) |
125 | foo(); |
126 | // CHECK: for (int i = 0; i < 10; ++i) |
127 | // CHECK-NEXT: foo(); |
128 | #pragma omp target |
129 | #pragma omp teams distribute parallel for |
130 | for (int i = 0; i < 10; ++i) |
131 | foo(); |
132 | // CHECK: #pragma omp target |
133 | // CHECK-NEXT: #pragma omp teams distribute parallel for |
134 | // CHECK-NEXT: for (int i = 0; i < 10; ++i) |
135 | // CHECK-NEXT: foo(); |
136 | #pragma omp target |
137 | #pragma omp teams distribute parallel for default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) copyin(x) |
138 | for (int k = 0; k < 10; ++k) |
139 | e += d + argc; |
140 | // CHECK: #pragma omp target |
141 | // CHECK-NEXT: #pragma omp teams distribute parallel for default(none) private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) copyin(x) |
142 | // CHECK-NEXT: for (int k = 0; k < 10; ++k) |
143 | // CHECK-NEXT: e += d + argc; |
144 | #pragma omp target |
145 | #pragma omp teams distribute parallel for |
146 | for (int k = 0; k < 10; ++k) |
147 | e += d + argc; |
148 | // CHECK: #pragma omp target |
149 | // CHECK-NEXT: #pragma omp teams distribute parallel for |
150 | // CHECK-NEXT: for (int k = 0; k < 10; ++k) |
151 | // CHECK-NEXT: e += d + argc; |
152 | return T(); |
153 | } |
154 | |
155 | int main (int argc, char **argv) { |
156 | int b = argc, c, d, e, f, g; |
157 | static int a; |
158 | // CHECK: static int a; |
159 | const int clen = 5; |
160 | const int N = 10; |
161 | int arr[10]; |
162 | #pragma omp target |
163 | #pragma omp teams distribute parallel for |
164 | for (int i=0; i < 2; ++i) |
165 | a = 2; |
166 | // CHECK: #pragma omp target |
167 | // CHECK-NEXT: #pragma omp teams distribute parallel for |
168 | // CHECK-NEXT: for (int i = 0; i < 2; ++i) |
169 | // CHECK-NEXT: a = 2; |
170 | #pragma omp target |
171 | #pragma omp teams distribute parallel for private(argc,b),firstprivate(argv, c), collapse(2) |
172 | for (int i = 0; i < 10; ++i) |
173 | for (int j = 0; j < 10; ++j) |
174 | foo(); |
175 | // CHECK: #pragma omp target |
176 | // CHECK-NEXT: #pragma omp teams distribute parallel for private(argc,b) firstprivate(argv,c) collapse(2) |
177 | // CHECK-NEXT: for (int i = 0; i < 10; ++i) |
178 | // CHECK-NEXT: for (int j = 0; j < 10; ++j) |
179 | // CHECK-NEXT: foo(); |
180 | for (int i = 0; i < 10; ++i) |
181 | foo(); |
182 | // CHECK: for (int i = 0; i < 10; ++i) |
183 | // CHECK-NEXT: foo(); |
184 | #pragma omp target |
185 | #pragma omp teams distribute parallel for |
186 | for (int i = 0; i < 10; ++i)foo(); |
187 | // CHECK: #pragma omp target |
188 | // CHECK-NEXT: #pragma omp teams distribute parallel for |
189 | // CHECK-NEXT: for (int i = 0; i < 10; ++i) |
190 | // CHECK-NEXT: foo(); |
191 | #pragma omp target |
192 | #pragma omp teams distribute parallel for default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d) copyin(x) |
193 | for (int k = 0; k < 10; ++k) |
194 | e += d + argc; |
195 | // CHECK: #pragma omp target |
196 | // CHECK-NEXT: #pragma omp teams distribute parallel for default(none) private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d) copyin(x) |
197 | // CHECK-NEXT: for (int k = 0; k < 10; ++k) |
198 | // CHECK-NEXT: e += d + argc; |
199 | #pragma omp target |
200 | #pragma omp teams distribute parallel for |
201 | for (int k = 0; k < 10; ++k) |
202 | e += d + argc; |
203 | // CHECK: #pragma omp target |
204 | // CHECK-NEXT: #pragma omp teams distribute parallel for |
205 | // CHECK-NEXT: for (int k = 0; k < 10; ++k) |
206 | // CHECK-NEXT: e += d + argc; |
207 | return (0); |
208 | } |
209 | |
210 | #endif |
211 | |