blob: 0e84c7ebdb4422c047c94509532db0e49dd97e24 [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 Bataev48c0bfb2016-01-20 09:07:54 +000032 }
33 S7 &operator=(S7 &s) {
34#pragma omp parallel private(a) private(this->a)
35 for (int k = 0; k < s.a.a; ++k)
36 ++s.a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000037#pragma omp parallel firstprivate(a) firstprivate(this->a)
38 for (int k = 0; k < s.a.a; ++k)
39 ++s.a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000040 return *this;
41 }
42};
43
44// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S1::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000045// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S1::a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000046// CHECK: #pragma omp parallel private(this->a) private(this->a) private(T::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000047// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(T::a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000048// CHECK: #pragma omp parallel private(this->a) private(this->a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000049// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000050
51class S8 : public S7<S1> {
52 S8() {}
53
54public:
55 S8(int v) : S7<S1>(v){
56#pragma omp parallel private(a) private(this->a) private(S7<S1>::a)
57 for (int k = 0; k < a.a; ++k)
58 ++this->a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000059#pragma omp parallel firstprivate(a) firstprivate(this->a) firstprivate(S7<S1>::a)
60 for (int k = 0; k < a.a; ++k)
61 ++this->a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000062 }
63 S8 &operator=(S8 &s) {
64#pragma omp parallel private(a) private(this->a)
65 for (int k = 0; k < s.a.a; ++k)
66 ++s.a.a;
Alexey Bataevd985eda2016-02-10 11:29:16 +000067#pragma omp parallel firstprivate(a) firstprivate(this->a)
68 for (int k = 0; k < s.a.a; ++k)
69 ++s.a.a;
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000070 return *this;
71 }
72};
73
74// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S7<S1>::a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000075// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a) firstprivate(this->S7<S1>::a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000076// CHECK: #pragma omp parallel private(this->a) private(this->a)
Alexey Bataevd985eda2016-02-10 11:29:16 +000077// CHECK: #pragma omp parallel firstprivate(this->a) firstprivate(this->a)
Alexey Bataev48c0bfb2016-01-20 09:07:54 +000078
Alexey Bataev568a8332014-03-06 06:15:19 +000079template <class T>
80struct S {
81 operator T() {return T();}
Alexey Bataevd48bcd82014-03-31 03:36:38 +000082 static T TS;
83 #pragma omp threadprivate(TS)
Alexey Bataev568a8332014-03-06 06:15:19 +000084};
Alexey Bataevd5af8e42013-10-01 05:32:34 +000085
Alexey Bataevd48bcd82014-03-31 03:36:38 +000086// CHECK: template <class T = int> struct S {
87// CHECK: static int TS;
88// CHECK-NEXT: #pragma omp threadprivate(S<int>::TS)
89// CHECK-NEXT: }
90// CHECK: template <class T = long> struct S {
91// CHECK: static long TS;
92// CHECK-NEXT: #pragma omp threadprivate(S<long>::TS)
93// CHECK-NEXT: }
94// CHECK: template <class T> struct S {
95// CHECK: static T TS;
96// CHECK-NEXT: #pragma omp threadprivate(S::TS)
97// CHECK: };
98
Alexey Bataevaf7849e2014-03-05 06:45:14 +000099template <typename T, int C>
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000100T tmain(T argc, T *argv) {
101 T b = argc, c, d, e, f, g;
102 static T a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000103 S<T> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000104 T arr[C][10], arr1[C];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000105#pragma omp parallel
106 a=2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000107#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 +0000108 foo();
Alexey Bataeva1764212015-09-30 09:22:36 +0000109#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 +0000110 foo();
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000111 return 0;
112}
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000113
Alexey Bataev568a8332014-03-06 06:15:19 +0000114// CHECK: template <typename T = int, int C = 5> int tmain(int argc, int *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000115// CHECK-NEXT: int b = argc, c, d, e, f, g;
116// CHECK-NEXT: static int a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000117// CHECK-NEXT: S<int> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000118// CHECK-NEXT: int arr[5][10], arr1[5];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000119// CHECK-NEXT: #pragma omp parallel
120// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000121// 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 +0000122// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000123// 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 +0000124// CHECK-NEXT: foo()
Alexey Bataev568a8332014-03-06 06:15:19 +0000125// CHECK: template <typename T = long, int C = 1> long tmain(long argc, long *argv) {
126// CHECK-NEXT: long b = argc, c, d, e, f, g;
127// CHECK-NEXT: static long a;
128// CHECK-NEXT: S<long> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000129// CHECK-NEXT: long arr[1][10], arr1[1];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000130// CHECK-NEXT: #pragma omp parallel
131// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000132// 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 +0000133// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000134// 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 +0000135// CHECK-NEXT: foo()
136// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000137// CHECK-NEXT: T b = argc, c, d, e, f, g;
138// CHECK-NEXT: static T a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000139// CHECK-NEXT: S<T> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000140// CHECK-NEXT: T arr[C][10], arr1[C];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000141// CHECK-NEXT: #pragma omp parallel
142// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000143// 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 +0000144// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000145// 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 +0000146// CHECK-NEXT: foo()
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000147
Alexey Bataev568a8332014-03-06 06:15:19 +0000148enum Enum { };
149
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000150int main (int argc, char **argv) {
Alexey Bataev568a8332014-03-06 06:15:19 +0000151 long x;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000152 int b = argc, c, d, e, f, g;
153 static int a;
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000154 #pragma omp threadprivate(a)
Alexey Bataeva1764212015-09-30 09:22:36 +0000155 int arr[10][argc], arr1[2];
Alexey Bataev568a8332014-03-06 06:15:19 +0000156 Enum ee;
157// CHECK: Enum ee;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000158#pragma omp parallel
159// CHECK-NEXT: #pragma omp parallel
160 a=2;
161// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000162#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])
163// 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 +0000164 foo();
165// CHECK-NEXT: foo();
Alexey Bataeva1764212015-09-30 09:22:36 +0000166// 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 +0000167// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000168#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 +0000169 foo();
Alexey Bataev568a8332014-03-06 06:15:19 +0000170 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000171}
172
Alexey Bataevc9bd03d2015-12-17 06:55:08 +0000173template <class T>
174struct Foo {
175 int foo;
176};
177
178void foo(const Foo<int> &arg) {
179// CHECK: #pragma omp parallel
180#pragma omp parallel
181 {
182// CHECK: #pragma omp for schedule(static)
183#pragma omp for schedule(static)
184 for (int idx = 0; idx < 1234; ++idx) {
185 //arg.foo = idx;
186 idx = arg.foo;
187 }
188 }
189}
190
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000191#endif