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 return T(); 142 } 143 144 int foo() { 145 #if __cplusplus >= 201103L 146 // expected-note@-2 2 {{declared here}} 147 #endif 148 int k; 149 #pragma omp for ordered 150 for (int i = 0; i < 10; ++i) { 151 L1: 152 foo(); 153 #pragma omp ordered 154 { 155 foo(); 156 goto L1; // expected-error {{use of undeclared label 'L1'}} 157 } 158 } 159 #pragma omp for ordered 160 for (int i = 0; i < 10; ++i) { 161 foo(); 162 goto L2; // expected-error {{use of undeclared label 'L2'}} 163 #pragma omp ordered 164 { 165 L2: 166 foo(); 167 } 168 } 169 #pragma omp for ordered 170 for (int i = 0; i < 10; ++i) { 171 #pragma omp ordered threads threads // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'threads' clause}} 172 { 173 foo(); 174 } 175 } 176 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 177 for (int i = 0; i < 10; ++i) { 178 #pragma omp ordered // expected-error {{'ordered' directive without any clauses cannot be closely nested inside ordered region with specified parameter}} 179 { 180 foo(); 181 } 182 } 183 #pragma omp for ordered(1) // expected-note {{'ordered' clause with specified parameter}} 184 for (int i = 0; i < 10; ++i) { 185 #pragma omp ordered threads // expected-error {{'ordered' directive with 'threads' clause cannot be closely nested inside ordered region with specified parameter}} 186 { 187 foo(); 188 } 189 } 190 #pragma omp ordered simd simd // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'simd' clause}} 191 { 192 foo(); 193 } 194 #pragma omp simd 195 for (int i = 0; i < 10; ++i) { 196 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 197 { 198 foo(); 199 } 200 } 201 #pragma omp simd 202 for (int i = 0; i < 10; ++i) { 203 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 204 { 205 foo(); 206 } 207 } 208 #pragma omp for simd 209 for (int i = 0; i < 10; ++i) { 210 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 211 { 212 foo(); 213 } 214 } 215 #pragma omp for simd 216 for (int i = 0; i < 10; ++i) { 217 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 218 { 219 foo(); 220 } 221 } 222 #pragma omp parallel for simd 223 for (int i = 0; i < 10; ++i) { 224 #pragma omp ordered // expected-error {{OpenMP constructs may not be nested inside a simd region}} 225 { 226 foo(); 227 } 228 } 229 #pragma omp parallel for simd 230 for (int i = 0; i < 10; ++i) { 231 #pragma omp ordered threads // expected-error {{OpenMP constructs may not be nested inside a simd region}} 232 { 233 foo(); 234 } 235 #pragma omp ordered depend(source) // expected-error {{OpenMP constructs may not be nested inside a simd region}} 236 } 237 #pragma omp parallel for ordered 238 for (int i = 0; i < 10; ++i) { 239 #pragma omp ordered depend(source) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 240 #pragma omp ordered depend(sink : i) // expected-error {{'ordered' directive with 'depend' clause cannot be closely nested inside ordered region without specified parameter}} 241 } 242 #pragma omp parallel for ordered(2) // expected-note 5 {{'ordered' clause with specified parameter}} 243 for (int i = 0; i < 10; ++i) { 244 for (int j = 0; j < 10; ++j) { 245 #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}} 246 #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 '('}} 247 #pragma omp ordered depend(source // expected-error {{expected ')'}} expected-note {{to match this '('}} 248 #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 '('}} 249 #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}} 250 #pragma omp ordered depend(sink : i // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected 'j' loop iteration variable}} 251 #pragma omp ordered depend(sink : i) // expected-error {{expected 'j' loop iteration variable}} 252 #pragma omp ordered depend(source) 253 if (i == j) 254 #pragma omp ordered depend(source) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 255 ; 256 if (i == j) 257 #pragma omp ordered depend(sink : i, j) // expected-error {{'#pragma omp ordered' with 'depend' clause cannot be an immediate substatement}} 258 ; 259 #pragma omp ordered depend(source) threads // expected-error {{'depend' clauses cannot be mixed with 'threads' clause}} 260 #pragma omp ordered simd depend(source) // expected-error {{'depend' clauses cannot be mixed with 'simd' clause}} 261 #pragma omp ordered depend(source) depend(source) // expected-error {{directive '#pragma omp ordered' cannot contain more than one 'depend' clause with 'source' dependence}} 262 #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}} 263 #pragma omp ordered depend(sink : i, j) 264 #pragma omp ordered depend(sink : j, i) // expected-error {{expected 'i' loop iteration variable}} expected-error {{expected 'j' loop iteration variable}} 265 #pragma omp ordered depend(sink : i, j, k) // expected-error {{unexpected expression: number of expressions is larger than the number of associated loops}} 266 #pragma omp ordered depend(sink : i+foo(), j/4) // expected-error {{expression is not an integral constant expression}} expected-error {{expected '+' or '-' operation}} 267 #if __cplusplus >= 201103L 268 // expected-note@-2 {{non-constexpr function 'foo' cannot be used in a constant expression}} 269 #endif 270 #pragma omp ordered depend(sink : i*0, j-4)// expected-error {{expected '+' or '-' operation}} 271 #pragma omp ordered depend(sink : i-0, j+sizeof(int)) depend(sink : i-0, j+sizeof(int)) 272 #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}} 273 #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}} 274 } 275 } 276 277 #pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}} 278 for (int i = 0; i < 10; ++i) { // expected-error {{expected 2 for loops after '#pragma omp for', but found only 1}} 279 #pragma omp ordered depend(sink : i) 280 int j; 281 #pragma omp ordered depend(sink : i, j) // expected-error {{expected loop iteration variable}} 282 foo(); 283 } 284 285 return foo<int>(); // expected-note {{in instantiation of function template specialization 'foo<int>' requested here}} 286 } 287