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 9 // RUN: %clang_cc1 -DOMP51 -DOMPX -verify -fopenmp -fopenmp-version=51 -fopenmp-extensions -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s 10 // RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp -fopenmp-version=51 -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s 11 // RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp -fopenmp-version=51 -fopenmp-extensions -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s 12 13 // RUN: %clang_cc1 -DOMP51 -DOMPX -verify -fopenmp-simd -fopenmp-version=51 -fopenmp-extensions -ast-print %s | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s 14 // RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp-simd -fopenmp-version=51 -fopenmp-extensions -x c++ -std=c++11 -emit-pch -o %t %s 15 // RUN: %clang_cc1 -DOMP51 -DOMPX -fopenmp-simd -fopenmp-version=51 -fopenmp-extensions -std=c++11 -include-pch %t -fsyntax-only -verify %s -ast-print | FileCheck -check-prefixes=CHECK,OMP51,OMPX %s 16 // expected-no-diagnostics 17 18 #ifndef HEADER 19 #define HEADER 20 21 void foo() {} 22 23 template <typename T, int C> 24 T tmain(T argc, T *argv) { 25 T i, j, b, c, d, e, x[20]; 26 27 #pragma omp target data map(to: c) 28 i = argc; 29 30 #pragma omp target data map(to: c) if (target data: j > 0) 31 foo(); 32 33 #pragma omp target data map(to: c) if (b) 34 foo(); 35 36 #pragma omp target data map(c) 37 foo(); 38 39 #pragma omp target data map(c) if(b>e) 40 foo(); 41 42 #pragma omp target data map(x[0:10], c) 43 foo(); 44 45 #pragma omp target data map(to: c) map(from: d) 46 foo(); 47 48 #pragma omp target data map(always,alloc: e) 49 foo(); 50 51 #pragma omp target data map(close,alloc: e) 52 foo(); 53 54 #ifdef OMP51 55 #pragma omp target data map(present,alloc: e) 56 foo(); 57 #endif 58 59 #ifdef OMPX 60 #pragma omp target data map(ompx_hold,alloc: e) 61 foo(); 62 #endif 63 64 // nesting a target region 65 #pragma omp target data map(e) 66 { 67 #pragma omp target map(always, alloc: e) 68 foo(); 69 #pragma omp target map(close, alloc: e) 70 foo(); 71 #ifdef OMP51 72 #pragma omp target map(present, alloc: e) 73 foo(); 74 #endif 75 #ifdef OMPX 76 #pragma omp target map(ompx_hold, alloc: e) 77 foo(); 78 #endif 79 } 80 81 return 0; 82 } 83 84 // CHECK: template <typename T, int C> T tmain(T argc, T *argv) { 85 // CHECK-NEXT: T i, j, b, c, d, e, x[20]; 86 // CHECK-NEXT: #pragma omp target data map(to: c){{$}} 87 // CHECK-NEXT: i = argc; 88 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 89 // CHECK-NEXT: foo(); 90 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 91 // CHECK-NEXT: foo(); 92 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 93 // CHECK-NEXT: foo(); 94 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 95 // CHECK-NEXT: foo(); 96 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 97 // CHECK-NEXT: foo(); 98 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 99 // CHECK-NEXT: foo(); 100 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 101 // CHECK-NEXT: foo(); 102 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 103 // CHECK-NEXT: foo(); 104 // OMP51-NEXT: #pragma omp target data map(present,alloc: e) 105 // OMP51-NEXT: foo(); 106 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e) 107 // OMPX-NEXT: foo(); 108 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 109 // CHECK-NEXT: { 110 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 111 // CHECK-NEXT: foo(); 112 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 113 // CHECK-NEXT: foo(); 114 // OMP51-NEXT: #pragma omp target map(present,alloc: e) 115 // OMP51-NEXT: foo(); 116 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e) 117 // OMPX-NEXT: foo(); 118 // CHECK: template<> int tmain<int, 5>(int argc, int *argv) { 119 // CHECK-NEXT: int i, j, b, c, d, e, x[20]; 120 // CHECK-NEXT: #pragma omp target data map(to: c) 121 // CHECK-NEXT: i = argc; 122 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 123 // CHECK-NEXT: foo(); 124 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 125 // CHECK-NEXT: foo(); 126 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 127 // CHECK-NEXT: foo(); 128 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 129 // CHECK-NEXT: foo(); 130 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 131 // CHECK-NEXT: foo(); 132 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 133 // CHECK-NEXT: foo(); 134 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 135 // CHECK-NEXT: foo(); 136 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 137 // CHECK-NEXT: foo(); 138 // OMP51-NEXT: #pragma omp target data map(present,alloc: e) 139 // OMP51-NEXT: foo(); 140 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e) 141 // OMPX-NEXT: foo(); 142 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 143 // CHECK-NEXT: { 144 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 145 // CHECK-NEXT: foo(); 146 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 147 // CHECK-NEXT: foo(); 148 // OMP51-NEXT: #pragma omp target map(present,alloc: e) 149 // OMP51-NEXT: foo(); 150 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e) 151 // OMPX-NEXT: foo(); 152 // CHECK: template<> char tmain<char, 1>(char argc, char *argv) { 153 // CHECK-NEXT: char i, j, b, c, d, e, x[20]; 154 // CHECK-NEXT: #pragma omp target data map(to: c) 155 // CHECK-NEXT: i = argc; 156 // CHECK-NEXT: #pragma omp target data map(to: c) if(target data: j > 0) 157 // CHECK-NEXT: foo(); 158 // CHECK-NEXT: #pragma omp target data map(to: c) if(b) 159 // CHECK-NEXT: foo(); 160 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 161 // CHECK-NEXT: foo(); 162 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > e) 163 // CHECK-NEXT: foo(); 164 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 165 // CHECK-NEXT: foo(); 166 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 167 // CHECK-NEXT: foo(); 168 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 169 // CHECK-NEXT: foo(); 170 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 171 // CHECK-NEXT: foo(); 172 // OMP51-NEXT: #pragma omp target data map(present,alloc: e) 173 // OMP51-NEXT: foo(); 174 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e) 175 // OMPX-NEXT: foo(); 176 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 177 // CHECK-NEXT: { 178 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 179 // CHECK-NEXT: foo(); 180 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 181 // CHECK-NEXT: foo(); 182 // OMP51-NEXT: #pragma omp target map(present,alloc: e) 183 // OMP51-NEXT: foo(); 184 // OMPX-NEXT: #pragma omp target map(ompx_hold,alloc: e) 185 // OMPX-NEXT: foo(); 186 187 int main (int argc, char **argv) { 188 int b = argc, c, d, e, f, g, x[20]; 189 static int a; 190 // CHECK: static int a; 191 192 #pragma omp target data map(to: ([argc][3][a])argv) 193 // CHECK: #pragma omp target data map(to: ([argc][3][a])argv) 194 #pragma omp target data map(to: c) 195 // CHECK: #pragma omp target data map(to: c) 196 a=2; 197 // CHECK-NEXT: a = 2; 198 #pragma omp target data map(to: c) if (target data: b) 199 // CHECK: #pragma omp target data map(to: c) if(target data: b) 200 foo(); 201 // CHECK-NEXT: foo(); 202 203 #pragma omp target data map(to: c) if (b > g) 204 // CHECK: #pragma omp target data map(to: c) if(b > g) 205 foo(); 206 // CHECK-NEXT: foo(); 207 208 #pragma omp target data map(c) 209 // CHECK-NEXT: #pragma omp target data map(tofrom: c) 210 foo(); 211 // CHECK-NEXT: foo(); 212 213 #pragma omp target data map(c) if(b>g) 214 // CHECK-NEXT: #pragma omp target data map(tofrom: c) if(b > g) 215 foo(); 216 // CHECK-NEXT: foo(); 217 218 #pragma omp target data map(x[0:10], c) 219 // CHECK-NEXT: #pragma omp target data map(tofrom: x[0:10],c) 220 foo(); 221 // CHECK-NEXT: foo(); 222 223 #pragma omp target data map(to: c) map(from: d) 224 // CHECK-NEXT: #pragma omp target data map(to: c) map(from: d) 225 foo(); 226 // CHECK-NEXT: foo(); 227 228 #pragma omp target data map(always,alloc: e) 229 // CHECK-NEXT: #pragma omp target data map(always,alloc: e) 230 foo(); 231 // CHECK-NEXT: foo(); 232 233 #pragma omp target data map(close,alloc: e) 234 // CHECK-NEXT: #pragma omp target data map(close,alloc: e) 235 foo(); 236 // CHECK-NEXT: foo(); 237 238 // OMP51-NEXT: #pragma omp target data map(present,alloc: e) 239 // OMP51-NEXT: foo(); 240 #ifdef OMP51 241 #pragma omp target data map(present,alloc: e) 242 foo(); 243 #endif 244 245 // OMPX-NEXT: #pragma omp target data map(ompx_hold,alloc: e) 246 // OMPX-NEXT: foo(); 247 #ifdef OMPX 248 #pragma omp target data map(ompx_hold,alloc: e) 249 foo(); 250 #endif 251 252 // nesting a target region 253 #pragma omp target data map(e) 254 // CHECK-NEXT: #pragma omp target data map(tofrom: e) 255 { 256 // CHECK-NEXT: { 257 #pragma omp target map(always, alloc: e) 258 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 259 foo(); 260 // CHECK-NEXT: foo(); 261 #pragma omp target map(close, alloc: e) 262 // CHECK-NEXT: #pragma omp target map(close,alloc: e) 263 foo(); 264 // CHECK-NEXT: foo(); 265 #pragma omp target map(always, alloc: e) 266 // CHECK-NEXT: #pragma omp target map(always,alloc: e) 267 foo(); 268 } 269 270 return tmain<int, 5>(argc, &argc) + tmain<char, 1>(argv[0][0], argv[0]); 271 } 272 273 #endif 274