1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping -Wsign-conversion | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s -Wno-openmp-mapping -Wsign-conversion | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s -Wno-openmp-mapping
7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print -Wno-openmp-mapping | FileCheck %s
8 // expected-no-diagnostics
9 
10 #ifndef HEADER
11 #define HEADER
12 
13 typedef void **omp_allocator_handle_t;
14 extern const omp_allocator_handle_t omp_null_allocator;
15 extern const omp_allocator_handle_t omp_default_mem_alloc;
16 extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
17 extern const omp_allocator_handle_t omp_const_mem_alloc;
18 extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
19 extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
20 extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
21 extern const omp_allocator_handle_t omp_pteam_mem_alloc;
22 extern const omp_allocator_handle_t omp_thread_mem_alloc;
23 
foo()24 void foo() {}
25 
26 struct S {
SS27   S(): a(0) {}
SS28   S(int v) : a(v) {}
29   int a;
30   typedef int type;
31 };
32 
33 template <typename T>
34 class S7 : public T {
35 protected:
36   T a;
S7()37   S7() : a(0) {}
38 
39 public:
S7(typename T::type v)40   S7(typename T::type v) : a(v) {
41 #pragma omp target teams distribute parallel for private(a) private(this->a) private(T::a) allocate(omp_cgroup_mem_alloc:a) uses_allocators(omp_cgroup_mem_alloc)
42     for (int k = 0; k < a.a; ++k) {
43       ++this->a.a;
44 #pragma omp cancel for
45     }
46   }
operator =(S7 & s)47   S7 &operator=(S7 &s) {
48 #pragma omp target teams distribute parallel for private(a) private(this->a)
49     for (int k = 0; k < s.a.a; ++k)
50       ++s.a.a;
51 
52     foo();
53     return *this;
54   }
foo()55   void foo() {
56     int b, argv, d, c, e, f;
57 #pragma omp target teams distribute parallel for default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)
58     for (int k = 0; k < a.a; ++k)
59       ++a.a;
60   }
61 };
62 // CHECK: #pragma omp target teams distribute parallel for private(this->a) private(this->a) private(T::a) allocate(omp_cgroup_mem_alloc: this->a) uses_allocators(omp_cgroup_mem_alloc)
63 // CHECK: #pragma omp cancel for
64 // CHECK: #pragma omp target teams distribute parallel for private(this->a) private(this->a)
65 // CHECK: #pragma omp target teams distribute parallel for default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d)
66 
67 class S8 : public S7<S> {
S8()68   S8() {}
69 
70 public:
S8(int v)71   S8(int v) : S7<S>(v){
72 #pragma omp target teams distribute parallel for private(a) private(this->a) private(S7<S>::a)
73     for (int k = 0; k < a.a; ++k)
74       ++this->a.a;
75   }
operator =(S8 & s)76   S8 &operator=(S8 &s) {
77 #pragma omp target teams distribute parallel for private(a) private(this->a)
78     for (int k = 0; k < s.a.a; ++k)
79       ++s.a.a;
80 
81     bar();
82     return *this;
83   }
bar()84   void bar() {
85     int b, argv, d, c, e, f8;
86 #pragma omp target teams distribute parallel for allocate(b) default(none), private(b) firstprivate(argv) shared(d) reduction(+:c) reduction(max:e) num_teams(f8) thread_limit(d) allocate(e)
87     for (int k = 0; k < a.a; ++k)
88       ++a.a;
89   }
90 };
91 // CHECK: #pragma omp target teams distribute parallel for private(this->a) private(this->a) private(this->S::a)
92 // CHECK: #pragma omp target teams distribute parallel for private(this->a) private(this->a) private(this->S7<S>::a)
93 // CHECK: #pragma omp target teams distribute parallel for private(this->a) private(this->a)
94 // CHECK: #pragma omp target teams distribute parallel for allocate(b) default(none) private(b) firstprivate(argv) shared(d) reduction(+: c) reduction(max: e) num_teams(f8) thread_limit(d) allocate(e)
95 
96 template <class T, int N>
tmain(T argc)97 T tmain(T argc) {
98   T b = argc, c, d, e, f, g;
99   static T a;
100 // CHECK: static T a;
101   const T clen = 5;
102   const T alen = 16;
103   int arr[10];
104 #pragma omp target teams distribute parallel for
105   for (int i=0; i < 2; ++i)
106     a = 2;
107 // CHECK: #pragma omp target teams distribute parallel for{{$}}
108 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
109 // CHECK-NEXT: a = 2;
110 #pragma omp target teams distribute parallel for private(argc, b), firstprivate(c, d), collapse(2) order(concurrent)
111   for (int i = 0; i < 10; ++i)
112     for (int j = 0; j < 10; ++j)
113       foo();
114 // CHECK: #pragma omp target teams distribute parallel for private(argc,b) firstprivate(c,d) collapse(2) order(concurrent)
115 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
116 // CHECK-NEXT: for (int j = 0; j < 10; ++j)
117 // CHECK-NEXT: foo();
118   for (int i = 0; i < 10; ++i)
119     foo();
120 // CHECK: for (int i = 0; i < 10; ++i)
121 // CHECK-NEXT: foo();
122 #pragma omp target teams distribute parallel for
123   for (int i = 0; i < 10; ++i)
124     foo();
125 // CHECK: #pragma omp target teams distribute parallel for
126 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
127 // CHECK-NEXT: foo();
128 #pragma omp target teams distribute parallel for default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)
129     for (int k = 0; k < 10; ++k)
130       e += d + argc;
131 // CHECK: #pragma omp target teams distribute parallel for default(none) private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d)
132 // CHECK-NEXT: for (int k = 0; k < 10; ++k)
133 // CHECK-NEXT: e += d + argc;
134 #pragma omp target teams distribute parallel for
135   for (int k = 0; k < 10; ++k)
136     e += d + argc;
137 // CHECK: #pragma omp target teams distribute parallel for
138 // CHECK-NEXT: for (int k = 0; k < 10; ++k)
139 // CHECK-NEXT: e += d + argc;
140   return T();
141 }
142 
main(int argc,char ** argv)143 int main (int argc, char **argv) {
144   int b = argc, c, d, e, f, g;
145   static int a;
146 // CHECK: static int a;
147   const int clen = 5;
148   const int N = 10;
149   int arr[10];
150 #pragma omp target teams distribute parallel for
151   for (int i=0; i < 2; ++i)
152     a = 2;
153 // CHECK: #pragma omp target teams distribute parallel for
154 // CHECK-NEXT: for (int i = 0; i < 2; ++i)
155 // CHECK-NEXT: a = 2;
156 #pragma omp target teams distribute parallel for private(argc,b),firstprivate(argv, c), collapse(2)
157   for (int i = 0; i < 10; ++i)
158     for (int j = 0; j < 10; ++j)
159       foo();
160 // CHECK: #pragma omp target teams distribute parallel for private(argc,b) firstprivate(argv,c) collapse(2)
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   for (int i = 0; i < 10; ++i)
165     foo();
166 // CHECK: for (int i = 0; i < 10; ++i)
167 // CHECK-NEXT: foo();
168 #pragma omp target teams distribute parallel for
169   for (int i = 0; i < 10; ++i)foo();
170 // CHECK: #pragma omp target teams distribute parallel for
171 // CHECK-NEXT: for (int i = 0; i < 10; ++i)
172 // CHECK-NEXT: foo();
173 #pragma omp target teams distribute parallel for default(none), private(b) firstprivate(argc) shared(d) reduction(+:c) reduction(max:e) num_teams(f) thread_limit(d)
174   for (int k = 0; k < 10; ++k)
175     e += d + argc;
176 // CHECK: #pragma omp target teams distribute parallel for default(none) private(b) firstprivate(argc) shared(d) reduction(+: c) reduction(max: e) num_teams(f) thread_limit(d)
177 // CHECK-NEXT: for (int k = 0; k < 10; ++k)
178 // CHECK-NEXT: e += d + argc;
179 #pragma omp target teams distribute parallel for reduction(task,+:argc)
180   for (int k = 0; k < 10; ++k)
181     e += d + argc;
182 // CHECK: #pragma omp target teams distribute parallel for reduction(task, +: argc)
183 // CHECK-NEXT: for (int k = 0; k < 10; ++k)
184 // CHECK-NEXT: e += d + argc;
185   return (0);
186 }
187 
188 #endif
189