1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s -Wuninitialized 2 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++98 -o - %s -Wuninitialized 3 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized 4 5 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized 6 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++98 -o - %s -Wuninitialized 7 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s -Wuninitialized 8 9 void xxx(int argc) { 10 int x; // expected-note {{initialize the variable 'x' to silence this warning}} 11 #pragma omp for ordered 12 for (int i = 0; i < 10; ++i) { 13 #pragma omp ordered 14 argc = x; // expected-warning {{variable 'x' is uninitialized when used here}} 15 } 16 } 17 18 int foo(); 19 20 template <class T> 21 T foo() { 22 T k; 23 #pragma omp for ordered 24 for (int i = 0; i < 10; ++i) { 25 L1: 26 foo(); 27 #pragma omp ordered 28 { 29 foo(); 30 goto L1; // expected-error {{use of undeclared label 'L1'}} 31 } 32 } 33 #pragma omp for ordered 34 for (int i = 0; i < 10; ++i) { 35 foo(); 36 goto L2; // expected-error {{use of undeclared label 'L2'}} 37 #pragma omp ordered 38 { 39 L2: 40 foo(); 41 } 42 } 43 #pragma omp for ordered 44 for (int i = 0; i < 10; ++i) { 45 #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}} 46 { 47 foo(); 48 } 49 } 50 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 51 for (int i = 0; i < 10; ++i) { 52 #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 53 { 54 foo(); 55 } 56 } 57 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 58 for (int i = 0; i < 10; ++i) { 59 #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}} 60 { 61 foo(); 62 } 63 } 64 #pragma omp for ordered 65 for (int i = 0; i < 10; ++i) { 66 #pragma omp ordered // expected-note {{previous 'ordered' directive used here}} 67 { 68 foo(); 69 } 70 #pragma omp ordered // expected-error {{exactly one 'ordered' directive must appear in the loop body of an enclosing directive}} 71 { 72 foo(); 73 } 74 } 75 #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}} 76 { 77 foo(); 78 } 79 #pragma omp simd 80 for (int i = 0; i < 10; ++i) { 81 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 82 { 83 foo(); 84 } 85 } 86 #pragma omp simd 87 for (int i = 0; i < 10; ++i) { 88 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 89 { 90 foo(); 91 } 92 } 93 #pragma omp simd 94 for (int i = 0; i < 10; ++i) { 95 #pragma omp ordered simd // expected-note {{previous 'ordered' directive used here}} 96 { 97 foo(); 98 } 99 #pragma omp ordered simd // expected-error {{exactly one 'ordered' directive must appear in the loop body of an enclosing directive}} 100 { 101 foo(); 102 } 103 } 104 #pragma omp for simd 105 for (int i = 0; i < 10; ++i) { 106 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 107 { 108 foo(); 109 } 110 } 111 #pragma omp for simd 112 for (int i = 0; i < 10; ++i) { 113 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 114 { 115 foo(); 116 } 117 } 118 #pragma omp parallel for simd 119 for (int i = 0; i < 10; ++i) { 120 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 121 { 122 foo(); 123 } 124 } 125 #pragma omp parallel for simd 126 for (int i = 0; i < 10; ++i) { 127 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 128 { 129 foo(); 130 } 131 #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}} 132 } 133 #pragma omp parallel for ordered 134 for (int i = 0; i < 10; ++i) { 135 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 136 #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 137 } 138 #pragma omp parallel for ordered(2) // expected-note 3 {{'ordered' clause with specified parameter}} 139 for (int i = 0; i < 10; ++i) { 140 for (int j = 0; j < 10; ++j) { 141 #pragma omp ordered depend // expected-error {{expected '(' after 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 142 #pragma omp ordered depend( // expected-error {{expected ')'}} expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-note {{to match this '('}} 143 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}} 144 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'i' loop iteration variable}} 145 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{expected 'i' loop iteration variable}} 146 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}} 147 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}} 148 #pragma omp ordered depend(source) 149 if (i == j) 150 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 151 ; 152 if (i == j) 153 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 154 ; 155 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}} 156 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}} 157 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}} 158 #pragma omp ordered depend(in : i) // expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 159 #pragma omp ordered depend(sink : i, j) 160 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}} 161 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}} 162 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}} 163 #if __cplusplus >= 201103L 164 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}} 165 #endif 166 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}} 167 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(sink : i-0, j+sizeof(T)) 168 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(source) // expected-error {{'depend(source)' clause cannot be mixed with 'depend(sink:vec)' clauses}} 169 #pragma omp ordered depend(source) depend(sink : i-0, j+sizeof(T)) // expected-error {{'depend(sink:vec)' clauses cannot be mixed with 'depend(source)' clause}} 170 } 171 } 172 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 173 #pragma omp ordered depend(sink:k) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 174 return T(); 175 } 176 177 int foo() { 178 #if __cplusplus >= 201103L 179 // expected-note@-2 2 {{declared here}} 180 #endif 181 int k; 182 #pragma omp for ordered 183 for (int i = 0; i < 10; ++i) { 184 L1: 185 foo(); 186 #pragma omp ordered 187 { 188 foo(); 189 goto L1; // expected-error {{use of undeclared label 'L1'}} 190 } 191 } 192 #pragma omp for ordered 193 for (int i = 0; i < 10; ++i) { 194 foo(); 195 goto L2; // expected-error {{use of undeclared label 'L2'}} 196 #pragma omp ordered 197 { 198 L2: 199 foo(); 200 } 201 } 202 #pragma omp for ordered 203 for (int i = 0; i < 10; ++i) { 204 #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}} 205 { 206 foo(); 207 } 208 } 209 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 210 for (int i = 0; i < 10; ++i) { 211 #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 212 { 213 foo(); 214 } 215 } 216 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 217 for (int i = 0; i < 10; ++i) { 218 #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}} 219 { 220 foo(); 221 } 222 } 223 #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}} 224 { 225 foo(); 226 } 227 #pragma omp simd 228 for (int i = 0; i < 10; ++i) { 229 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 230 { 231 foo(); 232 } 233 } 234 #pragma omp simd 235 for (int i = 0; i < 10; ++i) { 236 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 237 { 238 foo(); 239 } 240 } 241 #pragma omp for simd 242 for (int i = 0; i < 10; ++i) { 243 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 244 { 245 foo(); 246 } 247 } 248 #pragma omp for simd 249 for (int i = 0; i < 10; ++i) { 250 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 251 { 252 foo(); 253 } 254 } 255 #pragma omp parallel for simd 256 for (int i = 0; i < 10; ++i) { 257 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 258 { 259 foo(); 260 } 261 } 262 #pragma omp parallel for simd 263 for (int i = 0; i < 10; ++i) { 264 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 265 { 266 foo(); 267 } 268 #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}} 269 } 270 #pragma omp parallel for ordered 271 for (int i = 0; i < 10; ++i) { 272 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 273 #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 274 } 275 #pragma omp parallel for ordered(2) // expected-note 3 {{'ordered' clause with specified parameter}} 276 for (int i = 0; i < 10; ++i) { 277 for (int j = 0; j < 10; ++j) { 278 #pragma omp ordered depend // expected-error {{expected '(' after 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 279 #pragma omp ordered depend( // expected-error {{expected ')'}} expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-note {{to match this '('}} 280 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}} 281 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'i' loop iteration variable}} 282 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{expected 'i' loop iteration variable}} 283 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}} 284 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}} 285 #pragma omp ordered depend(source) 286 if (i == j) 287 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 288 ; 289 if (i == j) 290 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 291 ; 292 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}} 293 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}} 294 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}} 295 #pragma omp ordered depend(in : i) // expected-error {{expected 'source' or 'sink' in OpenMP clause 'depend'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 296 #pragma omp ordered depend(sink : i, j) allocate(i) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp ordered'}} 297 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}} 298 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}} 299 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}} 300 #if __cplusplus >= 201103L 301 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}} 302 #endif 303 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}} 304 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(sink : i-0, j+sizeof(int)) 305 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(source) // expected-error {{'depend(source)' clause cannot be mixed with 'depend(sink:vec)' clauses}} 306 #pragma omp ordered depend(source) depend(sink : i-0, j+sizeof(int)) // expected-error {{'depend(sink:vec)' clauses cannot be mixed with 'depend(source)' clause}} 307 } 308 } 309 310 #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}} 311 for (int i = 0; i < 10; ++i) { // expected-error {{expected 2 for loops after '#pragma omp for', but found only 1}} 312 #pragma omp ordered depend(sink : i) 313 int j; 314 #pragma omp ordered depend(sink : i, j) // expected-error {{expected loop iteration variable}} 315 foo(); 316 } 317 318 return foo<int>(); // expected-note {{in instantiation of function template specialization 'foo<int>' requested here}} 319 } 320