blob: 88d8053cc7aba2c3d9bd31140d305a980d99553a [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;
29 }
30 S7 &operator=(S7 &s) {
31#pragma omp parallel private(a) private(this->a)
32 for (int k = 0; k < s.a.a; ++k)
33 ++s.a.a;
34 return *this;
35 }
36};
37
38// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S1::a)
39// CHECK: #pragma omp parallel private(this->a) private(this->a) private(T::a)
40// CHECK: #pragma omp parallel private(this->a) private(this->a)
41
42class S8 : public S7<S1> {
43 S8() {}
44
45public:
46 S8(int v) : S7<S1>(v){
47#pragma omp parallel private(a) private(this->a) private(S7<S1>::a)
48 for (int k = 0; k < a.a; ++k)
49 ++this->a.a;
50 }
51 S8 &operator=(S8 &s) {
52#pragma omp parallel private(a) private(this->a)
53 for (int k = 0; k < s.a.a; ++k)
54 ++s.a.a;
55 return *this;
56 }
57};
58
59// CHECK: #pragma omp parallel private(this->a) private(this->a) private(this->S7<S1>::a)
60// CHECK: #pragma omp parallel private(this->a) private(this->a)
61
Alexey Bataev568a8332014-03-06 06:15:19 +000062template <class T>
63struct S {
64 operator T() {return T();}
Alexey Bataevd48bcd82014-03-31 03:36:38 +000065 static T TS;
66 #pragma omp threadprivate(TS)
Alexey Bataev568a8332014-03-06 06:15:19 +000067};
Alexey Bataevd5af8e42013-10-01 05:32:34 +000068
Alexey Bataevd48bcd82014-03-31 03:36:38 +000069// CHECK: template <class T = int> struct S {
70// CHECK: static int TS;
71// CHECK-NEXT: #pragma omp threadprivate(S<int>::TS)
72// CHECK-NEXT: }
73// CHECK: template <class T = long> struct S {
74// CHECK: static long TS;
75// CHECK-NEXT: #pragma omp threadprivate(S<long>::TS)
76// CHECK-NEXT: }
77// CHECK: template <class T> struct S {
78// CHECK: static T TS;
79// CHECK-NEXT: #pragma omp threadprivate(S::TS)
80// CHECK: };
81
Alexey Bataevaf7849e2014-03-05 06:45:14 +000082template <typename T, int C>
Alexey Bataevd5af8e42013-10-01 05:32:34 +000083T tmain(T argc, T *argv) {
84 T b = argc, c, d, e, f, g;
85 static T a;
Alexey Bataev568a8332014-03-06 06:15:19 +000086 S<T> s;
Alexey Bataeva1764212015-09-30 09:22:36 +000087 T arr[C][10], arr1[C];
Alexey Bataevd5af8e42013-10-01 05:32:34 +000088#pragma omp parallel
89 a=2;
Alexey Bataeva1764212015-09-30 09:22:36 +000090#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 +000091 foo();
Alexey Bataeva1764212015-09-30 09:22:36 +000092#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 +000093 foo();
Alexey Bataevd5af8e42013-10-01 05:32:34 +000094 return 0;
95}
Alexey Bataevd48bcd82014-03-31 03:36:38 +000096
Alexey Bataev568a8332014-03-06 06:15:19 +000097// CHECK: template <typename T = int, int C = 5> int tmain(int argc, int *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +000098// CHECK-NEXT: int b = argc, c, d, e, f, g;
99// CHECK-NEXT: static int a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000100// CHECK-NEXT: S<int> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000101// CHECK-NEXT: int arr[5][10], arr1[5];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000102// CHECK-NEXT: #pragma omp parallel
103// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000104// 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 +0000105// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000106// 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 +0000107// CHECK-NEXT: foo()
Alexey Bataev568a8332014-03-06 06:15:19 +0000108// CHECK: template <typename T = long, int C = 1> long tmain(long argc, long *argv) {
109// CHECK-NEXT: long b = argc, c, d, e, f, g;
110// CHECK-NEXT: static long a;
111// CHECK-NEXT: S<long> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000112// CHECK-NEXT: long arr[1][10], arr1[1];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000113// CHECK-NEXT: #pragma omp parallel
114// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000115// 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 +0000116// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000117// 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 +0000118// CHECK-NEXT: foo()
119// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000120// CHECK-NEXT: T b = argc, c, d, e, f, g;
121// CHECK-NEXT: static T a;
Alexey Bataev568a8332014-03-06 06:15:19 +0000122// CHECK-NEXT: S<T> s;
Alexey Bataeva1764212015-09-30 09:22:36 +0000123// CHECK-NEXT: T arr[C][10], arr1[C];
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000124// CHECK-NEXT: #pragma omp parallel
125// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000126// 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 +0000127// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000128// 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 +0000129// CHECK-NEXT: foo()
Alexey Bataevd5af8e42013-10-01 05:32:34 +0000130
Alexey Bataev568a8332014-03-06 06:15:19 +0000131enum Enum { };
132
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000133int main (int argc, char **argv) {
Alexey Bataev568a8332014-03-06 06:15:19 +0000134 long x;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000135 int b = argc, c, d, e, f, g;
136 static int a;
Alexey Bataevd48bcd82014-03-31 03:36:38 +0000137 #pragma omp threadprivate(a)
Alexey Bataeva1764212015-09-30 09:22:36 +0000138 int arr[10][argc], arr1[2];
Alexey Bataev568a8332014-03-06 06:15:19 +0000139 Enum ee;
140// CHECK: Enum ee;
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000141#pragma omp parallel
142// CHECK-NEXT: #pragma omp parallel
143 a=2;
144// CHECK-NEXT: a = 2;
Alexey Bataeva1764212015-09-30 09:22:36 +0000145#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])
146// 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 +0000147 foo();
148// CHECK-NEXT: foo();
Alexey Bataeva1764212015-09-30 09:22:36 +0000149// 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 +0000150// CHECK-NEXT: foo()
Alexey Bataeva1764212015-09-30 09:22:36 +0000151#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 +0000152 foo();
Alexey Bataev568a8332014-03-06 06:15:19 +0000153 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000154}
155
Alexey Bataevc9bd03d2015-12-17 06:55:08 +0000156template <class T>
157struct Foo {
158 int foo;
159};
160
161void foo(const Foo<int> &arg) {
162// CHECK: #pragma omp parallel
163#pragma omp parallel
164 {
165// CHECK: #pragma omp for schedule(static)
166#pragma omp for schedule(static)
167 for (int idx = 0; idx < 1234; ++idx) {
168 //arg.foo = idx;
169 idx = arg.foo;
170 }
171 }
172}
173
Alexey Bataev5ec3eb12013-07-19 03:13:43 +0000174#endif