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