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