1 // RUN: %clang_cc1 -fsyntax-only -fopenmp -triple x86_64-unknown-unknown -verify %s 2 3 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp taskloop simd'}} 4 #pragma omp taskloop simd 5 6 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp taskloop simd'}} 7 #pragma omp taskloop simd foo 8 9 void test_no_clause() { 10 int i; 11 #pragma omp taskloop simd 12 for (i = 0; i < 16; ++i) 13 ; 14 15 // expected-error@+2 {{statement after '#pragma omp taskloop simd' must be a for loop}} 16 #pragma omp taskloop simd 17 ++i; 18 } 19 20 void test_branch_protected_scope() { 21 int i = 0; 22 L1: 23 ++i; 24 25 int x[24]; 26 27 #pragma omp parallel 28 #pragma omp taskloop simd 29 for (i = 0; i < 16; ++i) { 30 if (i == 5) 31 goto L1; // expected-error {{use of undeclared label 'L1'}} 32 else if (i == 6) 33 return; // expected-error {{cannot return from OpenMP region}} 34 else if (i == 7) 35 goto L2; 36 else if (i == 8) { 37 L2: 38 x[i]++; 39 } 40 } 41 42 if (x[0] == 0) 43 goto L2; // expected-error {{use of undeclared label 'L2'}} 44 else if (x[1] == 1) 45 goto L1; 46 } 47 48 void test_invalid_clause() { 49 int i; 50 #pragma omp parallel 51 // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} 52 #pragma omp taskloop simd foo bar 53 for (i = 0; i < 16; ++i) 54 ; 55 // expected-error@+1 {{directive '#pragma omp taskloop simd' cannot contain more than one 'nogroup' clause}} 56 #pragma omp taskloop simd nogroup nogroup 57 for (i = 0; i < 16; ++i) 58 ; 59 } 60 61 void test_non_identifiers() { 62 int i, x; 63 64 #pragma omp parallel 65 // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} 66 #pragma omp taskloop simd; 67 for (i = 0; i < 16; ++i) 68 ; 69 // expected-warning@+2 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} 70 #pragma omp parallel 71 #pragma omp taskloop simd linear(x); 72 for (i = 0; i < 16; ++i) 73 ; 74 75 #pragma omp parallel 76 // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} 77 #pragma omp taskloop simd private(x); 78 for (i = 0; i < 16; ++i) 79 ; 80 81 #pragma omp parallel 82 // expected-warning@+1 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} 83 #pragma omp taskloop simd, private(x); 84 for (i = 0; i < 16; ++i) 85 ; 86 } 87 88 extern int foo(); 89 90 void test_collapse() { 91 int i; 92 #pragma omp parallel 93 // expected-error@+1 {{expected '('}} 94 #pragma omp taskloop simd collapse 95 for (i = 0; i < 16; ++i) 96 ; 97 #pragma omp parallel 98 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 99 #pragma omp taskloop simd collapse( 100 for (i = 0; i < 16; ++i) 101 ; 102 #pragma omp parallel 103 // expected-error@+1 {{expected expression}} 104 #pragma omp taskloop simd collapse() 105 for (i = 0; i < 16; ++i) 106 ; 107 #pragma omp parallel 108 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 109 #pragma omp taskloop simd collapse(, 110 for (i = 0; i < 16; ++i) 111 ; 112 #pragma omp parallel 113 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 114 #pragma omp taskloop simd collapse(, ) 115 for (i = 0; i < 16; ++i) 116 ; 117 #pragma omp parallel 118 // expected-warning@+2 {{extra tokens at the end of '#pragma omp taskloop simd' are ignored}} 119 // expected-error@+1 {{expected '('}} 120 #pragma omp taskloop simd collapse 4) 121 for (i = 0; i < 16; ++i) 122 ; 123 #pragma omp parallel 124 // expected-error@+2 {{expected ')'}} 125 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 126 #pragma omp taskloop simd collapse(4 127 for (i = 0; i < 16; ++i) 128 ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} 129 #pragma omp parallel 130 // expected-error@+2 {{expected ')'}} 131 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 132 #pragma omp taskloop simd collapse(4, 133 for (i = 0; i < 16; ++i) 134 ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} 135 #pragma omp parallel 136 // expected-error@+2 {{expected ')'}} 137 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 138 #pragma omp taskloop simd collapse(4, ) 139 for (i = 0; i < 16; ++i) 140 ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} 141 #pragma omp parallel 142 // expected-note@+1 {{as specified in 'collapse' clause}} 143 #pragma omp taskloop simd collapse(4) 144 for (i = 0; i < 16; ++i) 145 ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} 146 #pragma omp parallel 147 // expected-error@+2 {{expected ')'}} 148 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 149 #pragma omp taskloop simd collapse(4 4) 150 for (i = 0; i < 16; ++i) 151 ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} 152 #pragma omp parallel 153 // expected-error@+2 {{expected ')'}} 154 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 155 #pragma omp taskloop simd collapse(4, , 4) 156 for (i = 0; i < 16; ++i) 157 ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} 158 #pragma omp parallel 159 #pragma omp taskloop simd collapse(4) 160 for (int i1 = 0; i1 < 16; ++i1) 161 for (int i2 = 0; i2 < 16; ++i2) 162 for (int i3 = 0; i3 < 16; ++i3) 163 for (int i4 = 0; i4 < 16; ++i4) 164 foo(); 165 #pragma omp parallel 166 // expected-error@+2 {{expected ')'}} 167 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 168 #pragma omp taskloop simd collapse(4, 8) 169 for (i = 0; i < 16; ++i) 170 ; // expected-error {{expected 4 for loops after '#pragma omp taskloop simd', but found only 1}} 171 #pragma omp parallel 172 // expected-error@+1 {{expression is not an integer constant expression}} 173 #pragma omp taskloop simd collapse(2.5) 174 for (i = 0; i < 16; ++i) 175 ; 176 #pragma omp parallel 177 // expected-error@+1 {{expression is not an integer constant expression}} 178 #pragma omp taskloop simd collapse(foo()) 179 for (i = 0; i < 16; ++i) 180 ; 181 #pragma omp parallel 182 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} 183 #pragma omp taskloop simd collapse(-5) 184 for (i = 0; i < 16; ++i) 185 ; 186 #pragma omp parallel 187 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} 188 #pragma omp taskloop simd collapse(0) 189 for (i = 0; i < 16; ++i) 190 ; 191 #pragma omp parallel 192 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} 193 #pragma omp taskloop simd collapse(5 - 5) 194 for (i = 0; i < 16; ++i) 195 ; 196 } 197 198 void test_private() { 199 int i; 200 #pragma omp parallel 201 // expected-error@+2 {{expected expression}} 202 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 203 #pragma omp taskloop simd private( 204 for (i = 0; i < 16; ++i) 205 ; 206 #pragma omp parallel 207 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 208 // expected-error@+1 2 {{expected expression}} 209 #pragma omp taskloop simd private(, 210 for (i = 0; i < 16; ++i) 211 ; 212 #pragma omp parallel 213 // expected-error@+1 2 {{expected expression}} 214 #pragma omp taskloop simd private(, ) 215 for (i = 0; i < 16; ++i) 216 ; 217 #pragma omp parallel 218 // expected-error@+1 {{expected expression}} 219 #pragma omp taskloop simd private() 220 for (i = 0; i < 16; ++i) 221 ; 222 #pragma omp parallel 223 // expected-error@+1 {{expected expression}} 224 #pragma omp taskloop simd private(int) 225 for (i = 0; i < 16; ++i) 226 ; 227 #pragma omp parallel 228 // expected-error@+1 {{expected variable name}} 229 #pragma omp taskloop simd private(0) 230 for (i = 0; i < 16; ++i) 231 ; 232 233 int x, y, z; 234 #pragma omp parallel 235 #pragma omp taskloop simd private(x) 236 for (i = 0; i < 16; ++i) 237 ; 238 #pragma omp parallel 239 #pragma omp taskloop simd private(x, y) 240 for (i = 0; i < 16; ++i) 241 ; 242 #pragma omp parallel 243 #pragma omp taskloop simd private(x, y, z) 244 for (i = 0; i < 16; ++i) { 245 x = y * i + z; 246 } 247 } 248 249 void test_lastprivate() { 250 int i; 251 #pragma omp parallel 252 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 253 // expected-error@+1 {{expected expression}} 254 #pragma omp taskloop simd lastprivate( 255 for (i = 0; i < 16; ++i) 256 ; 257 258 #pragma omp parallel 259 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 260 // expected-error@+1 2 {{expected expression}} 261 #pragma omp taskloop simd lastprivate(, 262 for (i = 0; i < 16; ++i) 263 ; 264 #pragma omp parallel 265 // expected-error@+1 2 {{expected expression}} 266 #pragma omp taskloop simd lastprivate(, ) 267 for (i = 0; i < 16; ++i) 268 ; 269 #pragma omp parallel 270 // expected-error@+1 {{expected expression}} 271 #pragma omp taskloop simd lastprivate() 272 for (i = 0; i < 16; ++i) 273 ; 274 #pragma omp parallel 275 // expected-error@+1 {{expected expression}} 276 #pragma omp taskloop simd lastprivate(int) 277 for (i = 0; i < 16; ++i) 278 ; 279 #pragma omp parallel 280 // expected-error@+1 {{expected variable name}} 281 #pragma omp taskloop simd lastprivate(0) 282 for (i = 0; i < 16; ++i) 283 ; 284 285 int x, y, z; 286 #pragma omp parallel 287 #pragma omp taskloop simd lastprivate(x) 288 for (i = 0; i < 16; ++i) 289 ; 290 #pragma omp parallel 291 #pragma omp taskloop simd lastprivate(x, y) 292 for (i = 0; i < 16; ++i) 293 ; 294 #pragma omp parallel 295 #pragma omp taskloop simd lastprivate(x, y, z) 296 for (i = 0; i < 16; ++i) 297 ; 298 } 299 300 void test_firstprivate() { 301 int i; 302 #pragma omp parallel 303 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 304 // expected-error@+1 {{expected expression}} 305 #pragma omp taskloop simd firstprivate( 306 for (i = 0; i < 16; ++i) 307 ; 308 309 #pragma omp parallel 310 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 311 // expected-error@+1 2 {{expected expression}} 312 #pragma omp taskloop simd firstprivate(, 313 for (i = 0; i < 16; ++i) 314 ; 315 #pragma omp parallel 316 // expected-error@+1 2 {{expected expression}} 317 #pragma omp taskloop simd firstprivate(, ) 318 for (i = 0; i < 16; ++i) 319 ; 320 #pragma omp parallel 321 // expected-error@+1 {{expected expression}} 322 #pragma omp taskloop simd firstprivate() 323 for (i = 0; i < 16; ++i) 324 ; 325 #pragma omp parallel 326 // expected-error@+1 {{expected expression}} 327 #pragma omp taskloop simd firstprivate(int) 328 for (i = 0; i < 16; ++i) 329 ; 330 #pragma omp parallel 331 // expected-error@+1 {{expected variable name}} 332 #pragma omp taskloop simd firstprivate(0) 333 for (i = 0; i < 16; ++i) 334 ; 335 336 int x, y, z; 337 #pragma omp parallel 338 #pragma omp taskloop simd lastprivate(x) firstprivate(x) 339 for (i = 0; i < 16; ++i) 340 ; 341 #pragma omp parallel 342 #pragma omp taskloop simd lastprivate(x, y) firstprivate(x, y) 343 for (i = 0; i < 16; ++i) 344 ; 345 #pragma omp parallel 346 #pragma omp taskloop simd lastprivate(x, y, z) firstprivate(x, y, z) 347 for (i = 0; i < 16; ++i) 348 ; 349 } 350 351 void test_loop_messages() { 352 float a[100], b[100], c[100]; 353 #pragma omp parallel 354 // expected-error@+2 {{variable must be of integer or pointer type}} 355 #pragma omp taskloop simd 356 for (float fi = 0; fi < 10.0; fi++) { 357 c[(int)fi] = a[(int)fi] + b[(int)fi]; 358 } 359 #pragma omp parallel 360 // expected-error@+2 {{variable must be of integer or pointer type}} 361 #pragma omp taskloop simd 362 for (double fi = 0; fi < 10.0; fi++) { 363 c[(int)fi] = a[(int)fi] + b[(int)fi]; 364 } 365 366 // expected-warning@+2 {{OpenMP loop iteration variable cannot have more than 64 bits size and will be narrowed}} 367 #pragma omp taskloop simd 368 for (__int128 ii = 0; ii < 10; ii++) { 369 c[ii] = a[ii] + b[ii]; 370 } 371 } 372 373