blob: 569288163433a4cf2efca5c45a8c1b5d9b005a97 [file] [log] [blame]
Alexey Bataev2a6de8c2016-12-20 12:10:05 +00001// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -ast-print %s | FileCheck %s
2// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
3// RUN: %clang_cc1 -fopenmp -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
Alexey Bataeva8a9153a2017-12-29 18:07:07 +00004
5// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 -ast-print %s | FileCheck %s
6// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -x c++ -std=c++11 -emit-pch -o %t %s
7// RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=45 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
Alexey Bataev84d0b3e2014-07-08 08:12:03 +00008// expected-no-diagnostics
9
10#ifndef HEADER
11#define HEADER
12
13void foo() {}
14
15template <class T>
16struct S {
17 operator T() { return T(); }
18 static T TS;
19#pragma omp threadprivate(TS)
20};
21
Alexey Bataev84d0b3e2014-07-08 08:12:03 +000022// CHECK: template <class T> struct S {
23// CHECK: static T TS;
24// CHECK-NEXT: #pragma omp threadprivate(S::TS)
25// CHECK: };
Serge Pavlova67a4d22016-11-10 08:49:37 +000026// CHECK: template<> struct S<int> {
27// CHECK: static int TS;
28// CHECK-NEXT: #pragma omp threadprivate(S<int>::TS)
29// CHECK-NEXT: }
30// CHECK: template<> struct S<long> {
31// CHECK: static long TS;
32// CHECK-NEXT: #pragma omp threadprivate(S<long>::TS)
33// CHECK-NEXT: }
Alexey Bataev84d0b3e2014-07-08 08:12:03 +000034
35template <typename T, int C>
36T tmain(T argc, T *argv) {
37 T b = argc, c, d, e, f, g;
38 static T a;
39 S<T> s;
40#pragma omp parallel sections
41 {
42 a = 2;
43 }
Alexey Bataeve04483e2019-03-27 14:14:31 +000044#pragma omp parallel sections 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) reduction(max : e) allocate(e)
Alexey Bataev84d0b3e2014-07-08 08:12:03 +000045 {
46 foo();
47 }
Alexey Bataeve04483e2019-03-27 14:14:31 +000048#pragma omp parallel sections allocate(b) if (C) num_threads(s) proc_bind(close) reduction(^ : e, f) reduction(&& : g) lastprivate(b, c)
Alexey Bataev84d0b3e2014-07-08 08:12:03 +000049 {
50 foo();
51#pragma omp section
52 foo();
53 }
54 return 0;
55}
56
Serge Pavlova67a4d22016-11-10 08:49:37 +000057// CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
58// CHECK-NEXT: T b = argc, c, d, e, f, g;
59// CHECK-NEXT: static T a;
60// CHECK-NEXT: S<T> s;
Alexey Bataevcbecfdf2018-02-14 17:38:47 +000061// CHECK-NEXT: #pragma omp parallel sections{{$}}
Serge Pavlova67a4d22016-11-10 08:49:37 +000062// CHECK-NEXT: {
63// CHECK-NEXT: a = 2;
64// CHECK-NEXT: }
Alexey Bataeve04483e2019-03-27 14:14:31 +000065// CHECK-NEXT: #pragma omp parallel sections 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) reduction(max: e) allocate(e)
Serge Pavlova67a4d22016-11-10 08:49:37 +000066// CHECK-NEXT: {
67// CHECK-NEXT: foo();
68// CHECK-NEXT: }
Alexey Bataeve04483e2019-03-27 14:14:31 +000069// CHECK-NEXT: #pragma omp parallel sections allocate(b) if(C) num_threads(s) proc_bind(close) reduction(^: e,f) reduction(&&: g) lastprivate(b,c)
Serge Pavlova67a4d22016-11-10 08:49:37 +000070// CHECK-NEXT: {
71// CHECK-NEXT: foo();
72// CHECK-NEXT: #pragma omp section
73// CHECK-NEXT: foo();
74// CHECK-NEXT: }
75// CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
Alexey Bataev84d0b3e2014-07-08 08:12:03 +000076// CHECK-NEXT: int b = argc, c, d, e, f, g;
77// CHECK-NEXT: static int a;
78// CHECK-NEXT: S<int> s;
79// CHECK-NEXT: #pragma omp parallel sections
80// CHECK-NEXT: {
81// CHECK-NEXT: a = 2;
82// CHECK-NEXT: }
Alexey Bataeve04483e2019-03-27 14:14:31 +000083// CHECK-NEXT: #pragma omp parallel sections 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) reduction(max: e) allocate(e)
Alexey Bataev84d0b3e2014-07-08 08:12:03 +000084// CHECK-NEXT: {
85// CHECK-NEXT: foo();
86// CHECK-NEXT: }
Alexey Bataeve04483e2019-03-27 14:14:31 +000087// CHECK-NEXT: #pragma omp parallel sections allocate(b) if(5) num_threads(s) proc_bind(close) reduction(^: e,f) reduction(&&: g) lastprivate(b,c)
Alexey Bataev84d0b3e2014-07-08 08:12:03 +000088// CHECK-NEXT: {
89// CHECK-NEXT: foo();
90// CHECK-NEXT: #pragma omp section
91// CHECK-NEXT: foo();
92// CHECK-NEXT: }
Serge Pavlova67a4d22016-11-10 08:49:37 +000093// CHECK: template<> long tmain<long, 1>(long argc, long *argv) {
Alexey Bataev84d0b3e2014-07-08 08:12:03 +000094// CHECK-NEXT: long b = argc, c, d, e, f, g;
95// CHECK-NEXT: static long a;
96// CHECK-NEXT: S<long> s;
97// CHECK-NEXT: #pragma omp parallel sections
98// CHECK-NEXT: {
99// CHECK-NEXT: a = 2;
100// CHECK-NEXT: }
Alexey Bataeve04483e2019-03-27 14:14:31 +0000101// CHECK-NEXT: #pragma omp parallel sections 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) reduction(max: e) allocate(e)
Alexey Bataev84d0b3e2014-07-08 08:12:03 +0000102// CHECK-NEXT: {
103// CHECK-NEXT: foo();
104// CHECK-NEXT: }
Alexey Bataeve04483e2019-03-27 14:14:31 +0000105// CHECK-NEXT: #pragma omp parallel sections allocate(b) if(1) num_threads(s) proc_bind(close) reduction(^: e,f) reduction(&&: g) lastprivate(b,c)
Alexey Bataev84d0b3e2014-07-08 08:12:03 +0000106// CHECK-NEXT: {
107// CHECK-NEXT: foo();
108// CHECK-NEXT: #pragma omp section
109// CHECK-NEXT: foo();
110// CHECK-NEXT: }
Alexey Bataev84d0b3e2014-07-08 08:12:03 +0000111
112enum Enum {};
113
114int main(int argc, char **argv) {
115 long x;
116 int b = argc, c, d, e, f, g;
117 static int a;
118#pragma omp threadprivate(a)
119 Enum ee;
120// CHECK: Enum ee;
121#pragma omp parallel sections
122 // CHECK-NEXT: #pragma omp parallel sections
123 {
124 a = 2;
125 }
126// CHECK-NEXT: {
127// CHECK-NEXT: a = 2;
128// CHECK-NEXT: }
129#pragma omp parallel sections default(none), private(argc, b) firstprivate(argv) if (argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(| : c, d) reduction(* : e) lastprivate(argv)
130 // CHECK-NEXT: #pragma omp parallel sections default(none) private(argc,b) firstprivate(argv) if(argc > 0) num_threads(ee) copyin(a) proc_bind(spread) reduction(|: c,d) reduction(*: e) lastprivate(argv)
131 {
132 foo();
133#pragma omp section
134 foo();
135#pragma omp section
136 foo();
137 }
138 // CHECK-NEXT: {
139 // CHECK-NEXT: foo();
140 // CHECK-NEXT: #pragma omp section
141 // CHECK-NEXT: foo();
142 // CHECK-NEXT: #pragma omp section
143 // CHECK-NEXT: foo();
144 // CHECK-NEXT: }
145 return tmain<int, 5>(b, &b) + tmain<long, 1>(x, &x);
146}
147
Serge Pavlov7dcc97e2016-04-19 06:19:52 +0000148template<typename T>
149T S<T>::TS = 0;
150
Alexey Bataev84d0b3e2014-07-08 08:12:03 +0000151#endif