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