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