Clang Project

clang_source_code/test/OpenMP/for_ast_print.cpp
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
5// RUN: %clang_cc1 -verify -fopenmp-simd -ast-print %s | FileCheck %s
6// RUN: %clang_cc1 -fopenmp-simd -x c++ -std=c++11 -emit-pch -o %t %s
7// RUN: %clang_cc1 -fopenmp-simd -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8// expected-no-diagnostics
9
10#ifndef HEADER
11#define HEADER
12
13void foo() {}
14
15struct S {
16  S(): a(0) {}
17  S(int v) : a(v) {}
18  int a;
19  typedef int type;
20};
21
22template <typename T>
23class S7 : public T {
24protected:
25  T a;
26  T &b;
27  typename T::type c:12;
28  typename T::type &d;
29  S7() : a(0), b(a), c(0), d(a.a) {}
30
31public:
32  S7(typename T::type v) : a(v), b(a), c(v), d(a.a) {
33#pragma omp for private(a) private(this->a) private(T::a)
34    for (int k = 0; k < a.a; ++k)
35      ++this->a.a;
36#pragma omp for lastprivate(a) lastprivate(this->a) lastprivate(T::a)
37    for (int k = 0; k < a.a; ++k)
38      ++this->a.a;
39#pragma omp for linear(val(c))
40    for (int k = 0; k < a.a; ++k)
41      ++this->a.a;
42  }
43  S7 &operator=(S7 &s) {
44#pragma omp for private(a) private(this->a)
45    for (int k = 0; k < s.a.a; ++k)
46      ++s.a.a;
47#pragma omp for lastprivate(a) lastprivate(this->a)
48    for (int k = 0; k < s.a.a; ++k)
49      ++s.a.a;
50#pragma omp for linear(uval(this->b))
51    for (int k = 0; k < s.a.a; ++k)
52      ++s.a.a;
53    return *this;
54  }
55};
56
57// CHECK: #pragma omp for private(this->a) private(this->a) private(T::a)
58// CHECK: #pragma omp for lastprivate(this->a) lastprivate(this->a) lastprivate(T::a)
59// CHECK: #pragma omp for linear(val(this->c))
60// CHECK: #pragma omp for private(this->a) private(this->a)
61// CHECK: #pragma omp for lastprivate(this->a) lastprivate(this->a)
62// CHECK: #pragma omp for linear(uval(this->b))
63// CHECK: #pragma omp for private(this->a) private(this->a) private(this->S::a)
64// CHECK: #pragma omp for lastprivate(this->a) lastprivate(this->a) lastprivate(this->S::a)
65// CHECK: #pragma omp for linear(val(this->c))
66
67class S8 : public S7<S> {
68  S8() {}
69
70public:
71  S8(int v) : S7<S>(v){
72#pragma omp for private(a) private(this->a) private(S7<S>::a)
73    for (int k = 0; k < a.a; ++k)
74      ++this->a.a;
75#pragma omp for lastprivate(a) lastprivate(this->a) lastprivate(S7<S>::a)
76    for (int k = 0; k < a.a; ++k)
77      ++this->a.a;
78#pragma omp for linear(ref(S7<S>::d))
79    for (int k = 0; k < a.a; ++k)
80      ++this->a.a;
81  }
82  S8 &operator=(S8 &s) {
83#pragma omp for private(a) private(this->a)
84    for (int k = 0; k < s.a.a; ++k)
85      ++s.a.a;
86#pragma omp for lastprivate(a) lastprivate(this->a)
87    for (int k = 0; k < s.a.a; ++k)
88      ++s.a.a;
89#pragma omp for linear(this->c)
90    for (int k = 0; k < s.a.a; ++k)
91      ++s.a.a;
92    return *this;
93  }
94};
95
96// CHECK: #pragma omp for private(this->a) private(this->a) private(this->S7<S>::a)
97// CHECK: #pragma omp for lastprivate(this->a) lastprivate(this->a) lastprivate(this->S7<S>::a)
98// CHECK: #pragma omp for linear(ref(this->S7<S>::d))
99// CHECK: #pragma omp for private(this->a) private(this->a)
100// CHECK: #pragma omp for lastprivate(this->a) lastprivate(this->a)
101// CHECK: #pragma omp for linear(this->c)
102
103template <class T, int N>
104T tmain(T argc) {
105  T b = argc, c, d, e, f, g;
106  static T a;
107// CHECK: static T a;
108#pragma omp for schedule(dynamic) linear(a) allocate(a)
109  // CHECK-NEXT: #pragma omp for schedule(dynamic) linear(a) allocate(a)
110  for (int i = 0; i < 2; ++i)
111    a = 2;
112// CHECK-NEXT: for (int i = 0; i < 2; ++i)
113// CHECK-NEXT: a = 2;
114#pragma omp parallel
115#pragma omp for allocate(argc) private(argc, b), firstprivate(c, d), lastprivate(d, f) collapse(N) schedule(static, N) ordered(N) nowait
116  for (int i = 0; i < 2; ++i)
117    for (int j = 0; j < 2; ++j)
118      for (int j = 0; j < 2; ++j)
119        for (int j = 0; j < 2; ++j)
120          for (int j = 0; j < 2; ++j)
121  for (int i = 0; i < 2; ++i)
122    for (int j = 0; j < 2; ++j)
123      for (int j = 0; j < 2; ++j)
124        for (int j = 0; j < 2; ++j)
125          for (int j = 0; j < 2; ++j)
126            foo();
127  // CHECK-NEXT: #pragma omp parallel
128  // CHECK-NEXT: #pragma omp for allocate(argc) private(argc,b) firstprivate(c,d) lastprivate(d,f) collapse(N) schedule(static, N) ordered(N) nowait
129  // CHECK-NEXT: for (int i = 0; i < 2; ++i)
130  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
131  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
132  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
133  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
134  // CHECK-NEXT: for (int i = 0; i < 2; ++i)
135  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
136  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
137  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
138  // CHECK-NEXT: for (int j = 0; j < 2; ++j)
139  // CHECK-NEXT: foo();
140  return T();
141}
142
143int main(int argc, char **argv) {
144// CHECK: int main(int argc, char **argv) {
145  int b = argc, c, d, e, f, g;
146  static int a;
147// CHECK: static int a;
148#pragma omp for schedule(guided, argc) reduction(+:argv[0][:1])
149  // CHECK-NEXT: #pragma omp for schedule(guided, argc) reduction(+: argv[0][:1])
150  for (int i = 0; i < 2; ++i)
151    a = 2;
152// CHECK-NEXT: for (int i = 0; i < 2; ++i)
153// CHECK-NEXT: a = 2;
154#pragma omp parallel
155#pragma omp for private(argc, b), firstprivate(argv, c), lastprivate(d, f) collapse(2) schedule(auto) ordered nowait linear(g:-1)
156  for (int i = 0; i < 10; ++i)
157    for (int j = 0; j < 10; ++j)
158      foo();
159  // CHECK-NEXT: #pragma omp parallel
160  // CHECK-NEXT: #pragma omp for private(argc,b) firstprivate(argv,c) lastprivate(d,f) collapse(2) schedule(auto) ordered nowait linear(g: -1)
161  // CHECK-NEXT: for (int i = 0; i < 10; ++i)
162  // CHECK-NEXT: for (int j = 0; j < 10; ++j)
163  // CHECK-NEXT: foo();
164  char buf[9] = "01234567";
165  char *p, *q;
166#pragma omp parallel
167#pragma omp for
168  for (p = buf; p < &buf[8]; p++)
169    for (q = &buf[0]; q <= buf + 7; q++)
170      foo();
171  // CHECK: #pragma omp parallel
172  // CHECK-NEXT: #pragma omp for{{$}}
173  // CHECK-NEXT: for (p = buf; p < &buf[8]; p++)
174  // CHECK-NEXT: for (q = &buf[0]; q <= buf + 7; q++)
175  // CHECK-NEXT: foo();
176  return (tmain<int, 5>(argc) + tmain<char, 1>(argv[0][0]));
177}
178
179#endif
180