1 // 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
4 // expected-no-diagnostics
5 
6 #ifndef HEADER
7 #define HEADER
8 
9 void foo() {}
10 
11 template <typename T, int C>
12 T tmain(T argc, T *argv) {
13   T i, j, a[20], always;
14 #pragma omp target
15   foo();
16 #pragma omp target if (target:argc > 0)
17   foo();
18 #pragma omp target if (C)
19   foo();
20 #pragma omp target map(i)
21   foo();
22 #pragma omp target map(a[0:10], i)
23   foo();
24 #pragma omp target map(to: i) map(from: j)
25   foo();
26 #pragma omp target map(always,alloc: i)
27   foo();
28 #pragma omp target map(always from: i)
29   foo();
30 #pragma omp target map(always)
31   {always++;}
32 #pragma omp target map(always,i)
33   {always++;i++;}
34 #pragma omp target nowait
35   foo();
36 #pragma omp target depend(in : argc, argv[i:argc], a[:])
37   foo();
38 #pragma omp target defaultmap(tofrom: scalar)
39   foo();
40   return 0;
41 }
42 
43 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) {
44 // CHECK-NEXT: T i, j, a[20]
45 // CHECK-NEXT: #pragma omp target
46 // CHECK-NEXT: foo();
47 // CHECK-NEXT: #pragma omp target if(target: argc > 0)
48 // CHECK-NEXT: foo()
49 // CHECK-NEXT: #pragma omp target if(C)
50 // CHECK-NEXT: foo()
51 // CHECK-NEXT: #pragma omp target map(tofrom: i)
52 // CHECK-NEXT: foo()
53 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i)
54 // CHECK-NEXT: foo()
55 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j)
56 // CHECK-NEXT: foo()
57 // CHECK-NEXT: #pragma omp target map(always,alloc: i)
58 // CHECK-NEXT: foo()
59 // CHECK-NEXT: #pragma omp target map(always,from: i)
60 // CHECK-NEXT: foo()
61 // CHECK-NEXT: #pragma omp target map(tofrom: always)
62 // CHECK-NEXT: {
63 // CHECK-NEXT: always++;
64 // CHECK-NEXT: }
65 // CHECK-NEXT: #pragma omp target map(tofrom: always,i)
66 // CHECK-NEXT: {
67 // CHECK-NEXT: always++;
68 // CHECK-NEXT: i++;
69 // CHECK-NEXT: }
70 // CHECK-NEXT: #pragma omp target nowait
71 // CHECK-NEXT: foo()
72 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
73 // CHECK-NEXT: foo()
74 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar)
75 // CHECK-NEXT: foo()
76 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) {
77 // CHECK-NEXT: int i, j, a[20]
78 // CHECK-NEXT: #pragma omp target
79 // CHECK-NEXT: foo();
80 // CHECK-NEXT: #pragma omp target if(target: argc > 0)
81 // CHECK-NEXT: foo()
82 // CHECK-NEXT: #pragma omp target if(5)
83 // CHECK-NEXT: foo()
84 // CHECK-NEXT: #pragma omp target map(tofrom: i)
85 // CHECK-NEXT: foo()
86 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i)
87 // CHECK-NEXT: foo()
88 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j)
89 // CHECK-NEXT: foo()
90 // CHECK-NEXT: #pragma omp target map(always,alloc: i)
91 // CHECK-NEXT: foo()
92 // CHECK-NEXT: #pragma omp target map(always,from: i)
93 // CHECK-NEXT: foo()
94 // CHECK-NEXT: #pragma omp target map(tofrom: always)
95 // CHECK-NEXT: {
96 // CHECK-NEXT: always++;
97 // CHECK-NEXT: }
98 // CHECK-NEXT: #pragma omp target map(tofrom: always,i)
99 // CHECK-NEXT: {
100 // CHECK-NEXT: always++;
101 // CHECK-NEXT: i++;
102 // CHECK-NEXT: }
103 // CHECK-NEXT: #pragma omp target nowait
104 // CHECK-NEXT: foo()
105 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
106 // CHECK-NEXT: foo()
107 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar)
108 // CHECK-NEXT: foo()
109 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) {
110 // CHECK-NEXT: char i, j, a[20]
111 // CHECK-NEXT: #pragma omp target
112 // CHECK-NEXT: foo();
113 // CHECK-NEXT: #pragma omp target if(target: argc > 0)
114 // CHECK-NEXT: foo()
115 // CHECK-NEXT: #pragma omp target if(1)
116 // CHECK-NEXT: foo()
117 // CHECK-NEXT: #pragma omp target map(tofrom: i)
118 // CHECK-NEXT: foo()
119 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i)
120 // CHECK-NEXT: foo()
121 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j)
122 // CHECK-NEXT: foo()
123 // CHECK-NEXT: #pragma omp target map(always,alloc: i)
124 // CHECK-NEXT: foo()
125 // CHECK-NEXT: #pragma omp target map(always,from: i)
126 // CHECK-NEXT: foo()
127 // CHECK-NEXT: #pragma omp target map(tofrom: always)
128 // CHECK-NEXT: {
129 // CHECK-NEXT: always++;
130 // CHECK-NEXT: }
131 // CHECK-NEXT: #pragma omp target map(tofrom: always,i)
132 // CHECK-NEXT: {
133 // CHECK-NEXT: always++;
134 // CHECK-NEXT: i++;
135 // CHECK-NEXT: }
136 // CHECK-NEXT: #pragma omp target nowait
137 // CHECK-NEXT: foo()
138 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
139 // CHECK-NEXT: foo()
140 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar)
141 // CHECK-NEXT: foo()
142 
143 // CHECK-LABEL: int main(int argc, char **argv) {
144 int main (int argc, char **argv) {
145   int i, j, a[20], always;
146 // CHECK-NEXT: int i, j, a[20]
147 #pragma omp target
148 // CHECK-NEXT: #pragma omp target
149   foo();
150 // CHECK-NEXT: foo();
151 #pragma omp target if (argc > 0)
152 // CHECK-NEXT: #pragma omp target if(argc > 0)
153   foo();
154 // CHECK-NEXT: foo();
155 
156 #pragma omp target map(i) if(argc>0)
157 // CHECK-NEXT: #pragma omp target map(tofrom: i) if(argc > 0)
158   foo();
159 // CHECK-NEXT: foo();
160 
161 #pragma omp target map(i)
162 // CHECK-NEXT: #pragma omp target map(tofrom: i)
163   foo();
164 // CHECK-NEXT: foo();
165 
166 #pragma omp target map(a[0:10], i)
167 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i)
168   foo();
169 // CHECK-NEXT: foo();
170 
171 #pragma omp target map(to: i) map(from: j)
172 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j)
173   foo();
174 // CHECK-NEXT: foo();
175 
176 #pragma omp target map(always,alloc: i)
177 // CHECK-NEXT: #pragma omp target map(always,alloc: i)
178   foo();
179 // CHECK-NEXT: foo();
180 
181 #pragma omp target map(always from: i)
182 // CHECK-NEXT: #pragma omp target map(always,from: i)
183   foo();
184 // CHECK-NEXT: foo();
185 
186 #pragma omp target map(always)
187 // CHECK-NEXT: #pragma omp target map(tofrom: always)
188   {always++;}
189 // CHECK-NEXT: {
190 // CHECK-NEXT: always++;
191 // CHECK-NEXT: }
192 
193 #pragma omp target map(always,i)
194 // CHECK-NEXT: #pragma omp target map(tofrom: always,i)
195   {always++;i++;}
196 // CHECK-NEXT: {
197 // CHECK-NEXT: always++;
198 // CHECK-NEXT: i++;
199 // CHECK-NEXT: }
200 
201 #pragma omp target nowait
202 // CHECK-NEXT: #pragma omp target nowait
203   foo();
204 // CHECK-NEXT: foo();
205 
206 #pragma omp target depend(in : argc, argv[i:argc], a[:])
207 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:])
208   foo();
209 // CHECK-NEXT: foo();
210 
211 #pragma omp target defaultmap(tofrom: scalar)
212 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar)
213   foo();
214 // CHECK-NEXT: foo();
215 
216   return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]);
217 }
218 
219 #endif
220