blob: 8a1533959e364199cf57d640a2a7325961aba51a [file] [log] [blame]
Alexey Bataevdb390212015-05-20 04:24:19 +00001// 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
Alexey Bataev5ec3eb12013-07-19 03:13:43 +00004// expected-no-diagnostics
5
6#ifndef HEADER
7#define HEADER
8
9void foo() {}
10
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000011struct S1 {
12 S1(): a(0) {}
13 S1(int v) : a(v) {}
14 int a;
15 typedef int type;
Alexey Bataev60da77e2016-02-29 05:54:20 +000016 S1& operator +(const S1&);
17 S1& operator *(const S1&);
18 S1& operator &&(const S1&);
19 S1& operator ^(const S1&);
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000020};
21
22template <typename T>
23class S7 : public T {
24protected:
25 T a;
Alexey Bataev60da77e2016-02-29 05:54:20 +000026 T b[100];
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000027 S7() : a(0) {}
28
29public:
30 S7(typename T::type v) : a(v) {
31#pragma omp parallel private(a) private(this->a) private(T::a)
32 for (int k = 0; k < a.a; ++k)
33 ++this->a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000034#pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(T::a)
35 for (int k = 0; k < a.a; ++k)
36 ++this->a.a;
Alexey Bataevb7a34b62016-02-25 03:59:29 +000037#pragma omp parallel shared(a) shared(this->a) shared(T::a)
38 for (int k = 0; k < a.a; ++k)
39 ++this->a.a;
Alexey Bataev60da77e2016-02-29 05:54:20 +000040#pragma omp parallel reduction(+ : a) reduction(*: b[:])
41 for (int k = 0; k < a.a; ++k)
42 ++this->a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000043 }
44 S7 &operator=(S7 &s) {
45#pragma omp parallel private(a) private(this->a)
46 for (int k = 0; k < s.a.a; ++k)
47 ++s.a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000048#pragma omp parallel firstprivate(a) firstprivate(this->a)
49 for (int k = 0; k < s.a.a; ++k)
50 ++s.a.a;
Alexey Bataevb7a34b62016-02-25 03:59:29 +000051#pragma omp parallel shared(a) shared(this->a)
52 for (int k = 0; k < s.a.a; ++k)
53 ++s.a.a;
Alexey Bataev60da77e2016-02-29 05:54:20 +000054#pragma omp parallel reduction(&& : this->a) reduction(^: b[s.a.a])
55 for (int k = 0; k < s.a.a; ++k)
56 ++s.a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000057 return *this;
58 }
59};
60
61// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S1::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000062// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S1::a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +000063// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(this->S1::a)
Alexey Bataev60da77e2016-02-29 05:54:20 +000064// CHECK: #pragma omp parallel reduction(+: this->a) reduction(*: this->b[:])
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000065// CHECK: #pragma omp parallel private(this->a) private(this->a) private(T::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000066// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(T::a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +000067// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(T::a)
Alexey Bataev60da77e2016-02-29 05:54:20 +000068// CHECK: #pragma omp parallel reduction(+: this->a) reduction(*: this->b[:])
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000069// CHECK: #pragma omp parallel private(this->a) private(this->a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000070// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +000071// CHECK: #pragma omp parallel shared(this->a) shared(this->a)
Alexey Bataev60da77e2016-02-29 05:54:20 +000072// CHECK: #pragma omp parallel reduction(&&: this->a) reduction(^: this->b[s.a.a])
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000073
74class S8 : public S7<S1> {
75 S8() {}
76
77public:
78 S8(int v) : S7<S1>(v){
Alexey Bataevb7a34b62016-02-25 03:59:29 +000079#pragma omp parallel private(a) private(this->a) private(S7 < S1 > ::a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000080 for (int k = 0; k < a.a; ++k)
81 ++this->a.a;
Alexey Bataevb7a34b62016-02-25 03:59:29 +000082#pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(S7 < S1 > ::a)
83 for (int k = 0; k < a.a; ++k)
84 ++this->a.a;
85#pragma omp parallel shared(a) shared(this->a) shared(S7 < S1 > ::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000086 for (int k = 0; k < a.a; ++k)
87 ++this->a.a;
Alexey Bataev60da77e2016-02-29 05:54:20 +000088#pragma omp parallel reduction(^ : S7 < S1 > ::a) reduction(+ : S7 < S1 > ::b[ : S7 < S1 > ::a.a])
89 for (int k = 0; k < a.a; ++k)
90 ++this->a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000091 }
92 S8 &operator=(S8 &s) {
93#pragma omp parallel private(a) private(this->a)
94 for (int k = 0; k < s.a.a; ++k)
95 ++s.a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000096#pragma omp parallel firstprivate(a) firstprivate(this->a)
97 for (int k = 0; k < s.a.a; ++k)
98 ++s.a.a;
Alexey Bataevb7a34b62016-02-25 03:59:29 +000099#pragma omp parallel shared(a) shared(this->a)
100 for (int k = 0; k < s.a.a; ++k)
101 ++s.a.a;
Alexey Bataev60da77e2016-02-29 05:54:20 +0000102#pragma omp parallel reduction(* : this->a) reduction(&&:this->b[a.a:])
103 for (int k = 0; k < s.a.a; ++k)
104 ++s.a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +0000105 return *this;
106 }
107};
108
109// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S7<S1>::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +0000110// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S7<S1>::a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +0000111// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(this->S7<S1>::a)
Alexey Bataev60da77e2016-02-29 05:54:20 +0000112// CHECK: #pragma omp parallel reduction(^: this->S7<S1>::a) reduction(+: this->S7<S1>::b[:this->S7<S1>::a.a])
Alexey Bataev48c0bfb2016-01-20 09:07:54 +0000113// CHECK: #pragma omp parallel private(this->a) private(this->a)
Alexey Bataevd985eda2016-02-10 11:29:16 +0000114// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +0000115// CHECK: #pragma omp parallel shared(this->a) shared(this->a)
Alexey Bataev60da77e2016-02-29 05:54:20 +0000116// CHECK: #pragma omp parallel reduction(*: this->a) reduction(&&: this->b[this->a.a:])
Alexey Bataev48c0bfb2016-01-20 09:07:54 +0000117
Alexey Bataev568a8332014-03-06 06:15:19 +0000118template <class T>
119struct S {
120 operator T() {return T();}
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000121 static T TS;
122 #pragma omp threadprivate(TS)
Alexey Bataev568a8332014-03-06 06:15:19 +0000123};
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000124
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000125// CHECK: template <class T = int> struct S {
126// CHECK: static int TS;
127// CHECK-NEXT: #pragma omp threadprivate(S<int>::TS)
128// CHECK-NEXT: }
129// CHECK: template <class T = long> struct S {
130// CHECK: static long TS;
131// CHECK-NEXT: #pragma omp threadprivate(S<long>::TS)
132// CHECK-NEXT: }
133// CHECK: template <class T> struct S {
134// CHECK: static T TS;
135// CHECK-NEXT: #pragma omp threadprivate(S::TS)
136// CHECK: };
137
Alexey Bataevaf7849e2014-03-05 06:45:14 +0000138template <typename T, int C>
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000139T tmain(T argc, T *argv) {
140 T b = argc, c, d, e, f, g;
141 static T a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000142 S<T> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000143 T arr[C][10], arr1[C];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000144#pragma omp parallel
145 a=2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000146#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])
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000147 foo();
Alexey Bataeva1764212015-09-30 09:22:36 +0000148#pragma omp parallel if (C) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:C][:argc]) reduction(&& : g)
Alexey Bataevaf7849e2014-03-05 06:45:14 +0000149 foo();
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000150 return 0;
151}
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000152
Alexey Bataev568a8332014-03-06 06:15:19 +0000153// CHECK: template <typename T = int, int C = 5> int tmain(int argc, int *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000154// CHECK-NEXT: int b = argc, c, d, e, f, g;
155// CHECK-NEXT: static int a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000156// CHECK-NEXT: S<int> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000157// CHECK-NEXT: int arr[5][10], arr1[5];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000158// CHECK-NEXT: #pragma omp parallel
159// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000160// 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])
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000161// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000162// CHECK-NEXT: #pragma omp parallel if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: g)
Alexey Bataevaf7849e2014-03-05 06:45:14 +0000163// CHECK-NEXT: foo()
Alexey Bataev568a8332014-03-06 06:15:19 +0000164// CHECK: template <typename T = long, int C = 1> long tmain(long argc, long *argv) {
165// CHECK-NEXT: long b = argc, c, d, e, f, g;
166// CHECK-NEXT: static long a;
167// CHECK-NEXT: S<long> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000168// CHECK-NEXT: long arr[1][10], arr1[1];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000169// CHECK-NEXT: #pragma omp parallel
170// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000171// 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])
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000172// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000173// CHECK-NEXT: #pragma omp parallel if(1) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:1][:argc]) reduction(&&: g)
Alexey Bataevaf7849e2014-03-05 06:45:14 +0000174// CHECK-NEXT: foo()
175// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000176// CHECK-NEXT: T b = argc, c, d, e, f, g;
177// CHECK-NEXT: static T a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000178// CHECK-NEXT: S<T> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000179// CHECK-NEXT: T arr[C][10], arr1[C];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000180// CHECK-NEXT: #pragma omp parallel
181// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000182// 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])
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000183// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000184// CHECK-NEXT: #pragma omp parallel if(C) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:C][:argc]) reduction(&&: g)
Alexey Bataevaf7849e2014-03-05 06:45:14 +0000185// CHECK-NEXT: foo()
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000186
Alexey Bataev568a8332014-03-06 06:15:19 +0000187enum Enum { };
188
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000189int main (int argc, char **argv) {
Alexey Bataev568a8332014-03-06 06:15:19 +0000190 long x;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000191 int b = argc, c, d, e, f, g;
192 static int a;
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000193 #pragma omp threadprivate(a)
Alexey Bataeva1764212015-09-30 09:22:36 +0000194 int arr[10][argc], arr1[2];
Alexey Bataev568a8332014-03-06 06:15:19 +0000195 Enum ee;
196// CHECK: Enum ee;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000197#pragma omp parallel
198// CHECK-NEXT: #pragma omp parallel
199 a=2;
200// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000201#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// 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])
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000203 foo();
204// CHECK-NEXT: foo();
Alexey Bataeva1764212015-09-30 09:22:36 +0000205// CHECK-NEXT: #pragma omp parallel if(b) num_threads(c) proc_bind(close) reduction(^: e,f) reduction(&&: g,arr[0:argc][:10])
Alexey Bataev7371aa32015-09-03 08:45:56 +0000206// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000207#pragma omp parallel if (b) num_threads(c) proc_bind(close) reduction(^:e, f) reduction(&& : g, arr[0:argc][:10])
Alexey Bataev7371aa32015-09-03 08:45:56 +0000208 foo();
Alexey Bataev568a8332014-03-06 06:15:19 +0000209 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000210}
211
Alexey Bataevc9bd03d2015-12-17 06:55:08 +0000212template <class T>
213struct Foo {
214 int foo;
215};
216
217void foo(const Foo<int> &arg) {
218// CHECK: #pragma omp parallel
219#pragma omp parallel
220 {
221// CHECK: #pragma omp for schedule(static)
222#pragma omp for schedule(static)
223 for (int idx = 0; idx < 1234; ++idx) {
224 //arg.foo = idx;
225 idx = arg.foo;
226 }
227 }
228}
229
Serge Pavlov7dcc97e2016-04-19 06:19:52 +0000230template<typename T>
231T S<T>::TS = 0;
232
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000233#endif