xref: /aosp_15_r20/external/clang/test/OpenMP/distribute_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 S {
SS12*67e74705SXin Li   S(): a(0) {}
SS13*67e74705SXin Li   S(int v) : a(v) {}
14*67e74705SXin Li   int a;
15*67e74705SXin Li   typedef int type;
16*67e74705SXin Li };
17*67e74705SXin Li 
18*67e74705SXin Li template <typename T>
19*67e74705SXin Li class S7 : public T {
20*67e74705SXin Li protected:
21*67e74705SXin Li   T a;
S7()22*67e74705SXin Li   S7() : a(0) {}
23*67e74705SXin Li 
24*67e74705SXin Li public:
S7(typename T::type v)25*67e74705SXin Li   S7(typename T::type v) : a(v) {
26*67e74705SXin Li #pragma omp target
27*67e74705SXin Li #pragma omp teams
28*67e74705SXin Li #pragma omp distribute private(a) private(this->a) private(T::a)
29*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
30*67e74705SXin Li       ++this->a.a;
31*67e74705SXin Li   }
operator =(S7 & s)32*67e74705SXin Li   S7 &operator=(S7 &s) {
33*67e74705SXin Li #pragma omp target
34*67e74705SXin Li #pragma omp teams
35*67e74705SXin Li #pragma omp distribute private(a) private(this->a)
36*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
37*67e74705SXin Li       ++s.a.a;
38*67e74705SXin Li     return *this;
39*67e74705SXin Li   }
40*67e74705SXin Li };
41*67e74705SXin Li 
42*67e74705SXin Li // CHECK: #pragma omp target
43*67e74705SXin Li // CHECK-NEXT: #pragma omp teams
44*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(this->S::a)
45*67e74705SXin Li // CHECK: #pragma omp target
46*67e74705SXin Li // CHECK-NEXT: #pragma omp teams
47*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(T::a)
48*67e74705SXin Li // CHECK: #pragma omp target
49*67e74705SXin Li // CHECK-NEXT: #pragma omp teams
50*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a)
51*67e74705SXin Li 
52*67e74705SXin Li class S8 : public S7<S> {
S8()53*67e74705SXin Li   S8() {}
54*67e74705SXin Li 
55*67e74705SXin Li public:
S8(int v)56*67e74705SXin Li   S8(int v) : S7<S>(v){
57*67e74705SXin Li #pragma omp target
58*67e74705SXin Li #pragma omp teams
59*67e74705SXin Li #pragma omp distribute private(a) private(this->a) private(S7<S>::a)
60*67e74705SXin Li     for (int k = 0; k < a.a; ++k)
61*67e74705SXin Li       ++this->a.a;
62*67e74705SXin Li   }
operator =(S8 & s)63*67e74705SXin Li   S8 &operator=(S8 &s) {
64*67e74705SXin Li #pragma omp target
65*67e74705SXin Li #pragma omp teams
66*67e74705SXin Li #pragma omp distribute private(a) private(this->a)
67*67e74705SXin Li     for (int k = 0; k < s.a.a; ++k)
68*67e74705SXin Li       ++s.a.a;
69*67e74705SXin Li     return *this;
70*67e74705SXin Li   }
71*67e74705SXin Li };
72*67e74705SXin Li 
73*67e74705SXin Li // CHECK: #pragma omp target
74*67e74705SXin Li // CHECK-NEXT: #pragma omp teams
75*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a) private(this->S7<S>::a)
76*67e74705SXin Li // CHECK: #pragma omp target
77*67e74705SXin Li // CHECK-NEXT: #pragma omp teams
78*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute private(this->a) private(this->a)
79*67e74705SXin Li 
80*67e74705SXin Li template <class T, int N>
tmain(T argc)81*67e74705SXin Li T tmain(T argc) {
82*67e74705SXin Li   T b = argc, c, d, e, f, g;
83*67e74705SXin Li   static T a;
84*67e74705SXin Li // CHECK: static T a;
85*67e74705SXin Li #pragma omp distribute
86*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute
87*67e74705SXin Li   for (int i=0; i < 2; ++i)a=2;
88*67e74705SXin Li // CHECK-NEXT: for (int i = 0; i < 2; ++i)
89*67e74705SXin Li // CHECK-NEXT: a = 2;
90*67e74705SXin Li #pragma omp target
91*67e74705SXin Li #pragma omp teams
92*67e74705SXin Li #pragma omp distribute private(argc, b), firstprivate(c, d), collapse(2)
93*67e74705SXin Li   for (int i = 0; i < 10; ++i)
94*67e74705SXin Li   for (int j = 0; j < 10; ++j)foo();
95*67e74705SXin Li // CHECK-NEXT: #pragma omp target
96*67e74705SXin Li // CHECK-NEXT: #pragma omp teams
97*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute private(argc,b) firstprivate(c,d) collapse(2)
98*67e74705SXin Li // CHECK-NEXT: for (int i = 0; i < 10; ++i)
99*67e74705SXin Li // CHECK-NEXT: for (int j = 0; j < 10; ++j)
100*67e74705SXin Li // CHECK-NEXT: foo();
101*67e74705SXin Li   for (int i = 0; i < 10; ++i)foo();
102*67e74705SXin Li // CHECK-NEXT: for (int i = 0; i < 10; ++i)
103*67e74705SXin Li // CHECK-NEXT: foo();
104*67e74705SXin Li #pragma omp distribute
105*67e74705SXin Li // CHECK: #pragma omp distribute
106*67e74705SXin Li   for (int i = 0; i < 10; ++i)foo();
107*67e74705SXin Li // CHECK-NEXT: for (int i = 0; i < 10; ++i)
108*67e74705SXin Li // CHECK-NEXT: foo();
109*67e74705SXin Li   return T();
110*67e74705SXin Li }
111*67e74705SXin Li 
main(int argc,char ** argv)112*67e74705SXin Li int main (int argc, char **argv) {
113*67e74705SXin Li   int b = argc, c, d, e, f, g;
114*67e74705SXin Li   static int a;
115*67e74705SXin Li // CHECK: static int a;
116*67e74705SXin Li #pragma omp distribute
117*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute
118*67e74705SXin Li   for (int i=0; i < 2; ++i)a=2;
119*67e74705SXin Li // CHECK-NEXT: for (int i = 0; i < 2; ++i)
120*67e74705SXin Li // CHECK-NEXT: a = 2;
121*67e74705SXin Li #pragma omp target
122*67e74705SXin Li #pragma omp teams
123*67e74705SXin Li #pragma omp distribute private(argc,b),firstprivate(argv, c), collapse(2)
124*67e74705SXin Li   for (int i = 0; i < 10; ++i)
125*67e74705SXin Li   for (int j = 0; j < 10; ++j)foo();
126*67e74705SXin Li // CHECK-NEXT: #pragma omp target
127*67e74705SXin Li // CHECK-NEXT: #pragma omp teams
128*67e74705SXin Li // CHECK-NEXT: #pragma omp distribute private(argc,b) firstprivate(argv,c) collapse(2)
129*67e74705SXin Li // CHECK-NEXT: for (int i = 0; i < 10; ++i)
130*67e74705SXin Li // CHECK-NEXT: for (int j = 0; j < 10; ++j)
131*67e74705SXin Li // CHECK-NEXT: foo();
132*67e74705SXin Li   for (int i = 0; i < 10; ++i)foo();
133*67e74705SXin Li // CHECK-NEXT: for (int i = 0; i < 10; ++i)
134*67e74705SXin Li // CHECK-NEXT: foo();
135*67e74705SXin Li #pragma omp distribute
136*67e74705SXin Li // CHECK: #pragma omp distribute
137*67e74705SXin Li   for (int i = 0; i < 10; ++i)foo();
138*67e74705SXin Li // CHECK-NEXT: for (int i = 0; i < 10; ++i)
139*67e74705SXin Li // CHECK-NEXT: foo();
140*67e74705SXin Li   return (0);
141*67e74705SXin Li }
142*67e74705SXin Li 
143*67e74705SXin Li #endif
144