1 // RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s 2 3 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel for'}} 4 #pragma omp parallel for 5 6 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel for'}} 7 #pragma omp parallel for foo 8 9 void test_no_clause() { 10 int i; 11 #pragma omp parallel for 12 for (i = 0; i < 16; ++i) 13 ; 14 15 // expected-error@+2 {{statement after '#pragma omp parallel for' must be a for loop}} 16 #pragma omp parallel 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 for 28 for (i = 0; i < 16; ++i) { 29 if (i == 5) 30 goto L1; // expected-error {{use of undeclared label 'L1'}} 31 else if (i == 6) 32 return; // expected-error {{cannot return from OpenMP region}} 33 else if (i == 7) 34 goto L2; 35 else if (i == 8) { 36 L2: 37 x[i]++; 38 } 39 } 40 41 if (x[0] == 0) 42 goto L2; // expected-error {{use of undeclared label 'L2'}} 43 else if (x[1] == 1) 44 goto L1; 45 } 46 47 void test_invalid_clause() { 48 int i; 49 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}} 50 #pragma omp parallel for foo bar 51 for (i = 0; i < 16; ++i) 52 ; 53 } 54 55 void test_non_identifiers() { 56 int i, x; 57 58 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}} 59 #pragma omp parallel for; 60 for (i = 0; i < 16; ++i) 61 ; 62 63 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}} 64 #pragma omp parallel for private(x); 65 for (i = 0; i < 16; ++i) 66 ; 67 68 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}} 69 #pragma omp parallel for, private(x); 70 for (i = 0; i < 16; ++i) 71 ; 72 } 73 74 extern int foo(); 75 76 void test_collapse() { 77 int i; 78 // expected-error@+1 {{expected '('}} 79 #pragma omp parallel for collapse 80 for (i = 0; i < 16; ++i) 81 ; 82 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 83 #pragma omp parallel for collapse( 84 for (i = 0; i < 16; ++i) 85 ; 86 // expected-error@+1 {{expected expression}} 87 #pragma omp parallel for collapse() 88 for (i = 0; i < 16; ++i) 89 ; 90 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 91 #pragma omp parallel for collapse(, 92 for (i = 0; i < 16; ++i) 93 ; 94 // expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 95 #pragma omp parallel for collapse(, ) 96 for (i = 0; i < 16; ++i) 97 ; 98 // expected-warning@+2 {{extra tokens at the end of '#pragma omp parallel for' are ignored}} 99 // expected-error@+1 {{expected '('}} 100 #pragma omp parallel for collapse 4) 101 for (i = 0; i < 16; ++i) 102 ; 103 // expected-error@+2 {{expected ')'}} 104 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 105 #pragma omp parallel for collapse(4 106 for (i = 0; i < 16; ++i) 107 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}} 108 // expected-error@+2 {{expected ')'}} 109 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 110 #pragma omp parallel for collapse(4, 111 for (i = 0; i < 16; ++i) 112 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}} 113 // expected-error@+2 {{expected ')'}} 114 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 115 #pragma omp parallel for collapse(4, ) 116 for (i = 0; i < 16; ++i) 117 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}} 118 // expected-note@+1 {{as specified in 'collapse' clause}} 119 #pragma omp parallel for collapse(4) 120 for (i = 0; i < 16; ++i) 121 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}} 122 // expected-error@+2 {{expected ')'}} 123 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 124 #pragma omp parallel for collapse(4 4) 125 for (i = 0; i < 16; ++i) 126 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}} 127 // expected-error@+2 {{expected ')'}} 128 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 129 #pragma omp parallel for collapse(4, , 4) 130 for (i = 0; i < 16; ++i) 131 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}} 132 #pragma omp parallel for collapse(4) 133 for (int i1 = 0; i1 < 16; ++i1) 134 for (int i2 = 0; i2 < 16; ++i2) 135 for (int i3 = 0; i3 < 16; ++i3) 136 for (int i4 = 0; i4 < 16; ++i4) 137 foo(); 138 // expected-error@+2 {{expected ')'}} 139 // expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}} 140 #pragma omp parallel for collapse(4, 8) 141 for (i = 0; i < 16; ++i) 142 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}} 143 // expected-error@+1 {{expression is not an integer constant expression}} 144 #pragma omp parallel for collapse(2.5) 145 for (i = 0; i < 16; ++i) 146 ; 147 // expected-error@+1 {{expression is not an integer constant expression}} 148 #pragma omp parallel for collapse(foo()) 149 for (i = 0; i < 16; ++i) 150 ; 151 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} 152 #pragma omp parallel for collapse(-5) 153 for (i = 0; i < 16; ++i) 154 ; 155 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} 156 #pragma omp parallel for collapse(0) 157 for (i = 0; i < 16; ++i) 158 ; 159 // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}} 160 #pragma omp parallel for collapse(5 - 5) 161 for (i = 0; i < 16; ++i) 162 ; 163 // expected-note@+1 {{defined as firstprivate}} 164 #pragma omp parallel for collapse(2) firstprivate(i) 165 for (i = 0; i < 16; ++i) 166 // expected-note@+1 {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}} 167 for (int j = 0; j < 16; ++j) 168 // expected-error@+2 2 {{reduction variable must be shared}} 169 // expected-error@+1 {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 170 #pragma omp for reduction(+ : i, j) 171 for (int k = 0; k < 16; ++k) 172 i += j; 173 } 174 175 void test_private() { 176 int i; 177 // expected-error@+2 {{expected expression}} 178 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 179 #pragma omp parallel for private( 180 for (i = 0; i < 16; ++i) 181 ; 182 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 183 // expected-error@+1 2 {{expected expression}} 184 #pragma omp parallel for private(, 185 for (i = 0; i < 16; ++i) 186 ; 187 // expected-error@+1 2 {{expected expression}} 188 #pragma omp parallel for private(, ) 189 for (i = 0; i < 16; ++i) 190 ; 191 // expected-error@+1 {{expected expression}} 192 #pragma omp parallel for private() 193 for (i = 0; i < 16; ++i) 194 ; 195 // expected-error@+1 {{expected expression}} 196 #pragma omp parallel for private(int) 197 for (i = 0; i < 16; ++i) 198 ; 199 // expected-error@+1 {{expected variable name}} 200 #pragma omp parallel for private(0) 201 for (i = 0; i < 16; ++i) 202 ; 203 204 int x, y, z; 205 #pragma omp parallel for private(x) 206 for (i = 0; i < 16; ++i) 207 ; 208 #pragma omp parallel for private(x, y) 209 for (i = 0; i < 16; ++i) 210 ; 211 #pragma omp parallel for private(x, y, z) 212 for (i = 0; i < 16; ++i) { 213 x = y * i + z; 214 } 215 } 216 217 void test_lastprivate() { 218 int i; 219 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 220 // expected-error@+1 {{expected expression}} 221 #pragma omp parallel for lastprivate( 222 for (i = 0; i < 16; ++i) 223 ; 224 225 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 226 // expected-error@+1 2 {{expected expression}} 227 #pragma omp parallel for lastprivate(, 228 for (i = 0; i < 16; ++i) 229 ; 230 // expected-error@+1 2 {{expected expression}} 231 #pragma omp parallel for lastprivate(, ) 232 for (i = 0; i < 16; ++i) 233 ; 234 // expected-error@+1 {{expected expression}} 235 #pragma omp parallel for lastprivate() 236 for (i = 0; i < 16; ++i) 237 ; 238 // expected-error@+1 {{expected expression}} 239 #pragma omp parallel for lastprivate(int) 240 for (i = 0; i < 16; ++i) 241 ; 242 // expected-error@+1 {{expected variable name}} 243 #pragma omp parallel for lastprivate(0) 244 for (i = 0; i < 16; ++i) 245 ; 246 247 int x, y, z; 248 #pragma omp parallel for lastprivate(x) 249 for (i = 0; i < 16; ++i) 250 ; 251 #pragma omp parallel for lastprivate(x, y) 252 for (i = 0; i < 16; ++i) 253 ; 254 #pragma omp parallel for lastprivate(x, y, z) 255 for (i = 0; i < 16; ++i) 256 ; 257 } 258 259 void test_firstprivate() { 260 int i; 261 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 262 // expected-error@+1 {{expected expression}} 263 #pragma omp parallel for firstprivate( 264 for (i = 0; i < 16; ++i) 265 ; 266 267 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 268 // expected-error@+1 2 {{expected expression}} 269 #pragma omp parallel for firstprivate(, 270 for (i = 0; i < 16; ++i) 271 ; 272 // expected-error@+1 2 {{expected expression}} 273 #pragma omp parallel for firstprivate(, ) 274 for (i = 0; i < 16; ++i) 275 ; 276 // expected-error@+1 {{expected expression}} 277 #pragma omp parallel for firstprivate() 278 for (i = 0; i < 16; ++i) 279 ; 280 // expected-error@+1 {{expected expression}} 281 #pragma omp parallel for firstprivate(int) 282 for (i = 0; i < 16; ++i) 283 ; 284 // expected-error@+1 {{expected variable name}} 285 #pragma omp parallel for firstprivate(0) 286 for (i = 0; i < 16; ++i) 287 ; 288 289 int x, y, z; 290 #pragma omp parallel for lastprivate(x) firstprivate(x) 291 for (i = 0; i < 16; ++i) 292 ; 293 #pragma omp parallel for lastprivate(x, y) firstprivate(x, y) 294 for (i = 0; i < 16; ++i) 295 ; 296 #pragma omp parallel for lastprivate(x, y, z) firstprivate(x, y, z) 297 for (i = 0; i < 16; ++i) 298 ; 299 } 300 301 void test_loop_messages() { 302 float a[100], b[100], c[100]; 303 // expected-error@+2 {{variable must be of integer or pointer type}} 304 #pragma omp parallel for 305 for (float fi = 0; fi < 10.0; fi++) { 306 c[(int)fi] = a[(int)fi] + b[(int)fi]; 307 } 308 // expected-error@+2 {{variable must be of integer or pointer type}} 309 #pragma omp parallel for 310 for (double fi = 0; fi < 10.0; fi++) { 311 c[(int)fi] = a[(int)fi] + b[(int)fi]; 312 } 313 } 314 315