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