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