xref: /aosp_15_r20/external/clang/test/OpenMP/parallel_ast_print.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -ast-print %s | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -emit-pch -o %t %s
3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4*67e74705SXin Li // expected-no-diagnostics
5*67e74705SXin Li 
6*67e74705SXin Li #ifndef HEADER
7*67e74705SXin Li #define HEADER
8*67e74705SXin Li 
foo()9*67e74705SXin Li void foo() {}
10*67e74705SXin Li 
11*67e74705SXin Li struct S1 {
S1S112*67e74705SXin Li   S1(): a(0) {}
S1S113*67e74705SXin Li   S1(int v) : a(v) {}
14*67e74705SXin Li   int a;
15*67e74705SXin Li   typedef int type;
16*67e74705SXin Li   S1& operator +(const S1&);
17*67e74705SXin Li   S1& operator *(const S1&);
18*67e74705SXin Li   S1& operator &&(const S1&);
19*67e74705SXin Li   S1& operator ^(const S1&);
20*67e74705SXin Li };
21*67e74705SXin Li 
22*67e74705SXin Li template <typename T>
23*67e74705SXin Li class S7 : public T {
24*67e74705SXin Li protected:
25*67e74705SXin Li   T a;
26*67e74705SXin Li   T b[100];
S7()27*67e74705SXin Li   S7() : a(0) {}
28*67e74705SXin Li 
29*67e74705SXin Li public:
S7(typename T::type v)30*67e74705SXin Li   S7(typename T::type v) : a(v) {
31*67e74705SXin Li #pragma omp parallel private(a) private(this->a) private(T::a)
32*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
33*67e74705SXin Li       ++this->a.a;
34*67e74705SXin Li #pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(T::a)
35*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
36*67e74705SXin Li       ++this->a.a;
37*67e74705SXin Li #pragma omp parallel shared(a) shared(this->a) shared(T::a)
38*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
39*67e74705SXin Li       ++this->a.a;
40*67e74705SXin Li #pragma omp parallel reduction(+ : a) reduction(*: b[:])
41*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
42*67e74705SXin Li       ++this->a.a;
43*67e74705SXin Li   }
operator =(S7 & s)44*67e74705SXin Li   S7 &operator=(S7 &s) {
45*67e74705SXin Li #pragma omp parallel private(a) private(this->a)
46*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
47*67e74705SXin Li       ++s.a.a;
48*67e74705SXin Li #pragma omp parallel firstprivate(a) firstprivate(this->a)
49*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
50*67e74705SXin Li       ++s.a.a;
51*67e74705SXin Li #pragma omp parallel shared(a) shared(this->a)
52*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
53*67e74705SXin Li       ++s.a.a;
54*67e74705SXin Li #pragma omp parallel reduction(&& : this->a) reduction(^: b[s.a.a])
55*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
56*67e74705SXin Li       ++s.a.a;
57*67e74705SXin Li     return *this;
58*67e74705SXin Li   }
59*67e74705SXin Li };
60*67e74705SXin Li 
61*67e74705SXin Li // CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S1::a)
62*67e74705SXin Li // CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S1::a)
63*67e74705SXin Li // CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(this->S1::a)
64*67e74705SXin Li // CHECK: #pragma omp parallel reduction(+: this->a) reduction(*: this->b[:])
65*67e74705SXin Li // CHECK: #pragma omp parallel private(this->a) private(this->a) private(T::a)
66*67e74705SXin Li // CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(T::a)
67*67e74705SXin Li // CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(T::a)
68*67e74705SXin Li // CHECK: #pragma omp parallel reduction(+: this->a) reduction(*: this->b[:])
69*67e74705SXin Li // CHECK: #pragma omp parallel private(this->a) private(this->a)
70*67e74705SXin Li // CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)
71*67e74705SXin Li // CHECK: #pragma omp parallel shared(this->a) shared(this->a)
72*67e74705SXin Li // CHECK: #pragma omp parallel reduction(&&: this->a) reduction(^: this->b[s.a.a])
73*67e74705SXin Li 
74*67e74705SXin Li class S8 : public S7<S1> {
S8()75*67e74705SXin Li   S8() {}
76*67e74705SXin Li 
77*67e74705SXin Li public:
S8(int v)78*67e74705SXin Li   S8(int v) : S7<S1>(v){
79*67e74705SXin Li #pragma omp parallel private(a) private(this->a) private(S7 < S1 > ::a)
80*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
81*67e74705SXin Li       ++this->a.a;
82*67e74705SXin Li #pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(S7 < S1 > ::a)
83*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
84*67e74705SXin Li       ++this->a.a;
85*67e74705SXin Li #pragma omp parallel shared(a) shared(this->a) shared(S7 < S1 > ::a)
86*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
87*67e74705SXin Li       ++this->a.a;
88*67e74705SXin Li #pragma omp parallel reduction(^ : S7 < S1 > ::a) reduction(+ : S7 < S1 > ::b[ : S7 < S1 > ::a.a])
89*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
90*67e74705SXin Li       ++this->a.a;
91*67e74705SXin Li   }
operator =(S8 & s)92*67e74705SXin Li   S8 &operator=(S8 &s) {
93*67e74705SXin Li #pragma omp parallel private(a) private(this->a)
94*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
95*67e74705SXin Li       ++s.a.a;
96*67e74705SXin Li #pragma omp parallel firstprivate(a) firstprivate(this->a)
97*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
98*67e74705SXin Li       ++s.a.a;
99*67e74705SXin Li #pragma omp parallel shared(a) shared(this->a)
100*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
101*67e74705SXin Li       ++s.a.a;
102*67e74705SXin Li #pragma omp parallel reduction(* : this->a) reduction(&&:this->b[a.a:])
103*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
104*67e74705SXin Li       ++s.a.a;
105*67e74705SXin Li     return *this;
106*67e74705SXin Li   }
107*67e74705SXin Li };
108*67e74705SXin Li 
109*67e74705SXin Li // CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S7<S1>::a)
110*67e74705SXin Li // CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S7<S1>::a)
111*67e74705SXin Li // CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(this->S7<S1>::a)
112*67e74705SXin Li // CHECK: #pragma omp parallel reduction(^: this->S7<S1>::a) reduction(+: this->S7<S1>::b[:this->S7<S1>::a.a])
113*67e74705SXin Li // CHECK: #pragma omp parallel private(this->a) private(this->a)
114*67e74705SXin Li // CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)
115*67e74705SXin Li // CHECK: #pragma omp parallel shared(this->a) shared(this->a)
116*67e74705SXin Li // CHECK: #pragma omp parallel reduction(*: this->a) reduction(&&: this->b[this->a.a:])
117*67e74705SXin Li 
118*67e74705SXin Li template <class T>
119*67e74705SXin Li struct S {
operator TS120*67e74705SXin Li   operator T() {return T();}
121*67e74705SXin Li   static T TS;
122*67e74705SXin Li   #pragma omp threadprivate(TS)
123*67e74705SXin Li };
124*67e74705SXin Li 
125*67e74705SXin Li // CHECK:      template <class T = int> struct S {
126*67e74705SXin Li // CHECK:        static int TS;
127*67e74705SXin Li // CHECK-NEXT:   #pragma omp threadprivate(S<int>::TS)
128*67e74705SXin Li // CHECK-NEXT: }
129*67e74705SXin Li // CHECK:      template <class T = long> struct S {
130*67e74705SXin Li // CHECK:        static long TS;
131*67e74705SXin Li // CHECK-NEXT:   #pragma omp threadprivate(S<long>::TS)
132*67e74705SXin Li // CHECK-NEXT: }
133*67e74705SXin Li // CHECK:      template <class T> struct S {
134*67e74705SXin Li // CHECK:        static T TS;
135*67e74705SXin Li // CHECK-NEXT:   #pragma omp threadprivate(S::TS)
136*67e74705SXin Li // CHECK:      };
137*67e74705SXin Li 
138*67e74705SXin Li template <typename T, int C>
tmain(T argc,T * argv)139*67e74705SXin Li T tmain(T argc, T *argv) {
140*67e74705SXin Li   T b = argc, c, d, e, f, g;
141*67e74705SXin Li   static T a;
142*67e74705SXin Li   S<T> s;
143*67e74705SXin Li   T arr[C][10], arr1[C];
144*67e74705SXin Li #pragma omp parallel
145*67e74705SXin Li   a=2;
146*67e74705SXin Li #pragma omp parallel default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(C) copyin(S<T>::TS) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:C][0:10])
147*67e74705SXin Li   foo();
148*67e74705SXin Li #pragma omp parallel if (C) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:C][:argc]) reduction(&& : g)
149*67e74705SXin Li   foo();
150*67e74705SXin Li   return 0;
151*67e74705SXin Li }
152*67e74705SXin Li 
153*67e74705SXin Li // CHECK: template <typename T = int, int C = 5> int tmain(int argc, int *argv) {
154*67e74705SXin Li // CHECK-NEXT: int b = argc, c, d, e, f, g;
155*67e74705SXin Li // CHECK-NEXT: static int a;
156*67e74705SXin Li // CHECK-NEXT: S<int> s;
157*67e74705SXin Li // CHECK-NEXT: int arr[5][10], arr1[5];
158*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel
159*67e74705SXin Li // CHECK-NEXT: a = 2;
160*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) copyin(S<int>::TS) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])
161*67e74705SXin Li // CHECK-NEXT: foo()
162*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: g)
163*67e74705SXin Li // CHECK-NEXT: foo()
164*67e74705SXin Li // CHECK: template <typename T = long, int C = 1> long tmain(long argc, long *argv) {
165*67e74705SXin Li // CHECK-NEXT: long b = argc, c, d, e, f, g;
166*67e74705SXin Li // CHECK-NEXT: static long a;
167*67e74705SXin Li // CHECK-NEXT: S<long> s;
168*67e74705SXin Li // CHECK-NEXT: long arr[1][10], arr1[1];
169*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel
170*67e74705SXin Li // CHECK-NEXT: a = 2;
171*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(1) copyin(S<long>::TS) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:1][0:10])
172*67e74705SXin Li // CHECK-NEXT: foo()
173*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel if(1) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:1][:argc]) reduction(&&: g)
174*67e74705SXin Li // CHECK-NEXT: foo()
175*67e74705SXin Li // CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
176*67e74705SXin Li // CHECK-NEXT: T b = argc, c, d, e, f, g;
177*67e74705SXin Li // CHECK-NEXT: static T a;
178*67e74705SXin Li // CHECK-NEXT: S<T> s;
179*67e74705SXin Li // CHECK-NEXT: T arr[C][10], arr1[C];
180*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel
181*67e74705SXin Li // CHECK-NEXT: a = 2;
182*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(C) copyin(S<T>::TS) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:C][0:10])
183*67e74705SXin Li // CHECK-NEXT: foo()
184*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel if(C) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:C][:argc]) reduction(&&: g)
185*67e74705SXin Li // CHECK-NEXT: foo()
186*67e74705SXin Li 
187*67e74705SXin Li enum Enum { };
188*67e74705SXin Li 
main(int argc,char ** argv)189*67e74705SXin Li int main (int argc, char **argv) {
190*67e74705SXin Li   long x;
191*67e74705SXin Li   int b = argc, c, d, e, f, g;
192*67e74705SXin Li   static int a;
193*67e74705SXin Li   #pragma omp threadprivate(a)
194*67e74705SXin Li   int arr[10][argc], arr1[2];
195*67e74705SXin Li   Enum ee;
196*67e74705SXin Li // CHECK: Enum ee;
197*67e74705SXin Li #pragma omp parallel
198*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel
199*67e74705SXin Li   a=2;
200*67e74705SXin Li // CHECK-NEXT: a = 2;
201*67e74705SXin Li #pragma omp parallel default(none), private(argc,b) firstprivate(argv) if (parallel: argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(| : c, d, arr1[argc]) reduction(* : e, arr[:10][0:argc])
202*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel default(none) private(argc,b) firstprivate(argv) if(parallel: argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(|: c,d,arr1[argc]) reduction(*: e,arr[:10][0:argc])
203*67e74705SXin Li   foo();
204*67e74705SXin Li // CHECK-NEXT: foo();
205*67e74705SXin Li // CHECK-NEXT: #pragma omp parallel if(b) num_threads(c) proc_bind(close) reduction(^: e,f) reduction(&&: g,arr[0:argc][:10])
206*67e74705SXin Li // CHECK-NEXT: foo()
207*67e74705SXin Li #pragma omp parallel if (b) num_threads(c) proc_bind(close) reduction(^:e, f) reduction(&& : g, arr[0:argc][:10])
208*67e74705SXin Li   foo();
209*67e74705SXin Li   return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);
210*67e74705SXin Li }
211*67e74705SXin Li 
212*67e74705SXin Li template <class T>
213*67e74705SXin Li struct Foo {
214*67e74705SXin Li   int foo;
215*67e74705SXin Li };
216*67e74705SXin Li 
foo(const Foo<int> & arg)217*67e74705SXin Li void foo(const Foo<int> &arg) {
218*67e74705SXin Li // CHECK: #pragma omp parallel
219*67e74705SXin Li #pragma omp parallel
220*67e74705SXin Li   {
221*67e74705SXin Li // CHECK: #pragma omp for schedule(static)
222*67e74705SXin Li #pragma omp for schedule(static)
223*67e74705SXin Li     for (int idx = 0; idx < 1234; ++idx) {
224*67e74705SXin Li       //arg.foo = idx;
225*67e74705SXin Li       idx = arg.foo;
226*67e74705SXin Li     }
227*67e74705SXin Li   }
228*67e74705SXin Li }
229*67e74705SXin Li 
230*67e74705SXin Li template<typename T>
231*67e74705SXin Li T S<T>::TS = 0;
232*67e74705SXin Li 
233*67e74705SXin Li #endif
234