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