xref: /llvm-project/clang/test/OpenMP/target_parallel_ast_print.cpp (revision 1c1d9d9d7fd33fb142b40d03bd1fbbf9583197b4)
1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=50 -ast-print %s | FileCheck %s
2 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
3 // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
4 
5 // RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=50 -ast-print %s | FileCheck %s
6 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -std=c++11 -emit-pch -o %t %s
7 // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck %s
8 // expected-no-diagnostics
9 
10 #ifndef HEADER
11 #define HEADER
12 
13 void foo() {}
14 
15 template <class T>
16 struct S {
17   operator T() {return T();}
18   static T TS;
19   #pragma omp threadprivate(TS)
20 };
21 
22 // CHECK:      template <class T> struct S {
23 // CHECK:        static T TS;
24 // CHECK-NEXT:   #pragma omp threadprivate(S::TS)
25 // CHECK:      };
26 // 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<char> {
31 // CHECK:        static char TS;
32 // CHECK-NEXT:   #pragma omp threadprivate(S<char>::TS)
33 // CHECK-NEXT: }
34 
35 template <typename T, int C>
36 T tmain(T argc, T *argv) {
37   T b = argc, c, d, e, f, g;
38   static T h;
39   S<T> s;
40   T arr[C][10], arr1[C];
41   T i, j, a[20];
42 #pragma omp target parallel
43   h=2;
44 #pragma omp target parallel allocate(argv) default(none), private(argc,b) firstprivate(argv) shared (d) if (parallel:argc > 0) num_threads(C) proc_bind(master) reduction(+:c, arr1[argc]) reduction(max:e, arr[:C][0:10])
45   foo();
46 #pragma omp target parallel if (C) num_threads(s) proc_bind(close) reduction(^:e, f, arr[0:C][:argc]) reduction(&& : g) allocate(g)
47   foo();
48 #pragma omp target parallel if (target:argc > 0)
49   foo();
50 #pragma omp target parallel if (parallel:argc > 0)
51   foo();
52 #pragma omp target parallel if (C)
53   foo();
54 #pragma omp target parallel map(i)
55   foo();
56 #pragma omp target parallel map(a[0:10], i)
57   foo();
58 #pragma omp target parallel map(to: i) map(from: j)
59   foo();
60 #pragma omp target parallel map(always,alloc: i)
61   foo();
62 #pragma omp target parallel nowait
63   foo();
64 #pragma omp target parallel depend(in : argc, argv[i:argc], a[:])
65   foo();
66 #pragma omp target parallel defaultmap(tofrom: scalar)
67   foo();
68   return 0;
69 }
70 
71 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
72 // CHECK-NEXT: T b = argc, c, d, e, f, g;
73 // CHECK-NEXT: static T h;
74 // CHECK-NEXT: S<T> s;
75 // CHECK-NEXT: T arr[C][10], arr1[C];
76 // CHECK-NEXT: T i, j, a[20]
77 // CHECK-NEXT: #pragma omp target parallel{{$}}
78 // CHECK-NEXT: h = 2;
79 // CHECK-NEXT: #pragma omp target parallel allocate(argv) default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(C) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:C][0:10])
80 // CHECK-NEXT: foo()
81 // CHECK-NEXT: #pragma omp target parallel if(C) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:C][:argc]) reduction(&&: g) allocate(g)
82 // CHECK-NEXT: foo()
83 // CHECK-NEXT: #pragma omp target parallel if(target: argc > 0)
84 // CHECK-NEXT: foo()
85 // CHECK-NEXT: #pragma omp target parallel if(parallel: argc > 0)
86 // CHECK-NEXT: foo()
87 // CHECK-NEXT: #pragma omp target parallel if(C)
88 // CHECK-NEXT: foo()
89 // CHECK-NEXT: #pragma omp target parallel map(tofrom: i)
90 // CHECK-NEXT: foo()
91 // CHECK-NEXT: #pragma omp target parallel map(tofrom: a[0:10],i)
92 // CHECK-NEXT: foo()
93 // CHECK-NEXT: #pragma omp target parallel map(to: i) map(from: j)
94 // CHECK-NEXT: foo()
95 // CHECK-NEXT: #pragma omp target parallel map(always,alloc: i)
96 // CHECK-NEXT: foo()
97 // CHECK-NEXT: #pragma omp target parallel nowait
98 // CHECK-NEXT: foo()
99 // CHECK-NEXT: #pragma omp target parallel depend(in : argc,argv[i:argc],a[:])
100 // CHECK-NEXT: foo()
101 // CHECK-NEXT: #pragma omp target parallel defaultmap(tofrom: scalar)
102 // CHECK-NEXT: foo()
103 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
104 // CHECK-NEXT: int b = argc, c, d, e, f, g;
105 // CHECK-NEXT: static int h;
106 // CHECK-NEXT: S<int> s;
107 // CHECK-NEXT: int arr[5][10], arr1[5];
108 // CHECK-NEXT: int i, j, a[20]
109 // CHECK-NEXT: #pragma omp target parallel
110 // CHECK-NEXT: h = 2;
111 // CHECK-NEXT: #pragma omp target parallel allocate(argv) default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(5) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:5][0:10])
112 // CHECK-NEXT: foo()
113 // CHECK-NEXT: #pragma omp target parallel if(5) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:5][:argc]) reduction(&&: g) allocate(g)
114 // CHECK-NEXT: foo()
115 // CHECK-NEXT: #pragma omp target parallel if(target: argc > 0)
116 // CHECK-NEXT: foo()
117 // CHECK-NEXT: #pragma omp target parallel if(parallel: argc > 0)
118 // CHECK-NEXT: foo()
119 // CHECK-NEXT: #pragma omp target parallel if(5)
120 // CHECK-NEXT: foo()
121 // CHECK-NEXT: #pragma omp target parallel map(tofrom: i)
122 // CHECK-NEXT: foo()
123 // CHECK-NEXT: #pragma omp target parallel map(tofrom: a[0:10],i)
124 // CHECK-NEXT: foo()
125 // CHECK-NEXT: #pragma omp target parallel map(to: i) map(from: j)
126 // CHECK-NEXT: foo()
127 // CHECK-NEXT: #pragma omp target parallel map(always,alloc: i)
128 // CHECK-NEXT: foo()
129 // CHECK-NEXT: #pragma omp target parallel nowait
130 // CHECK-NEXT: foo()
131 // CHECK-NEXT: #pragma omp target parallel depend(in : argc,argv[i:argc],a[:])
132 // CHECK-NEXT: foo()
133 // CHECK-NEXT: #pragma omp target parallel defaultmap(tofrom: scalar)
134 // CHECK-NEXT: foo()
135 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
136 // CHECK-NEXT: char b = argc, c, d, e, f, g;
137 // CHECK-NEXT: static char h;
138 // CHECK-NEXT: S<char> s;
139 // CHECK-NEXT: char arr[1][10], arr1[1];
140 // CHECK-NEXT: char i, j, a[20]
141 // CHECK-NEXT: #pragma omp target parallel
142 // CHECK-NEXT: h = 2;
143 // CHECK-NEXT: #pragma omp target parallel allocate(argv) default(none) private(argc,b) firstprivate(argv) shared(d) if(parallel: argc > 0) num_threads(1) proc_bind(master) reduction(+: c,arr1[argc]) reduction(max: e,arr[:1][0:10])
144 // CHECK-NEXT: foo()
145 // CHECK-NEXT: #pragma omp target parallel if(1) num_threads(s) proc_bind(close) reduction(^: e,f,arr[0:1][:argc]) reduction(&&: g) allocate(g)
146 // CHECK-NEXT: foo()
147 // CHECK-NEXT: #pragma omp target parallel if(target: argc > 0)
148 // CHECK-NEXT: foo()
149 // CHECK-NEXT: #pragma omp target parallel if(parallel: argc > 0)
150 // CHECK-NEXT: foo()
151 // CHECK-NEXT: #pragma omp target parallel if(1)
152 // CHECK-NEXT: foo()
153 // CHECK-NEXT: #pragma omp target parallel map(tofrom: i)
154 // CHECK-NEXT: foo()
155 // CHECK-NEXT: #pragma omp target parallel map(tofrom: a[0:10],i)
156 // CHECK-NEXT: foo()
157 // CHECK-NEXT: #pragma omp target parallel map(to: i) map(from: j)
158 // CHECK-NEXT: foo()
159 // CHECK-NEXT: #pragma omp target parallel map(always,alloc: i)
160 // CHECK-NEXT: foo()
161 // CHECK-NEXT: #pragma omp target parallel nowait
162 // CHECK-NEXT: foo()
163 // CHECK-NEXT: #pragma omp target parallel depend(in : argc,argv[i:argc],a[:])
164 // CHECK-NEXT: foo()
165 // CHECK-NEXT: #pragma omp target parallel defaultmap(tofrom: scalar)
166 // CHECK-NEXT: foo()
167 
168 // CHECK-LABEL: int main(int argc, char **argv) {
169 int main (int argc, char **argv) {
170   int i, j, a[20];
171 // CHECK-NEXT: int i, j, a[20]
172 #pragma omp target parallel
173 // CHECK-NEXT: #pragma omp target parallel
174   foo();
175 // CHECK-NEXT: foo();
176 #pragma omp target parallel if (argc > 0)
177 // CHECK-NEXT: #pragma omp target parallel if(argc > 0)
178   foo();
179 // CHECK-NEXT: foo();
180 
181 #pragma omp target parallel if (target: argc > 0)
182 // CHECK-NEXT: #pragma omp target parallel if(target: argc > 0)
183   foo();
184 // CHECK-NEXT: foo();
185 
186 #pragma omp target parallel if (parallel: argc > 0)
187 // CHECK-NEXT: #pragma omp target parallel if(parallel: argc > 0)
188   foo();
189 // CHECK-NEXT: foo();
190 
191 #pragma omp target parallel map(i) if(argc>0)
192 // CHECK-NEXT: #pragma omp target parallel map(tofrom: i) if(argc > 0)
193   foo();
194 // CHECK-NEXT: foo();
195 
196 #pragma omp target parallel map(i)
197 // CHECK-NEXT: #pragma omp target parallel map(tofrom: i)
198   foo();
199 // CHECK-NEXT: foo();
200 
201 #pragma omp target parallel map(a[0:10], i)
202 // CHECK-NEXT: #pragma omp target parallel map(tofrom: a[0:10],i)
203   foo();
204 // CHECK-NEXT: foo();
205 
206 #pragma omp target parallel map(to: i) map(from: j)
207 // CHECK-NEXT: #pragma omp target parallel map(to: i) map(from: j)
208   foo();
209 // CHECK-NEXT: foo();
210 
211 #pragma omp target parallel map(always,alloc: i)
212 // CHECK-NEXT: #pragma omp target parallel map(always,alloc: i)
213   foo();
214 // CHECK-NEXT: foo();
215 
216 #pragma omp target parallel nowait
217 // CHECK-NEXT: #pragma omp target parallel nowait
218   foo();
219 // CHECK-NEXT: foo();
220 
221 #pragma omp target parallel depend(in : argc, argv[i:argc], a[:])
222 // CHECK-NEXT: #pragma omp target parallel depend(in : argc,argv[i:argc],a[:])
223   foo();
224 // CHECK-NEXT: foo();
225 
226 #pragma omp target parallel defaultmap(tofrom: scalar) reduction(task, +:argc)
227 // CHECK-NEXT: #pragma omp target parallel defaultmap(tofrom: scalar) reduction(task, +: argc)
228   foo();
229 // CHECK-NEXT: foo();
230 
231   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
232 }
233 
234 extern template int S<int>::TS;
235 extern template char S<char>::TS;
236 
237 #endif
238