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