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