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