blob: b73ab4e22b31ff9efa6f0df38bae9c0fd9380139 [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;
16};
17
18template <typename T>
19class S7 : public T {
20protected:
21 T a;
22 S7() : a(0) {}
23
24public:
25 S7(typename T::type v) : a(v) {
26#pragma omp parallel private(a) private(this->a) private(T::a)
27 for (int k = 0; k < a.a; ++k)
28 ++this->a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000029#pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(T::a)
30 for (int k = 0; k < a.a; ++k)
31 ++this->a.a;
Alexey Bataevb7a34b62016-02-25 03:59:29 +000032#pragma omp parallel shared(a) shared(this->a) shared(T::a)
33 for (int k = 0; k < a.a; ++k)
34 ++this->a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000035 }
36 S7 &operator=(S7 &s) {
37#pragma omp parallel private(a) private(this->a)
38 for (int k = 0; k < s.a.a; ++k)
39 ++s.a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000040#pragma omp parallel firstprivate(a) firstprivate(this->a)
41 for (int k = 0; k < s.a.a; ++k)
42 ++s.a.a;
Alexey Bataevb7a34b62016-02-25 03:59:29 +000043#pragma omp parallel shared(a) shared(this->a)
44 for (int k = 0; k < s.a.a; ++k)
45 ++s.a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000046 return *this;
47 }
48};
49
50// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S1::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000051// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S1::a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +000052// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(this->S1::a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000053// CHECK: #pragma omp parallel private(this->a) private(this->a) private(T::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000054// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(T::a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +000055// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(T::a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000056// CHECK: #pragma omp parallel private(this->a) private(this->a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000057// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +000058// CHECK: #pragma omp parallel shared(this->a) shared(this->a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000059
60class S8 : public S7<S1> {
61 S8() {}
62
63public:
64 S8(int v) : S7<S1>(v){
Alexey Bataevb7a34b62016-02-25 03:59:29 +000065#pragma omp parallel private(a) private(this->a) private(S7 < S1 > ::a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000066 for (int k = 0; k < a.a; ++k)
67 ++this->a.a;
Alexey Bataevb7a34b62016-02-25 03:59:29 +000068#pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(S7 < S1 > ::a)
69 for (int k = 0; k < a.a; ++k)
70 ++this->a.a;
71#pragma omp parallel shared(a) shared(this->a) shared(S7 < S1 > ::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000072 for (int k = 0; k < a.a; ++k)
73 ++this->a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000074 }
75 S8 &operator=(S8 &s) {
76#pragma omp parallel private(a) private(this->a)
77 for (int k = 0; k < s.a.a; ++k)
78 ++s.a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000079#pragma omp parallel firstprivate(a) firstprivate(this->a)
80 for (int k = 0; k < s.a.a; ++k)
81 ++s.a.a;
Alexey Bataevb7a34b62016-02-25 03:59:29 +000082#pragma omp parallel shared(a) shared(this->a)
83 for (int k = 0; k < s.a.a; ++k)
84 ++s.a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000085 return *this;
86 }
87};
88
89// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S7<S1>::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000090// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S7<S1>::a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +000091// CHECK: #pragma omp parallel shared(this->a) shared(this->a) shared(this->S7<S1>::a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000092// CHECK: #pragma omp parallel private(this->a) private(this->a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000093// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)
Alexey Bataevb7a34b62016-02-25 03:59:29 +000094// CHECK: #pragma omp parallel shared(this->a) shared(this->a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000095
Alexey Bataev568a8332014-03-06 06:15:19 +000096template <class T>
97struct S {
98 operator T() {return T();}
Alexey Bataevd48bcd82014-03-31 03:36:38 +000099 static T TS;
100 #pragma omp threadprivate(TS)
Alexey Bataev568a8332014-03-06 06:15:19 +0000101};
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000102
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000103// CHECK: template <class T = int> struct S {
104// CHECK: static int TS;
105// CHECK-NEXT: #pragma omp threadprivate(S<int>::TS)
106// CHECK-NEXT: }
107// CHECK: template <class T = long> struct S {
108// CHECK: static long TS;
109// CHECK-NEXT: #pragma omp threadprivate(S<long>::TS)
110// CHECK-NEXT: }
111// CHECK: template <class T> struct S {
112// CHECK: static T TS;
113// CHECK-NEXT: #pragma omp threadprivate(S::TS)
114// CHECK: };
115
Alexey Bataevaf7849e2014-03-05 06:45:14 +0000116template <typename T, int C>
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000117T tmain(T argc, T *argv) {
118 T b = argc, c, d, e, f, g;
119 static T a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000120 S<T> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000121 T arr[C][10], arr1[C];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000122#pragma omp parallel
123 a=2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000124#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 +0000125 foo();
Alexey Bataeva1764212015-09-30 09:22:36 +0000126#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 +0000127 foo();
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000128 return 0;
129}
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000130
Alexey Bataev568a8332014-03-06 06:15:19 +0000131// CHECK: template <typename T = int, int C = 5> int tmain(int argc, int *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000132// CHECK-NEXT: int b = argc, c, d, e, f, g;
133// CHECK-NEXT: static int a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000134// CHECK-NEXT: S<int> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000135// CHECK-NEXT: int arr[5][10], arr1[5];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000136// CHECK-NEXT: #pragma omp parallel
137// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000138// 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 +0000139// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000140// 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 +0000141// CHECK-NEXT: foo()
Alexey Bataev568a8332014-03-06 06:15:19 +0000142// CHECK: template <typename T = long, int C = 1> long tmain(long argc, long *argv) {
143// CHECK-NEXT: long b = argc, c, d, e, f, g;
144// CHECK-NEXT: static long a;
145// CHECK-NEXT: S<long> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000146// CHECK-NEXT: long arr[1][10], arr1[1];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000147// CHECK-NEXT: #pragma omp parallel
148// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000149// 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 +0000150// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000151// 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 +0000152// CHECK-NEXT: foo()
153// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000154// CHECK-NEXT: T b = argc, c, d, e, f, g;
155// CHECK-NEXT: static T a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000156// CHECK-NEXT: S<T> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000157// CHECK-NEXT: T arr[C][10], arr1[C];
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(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 +0000161// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000162// 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 +0000163// CHECK-NEXT: foo()
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000164
Alexey Bataev568a8332014-03-06 06:15:19 +0000165enum Enum { };
166
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000167int main (int argc, char **argv) {
Alexey Bataev568a8332014-03-06 06:15:19 +0000168 long x;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000169 int b = argc, c, d, e, f, g;
170 static int a;
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000171 #pragma omp threadprivate(a)
Alexey Bataeva1764212015-09-30 09:22:36 +0000172 int arr[10][argc], arr1[2];
Alexey Bataev568a8332014-03-06 06:15:19 +0000173 Enum ee;
174// CHECK: Enum ee;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000175#pragma omp parallel
176// CHECK-NEXT: #pragma omp parallel
177 a=2;
178// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000179#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])
180// 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 +0000181 foo();
182// CHECK-NEXT: foo();
Alexey Bataeva1764212015-09-30 09:22:36 +0000183// 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 +0000184// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000185#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 +0000186 foo();
Alexey Bataev568a8332014-03-06 06:15:19 +0000187 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000188}
189
Alexey Bataevc9bd03d2015-12-17 06:55:08 +0000190template <class T>
191struct Foo {
192 int foo;
193};
194
195void foo(const Foo<int> &arg) {
196// CHECK: #pragma omp parallel
197#pragma omp parallel
198 {
199// CHECK: #pragma omp for schedule(static)
200#pragma omp for schedule(static)
201 for (int idx = 0; idx < 1234; ++idx) {
202 //arg.foo = idx;
203 idx = arg.foo;
204 }
205 }
206}
207
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000208#endif