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 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 8 // expected-no-diagnostics 9 10 #ifndef HEADER 11 #define HEADER 12 13 void foo() {} 14 15 template <typename T, int C> 16 T tmain(T argc, T *argv) { 17 T i, j, a[20], always, close; 18 #pragma omp target 19 foo(); 20 #pragma omp target if (target:argc > 0) 21 foo(); 22 #pragma omp target if (C) 23 foo(); 24 #pragma omp target map(i) 25 foo(); 26 #pragma omp target map(a[0:10], i) 27 foo(); 28 #pragma omp target map(to: i) map(from: j) 29 foo(); 30 #pragma omp target map(always,alloc: i) 31 foo(); 32 #pragma omp target map(always from: i) 33 foo(); 34 #pragma omp target map(always) 35 {always++;} 36 #pragma omp target map(always,i) 37 {always++;i++;} 38 #pragma omp target map(close,alloc: i) 39 foo(); 40 #pragma omp target map(close from: i) 41 foo(); 42 #pragma omp target map(close) 43 {close++;} 44 #pragma omp target map(close,i) 45 {close++;i++;} 46 #pragma omp target nowait 47 foo(); 48 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 49 foo(); 50 #pragma omp target defaultmap(tofrom: scalar) 51 foo(); 52 return 0; 53 } 54 55 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { 56 // CHECK-NEXT: T i, j, a[20] 57 // CHECK-NEXT: #pragma omp target{{$}} 58 // CHECK-NEXT: foo(); 59 // CHECK-NEXT: #pragma omp target if(target: argc > 0) 60 // CHECK-NEXT: foo() 61 // CHECK-NEXT: #pragma omp target if(C) 62 // CHECK-NEXT: foo() 63 // CHECK-NEXT: #pragma omp target map(tofrom: i) 64 // CHECK-NEXT: foo() 65 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i) 66 // CHECK-NEXT: foo() 67 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j) 68 // CHECK-NEXT: foo() 69 // CHECK-NEXT: #pragma omp target map(always,alloc: i) 70 // CHECK-NEXT: foo() 71 // CHECK-NEXT: #pragma omp target map(always,from: i) 72 // CHECK-NEXT: foo() 73 // CHECK-NEXT: #pragma omp target map(tofrom: always) 74 // CHECK-NEXT: { 75 // CHECK-NEXT: always++; 76 // CHECK-NEXT: } 77 // CHECK-NEXT: #pragma omp target map(tofrom: always,i) 78 // CHECK-NEXT: { 79 // CHECK-NEXT: always++; 80 // CHECK-NEXT: i++; 81 // CHECK-NEXT: } 82 // CHECK-NEXT: #pragma omp target map(close,alloc: i) 83 // CHECK-NEXT: foo() 84 // CHECK-NEXT: #pragma omp target map(close,from: i) 85 // CHECK-NEXT: foo() 86 // CHECK-NEXT: #pragma omp target map(tofrom: close) 87 // CHECK-NEXT: { 88 // CHECK-NEXT: close++; 89 // CHECK-NEXT: } 90 // CHECK-NEXT: #pragma omp target map(tofrom: close,i) 91 // CHECK-NEXT: { 92 // CHECK-NEXT: close++; 93 // CHECK-NEXT: i++; 94 // CHECK-NEXT: } 95 // CHECK-NEXT: #pragma omp target nowait 96 // CHECK-NEXT: foo() 97 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 98 // CHECK-NEXT: foo() 99 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar) 100 // CHECK-NEXT: foo() 101 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { 102 // CHECK-NEXT: int i, j, a[20] 103 // CHECK-NEXT: #pragma omp target 104 // CHECK-NEXT: foo(); 105 // CHECK-NEXT: #pragma omp target if(target: argc > 0) 106 // CHECK-NEXT: foo() 107 // CHECK-NEXT: #pragma omp target if(5) 108 // CHECK-NEXT: foo() 109 // CHECK-NEXT: #pragma omp target map(tofrom: i) 110 // CHECK-NEXT: foo() 111 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i) 112 // CHECK-NEXT: foo() 113 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j) 114 // CHECK-NEXT: foo() 115 // CHECK-NEXT: #pragma omp target map(always,alloc: i) 116 // CHECK-NEXT: foo() 117 // CHECK-NEXT: #pragma omp target map(always,from: i) 118 // CHECK-NEXT: foo() 119 // CHECK-NEXT: #pragma omp target map(tofrom: always) 120 // CHECK-NEXT: { 121 // CHECK-NEXT: always++; 122 // CHECK-NEXT: } 123 // CHECK-NEXT: #pragma omp target map(tofrom: always,i) 124 // CHECK-NEXT: { 125 // CHECK-NEXT: always++; 126 // CHECK-NEXT: i++; 127 // CHECK-NEXT: } 128 // CHECK-NEXT: #pragma omp target map(close,alloc: i) 129 // CHECK-NEXT: foo() 130 // CHECK-NEXT: #pragma omp target map(close,from: i) 131 // CHECK-NEXT: foo() 132 // CHECK-NEXT: #pragma omp target map(tofrom: close) 133 // CHECK-NEXT: { 134 // CHECK-NEXT: close++; 135 // CHECK-NEXT: } 136 // CHECK-NEXT: #pragma omp target map(tofrom: close,i) 137 // CHECK-NEXT: { 138 // CHECK-NEXT: close++; 139 // CHECK-NEXT: i++; 140 // CHECK-NEXT: } 141 // CHECK-NEXT: #pragma omp target nowait 142 // CHECK-NEXT: foo() 143 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 144 // CHECK-NEXT: foo() 145 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar) 146 // CHECK-NEXT: foo() 147 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) { 148 // CHECK-NEXT: char i, j, a[20] 149 // CHECK-NEXT: #pragma omp target 150 // CHECK-NEXT: foo(); 151 // CHECK-NEXT: #pragma omp target if(target: argc > 0) 152 // CHECK-NEXT: foo() 153 // CHECK-NEXT: #pragma omp target if(1) 154 // CHECK-NEXT: foo() 155 // CHECK-NEXT: #pragma omp target map(tofrom: i) 156 // CHECK-NEXT: foo() 157 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i) 158 // CHECK-NEXT: foo() 159 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j) 160 // CHECK-NEXT: foo() 161 // CHECK-NEXT: #pragma omp target map(always,alloc: i) 162 // CHECK-NEXT: foo() 163 // CHECK-NEXT: #pragma omp target map(always,from: i) 164 // CHECK-NEXT: foo() 165 // CHECK-NEXT: #pragma omp target map(tofrom: always) 166 // CHECK-NEXT: { 167 // CHECK-NEXT: always++; 168 // CHECK-NEXT: } 169 // CHECK-NEXT: #pragma omp target map(tofrom: always,i) 170 // CHECK-NEXT: { 171 // CHECK-NEXT: always++; 172 // CHECK-NEXT: i++; 173 // CHECK-NEXT: } 174 // CHECK-NEXT: #pragma omp target map(close,alloc: i) 175 // CHECK-NEXT: foo() 176 // CHECK-NEXT: #pragma omp target map(close,from: i) 177 // CHECK-NEXT: foo() 178 // CHECK-NEXT: #pragma omp target map(tofrom: close) 179 // CHECK-NEXT: { 180 // CHECK-NEXT: close++; 181 // CHECK-NEXT: } 182 // CHECK-NEXT: #pragma omp target map(tofrom: close,i) 183 // CHECK-NEXT: { 184 // CHECK-NEXT: close++; 185 // CHECK-NEXT: i++; 186 // CHECK-NEXT: } 187 // CHECK-NEXT: #pragma omp target nowait 188 // CHECK-NEXT: foo() 189 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 190 // CHECK-NEXT: foo() 191 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar) 192 // CHECK-NEXT: foo() 193 194 // CHECK-LABEL: class S { 195 class S { 196 void foo() { 197 // CHECK-NEXT: void foo() { 198 int a = 0; 199 // CHECK-NEXT: int a = 0; 200 #pragma omp target map(this[0]) 201 // CHECK-NEXT: #pragma omp target map(tofrom: this[0]) 202 a++; 203 // CHECK-NEXT: a++; 204 #pragma omp target map(this[:1]) 205 // CHECK-NEXT: #pragma omp target map(tofrom: this[:1]) 206 a++; 207 // CHECK-NEXT: a++; 208 #pragma omp target map((this)[0]) 209 // CHECK-NEXT: #pragma omp target map(tofrom: (this)[0]) 210 a++; 211 // CHECK-NEXT: a++; 212 #pragma omp target map(this[:a]) 213 // CHECK-NEXT: #pragma omp target map(tofrom: this[:a]) 214 a++; 215 // CHECK-NEXT: a++; 216 #pragma omp target map(this[a:1]) 217 // CHECK-NEXT: #pragma omp target map(tofrom: this[a:1]) 218 a++; 219 // CHECK-NEXT: a++; 220 #pragma omp target map(this[a]) 221 // CHECK-NEXT: #pragma omp target map(tofrom: this[a]) 222 a++; 223 // CHECK-NEXT: a++; 224 } 225 // CHECK-NEXT: } 226 }; 227 // CHECK-NEXT: }; 228 229 // CHECK-LABEL: int main(int argc, char **argv) { 230 int main (int argc, char **argv) { 231 int i, j, a[20], always, close; 232 // CHECK-NEXT: int i, j, a[20] 233 #pragma omp target 234 // CHECK-NEXT: #pragma omp target 235 foo(); 236 // CHECK-NEXT: foo(); 237 #pragma omp target if (argc > 0) 238 // CHECK-NEXT: #pragma omp target if(argc > 0) 239 foo(); 240 // CHECK-NEXT: foo(); 241 242 #pragma omp target map(i) if(argc>0) 243 // CHECK-NEXT: #pragma omp target map(tofrom: i) if(argc > 0) 244 foo(); 245 // CHECK-NEXT: foo(); 246 247 #pragma omp target map(i) 248 // CHECK-NEXT: #pragma omp target map(tofrom: i) 249 foo(); 250 // CHECK-NEXT: foo(); 251 252 #pragma omp target map(a[0:10], i) 253 // CHECK-NEXT: #pragma omp target map(tofrom: a[0:10],i) 254 foo(); 255 // CHECK-NEXT: foo(); 256 257 #pragma omp target map(to: i) map(from: j) 258 // CHECK-NEXT: #pragma omp target map(to: i) map(from: j) 259 foo(); 260 // CHECK-NEXT: foo(); 261 262 #pragma omp target map(always,alloc: i) 263 // CHECK-NEXT: #pragma omp target map(always,alloc: i) 264 foo(); 265 // CHECK-NEXT: foo(); 266 267 #pragma omp target map(always from: i) 268 // CHECK-NEXT: #pragma omp target map(always,from: i) 269 foo(); 270 // CHECK-NEXT: foo(); 271 272 #pragma omp target map(always) 273 // CHECK-NEXT: #pragma omp target map(tofrom: always) 274 {always++;} 275 // CHECK-NEXT: { 276 // CHECK-NEXT: always++; 277 // CHECK-NEXT: } 278 279 #pragma omp target map(always,i) 280 // CHECK-NEXT: #pragma omp target map(tofrom: always,i) 281 {always++;i++;} 282 // CHECK-NEXT: { 283 // CHECK-NEXT: always++; 284 // CHECK-NEXT: i++; 285 // CHECK-NEXT: } 286 287 #pragma omp target map(close,alloc: i) 288 // CHECK-NEXT: #pragma omp target map(close,alloc: i) 289 foo(); 290 // CHECK-NEXT: foo(); 291 292 #pragma omp target map(close from: i) 293 // CHECK-NEXT: #pragma omp target map(close,from: i) 294 foo(); 295 // CHECK-NEXT: foo(); 296 297 #pragma omp target map(close) 298 // CHECK-NEXT: #pragma omp target map(tofrom: close) 299 {close++;} 300 // CHECK-NEXT: { 301 // CHECK-NEXT: close++; 302 // CHECK-NEXT: } 303 304 #pragma omp target map(close,i) 305 // CHECK-NEXT: #pragma omp target map(tofrom: close,i) 306 {close++;i++;} 307 // CHECK-NEXT: { 308 // CHECK-NEXT: close++; 309 // CHECK-NEXT: i++; 310 // CHECK-NEXT: } 311 312 #pragma omp target nowait 313 // CHECK-NEXT: #pragma omp target nowait 314 foo(); 315 // CHECK-NEXT: foo(); 316 317 #pragma omp target depend(in : argc, argv[i:argc], a[:]) 318 // CHECK-NEXT: #pragma omp target depend(in : argc,argv[i:argc],a[:]) 319 foo(); 320 // CHECK-NEXT: foo(); 321 322 #pragma omp target defaultmap(tofrom: scalar) 323 // CHECK-NEXT: #pragma omp target defaultmap(tofrom: scalar) 324 foo(); 325 // CHECK-NEXT: foo(); 326 327 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 328 } 329 330 #endif 331