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 ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}} 65 { 66 foo(); 67 } 68 #pragma omp simd 69 for (int i = 0; i < 10; ++i) { 70 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 71 { 72 foo(); 73 } 74 } 75 #pragma omp simd 76 for (int i = 0; i < 10; ++i) { 77 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 78 { 79 foo(); 80 } 81 } 82 #pragma omp for simd 83 for (int i = 0; i < 10; ++i) { 84 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 85 { 86 foo(); 87 } 88 } 89 #pragma omp for simd 90 for (int i = 0; i < 10; ++i) { 91 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 92 { 93 foo(); 94 } 95 } 96 #pragma omp parallel for simd 97 for (int i = 0; i < 10; ++i) { 98 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 99 { 100 foo(); 101 } 102 } 103 #pragma omp parallel for simd 104 for (int i = 0; i < 10; ++i) { 105 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 106 { 107 foo(); 108 } 109 #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}} 110 } 111 #pragma omp parallel for ordered 112 for (int i = 0; i < 10; ++i) { 113 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 114 #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 115 } 116 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}} 117 for (int i = 0; i < 10; ++i) { 118 for (int j = 0; j < 10; ++j) { 119 #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}} 120 #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 '('}} 121 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}} 122 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-note {{to match this '('}} 123 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 124 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}} 125 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}} 126 #pragma omp ordered depend(source) 127 if (i == j) 128 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 129 ; 130 if (i == j) 131 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 132 ; 133 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}} 134 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}} 135 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}} 136 #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}} 137 #pragma omp ordered depend(sink : i, j) 138 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}} 139 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}} 140 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}} 141 #if __cplusplus >= 201103L 142 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}} 143 #endif 144 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}} 145 #pragma omp ordered depend(sink : i-0, j+sizeof(T)) depend(sink : i-0, j+sizeof(T)) 146 #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}} 147 #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}} 148 } 149 } 150 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 151 #pragma omp ordered depend(sink:k) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 152 return T(); 153 } 154 155 int foo() { 156 #if __cplusplus >= 201103L 157 // expected-note@-2 2 {{declared here}} 158 #endif 159 int k; 160 #pragma omp for ordered 161 for (int i = 0; i < 10; ++i) { 162 L1: 163 foo(); 164 #pragma omp ordered 165 { 166 foo(); 167 goto L1; // expected-error {{use of undeclared label 'L1'}} 168 } 169 } 170 #pragma omp for ordered 171 for (int i = 0; i < 10; ++i) { 172 foo(); 173 goto L2; // expected-error {{use of undeclared label 'L2'}} 174 #pragma omp ordered 175 { 176 L2: 177 foo(); 178 } 179 } 180 #pragma omp for ordered 181 for (int i = 0; i < 10; ++i) { 182 #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}} 183 { 184 foo(); 185 } 186 } 187 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 188 for (int i = 0; i < 10; ++i) { 189 #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 190 { 191 foo(); 192 } 193 } 194 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 195 for (int i = 0; i < 10; ++i) { 196 #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}} 197 { 198 foo(); 199 } 200 } 201 #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}} 202 { 203 foo(); 204 } 205 #pragma omp simd 206 for (int i = 0; i < 10; ++i) { 207 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 208 { 209 foo(); 210 } 211 } 212 #pragma omp simd 213 for (int i = 0; i < 10; ++i) { 214 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 215 { 216 foo(); 217 } 218 } 219 #pragma omp for simd 220 for (int i = 0; i < 10; ++i) { 221 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 222 { 223 foo(); 224 } 225 } 226 #pragma omp for simd 227 for (int i = 0; i < 10; ++i) { 228 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 229 { 230 foo(); 231 } 232 } 233 #pragma omp parallel for simd 234 for (int i = 0; i < 10; ++i) { 235 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 236 { 237 foo(); 238 } 239 } 240 #pragma omp parallel for simd 241 for (int i = 0; i < 10; ++i) { 242 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 243 { 244 foo(); 245 } 246 #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}} 247 } 248 #pragma omp parallel for ordered 249 for (int i = 0; i < 10; ++i) { 250 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 251 #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 252 } 253 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}} 254 for (int i = 0; i < 10; ++i) { 255 for (int j = 0; j < 10; ++j) { 256 #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}} 257 #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 '('}} 258 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}} 259 #pragma omp ordered depend(sink // expected-error {{expected expression}} expected-warning {{missing ':' or ')' after dependency type - ignoring}} expected-error {{expected ')'}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} expected-note {{to match this '('}} 260 #pragma omp ordered depend(sink : // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 261 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}} 262 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}} 263 #pragma omp ordered depend(source) 264 if (i == j) 265 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 266 ; 267 if (i == j) 268 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 269 ; 270 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}} 271 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}} 272 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}} 273 #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}} 274 #pragma omp ordered depend(sink : i, j) allocate(i) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp ordered'}} 275 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}} 276 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}} 277 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}} 278 #if __cplusplus >= 201103L 279 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}} 280 #endif 281 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}} 282 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(sink : i-0, j+sizeof(int)) 283 #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}} 284 #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}} 285 } 286 } 287 288 #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}} 289 for (int i = 0; i < 10; ++i) { // expected-error {{expected 2 for loops after '#pragma omp for', but found only 1}} 290 #pragma omp ordered depend(sink : i) 291 int j; 292 #pragma omp ordered depend(sink : i, j) // expected-error {{expected loop iteration variable}} 293 foo(); 294 } 295 296 return foo<int>(); // expected-note {{in instantiation of function template specialization 'foo<int>' requested here}} 297 } 298