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