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