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