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