1// RUN: %clang_cc1 -verify -fopenmp=libiomp5 %s 2 3void foo() { 4} 5 6bool foobool(int argc) { 7 return argc; 8} 9 10struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} 11extern S1 a; 12class S2 { 13 mutable int a; 14 15public: 16 S2() : a(0) {} 17 S2(const S2 &s2) : a(s2.a) {} 18 static float S2s; 19 static const float S2sc; 20}; 21const float S2::S2sc = 0; 22const S2 b; 23const S2 ba[5]; 24class S3 { 25 int a; 26 S3 &operator=(const S3 &s3); 27 28public: 29 S3() : a(0) {} 30 S3(const S3 &s3) : a(s3.a) {} 31}; 32const S3 c; 33const S3 ca[5]; 34extern const int f; 35class S4 { 36 int a; 37 S4(); 38 S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}} 39 40public: 41 S4(int v) : a(v) {} 42}; 43class S5 { 44 int a; 45 S5(const S5 &s5) : a(s5.a) {} // expected-note 4 {{implicitly declared private here}} 46 47public: 48 S5() : a(0) {} 49 S5(int v) : a(v) {} 50}; 51class S6 { 52 int a; 53 S6() : a(0) {} 54 55public: 56 S6(const S6 &s6) : a(s6.a) {} 57 S6(int v) : a(v) {} 58}; 59 60S3 h; 61#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} 62 63template <class I, class C> 64int foomain(int argc, char **argv) { 65 I e(4); 66 C g(5); 67 int i; 68 int &j = i; // expected-note {{'j' defined here}} 69#pragma omp parallel sections firstprivate // expected-error {{expected '(' after 'firstprivate'}} 70 { 71 foo(); 72 } 73#pragma omp parallel sections firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 74 { 75 foo(); 76 } 77#pragma omp parallel sections firstprivate() // expected-error {{expected expression}} 78 { 79 foo(); 80 } 81#pragma omp parallel sections firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 82 { 83 foo(); 84 } 85#pragma omp parallel sections firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 86 { 87 foo(); 88 } 89#pragma omp parallel sections firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 90 { 91 foo(); 92 } 93#pragma omp parallel sections firstprivate(argc) 94 { 95 foo(); 96 } 97#pragma omp parallel sections firstprivate(S1) // expected-error {{'S1' does not refer to a value}} 98 { 99 foo(); 100 } 101#pragma omp parallel sections firstprivate(a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}} 102 { 103 foo(); 104 } 105#pragma omp parallel sections firstprivate(argv[1]) // expected-error {{expected variable name}} 106 { 107 foo(); 108 } 109#pragma omp parallel sections firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 110 { 111 foo(); 112 } 113#pragma omp parallel sections firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}} 114 { 115 foo(); 116 } 117#pragma omp parallel sections linear(i) // expected-error {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel sections'}} 118 { 119 foo(); 120 } 121#pragma omp parallel 122 { 123 int v = 0; 124 int i; 125#pragma omp parallel sections firstprivate(i) 126 { 127 foo(); 128 } 129 v += i; 130 } 131#pragma omp parallel shared(i) 132#pragma omp parallel private(i) 133#pragma omp parallel sections firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} 134 { 135 foo(); 136 } 137#pragma omp parallel sections firstprivate(i) 138 { 139 foo(); 140 } 141#pragma omp parallel sections lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}} 142 { 143 foo(); 144 } 145#pragma omp parallel private(i) 146#pragma omp parallel sections firstprivate(i) 147 { 148 foo(); 149 } 150#pragma omp parallel reduction(+ : i) 151#pragma omp parallel sections firstprivate(i) 152 { 153 foo(); 154 } 155 return 0; 156} 157 158namespace A { 159double x; 160#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} 161} 162namespace B { 163using A::x; 164} 165 166int main(int argc, char **argv) { 167 const int d = 5; 168 const int da[5] = {0}; 169 S4 e(4); 170 S5 g(5); 171 S3 m; 172 S6 n(2); 173 int i; 174 int &j = i; // expected-note {{'j' defined here}} 175#pragma omp parallel sections firstprivate // expected-error {{expected '(' after 'firstprivate'}} 176 { 177 foo(); 178 } 179#pragma omp parallel sections firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 180 { 181 foo(); 182 } 183#pragma omp parallel sections firstprivate() // expected-error {{expected expression}} 184 { 185 foo(); 186 } 187#pragma omp parallel sections firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 188 { 189 foo(); 190 } 191#pragma omp parallel sections firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 192 { 193 foo(); 194 } 195#pragma omp parallel sections firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 196 { 197 foo(); 198 } 199#pragma omp parallel sections firstprivate(argc) 200 { 201 foo(); 202 } 203#pragma omp parallel sections firstprivate(S1) // expected-error {{'S1' does not refer to a value}} 204 { 205 foo(); 206 } 207#pragma omp parallel sections firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}} 208 { 209 foo(); 210 } 211#pragma omp parallel sections firstprivate(argv[1]) // expected-error {{expected variable name}} 212 { 213 foo(); 214 } 215#pragma omp parallel sections firstprivate(2 * 2) // expected-error {{expected variable name}} 216 { 217 foo(); 218 } 219#pragma omp parallel sections firstprivate(ba) // OK 220 { 221 foo(); 222 } 223#pragma omp parallel sections firstprivate(ca) // OK 224 { 225 foo(); 226 } 227#pragma omp parallel sections firstprivate(da) // OK 228 { 229 foo(); 230 } 231 int xa; 232#pragma omp parallel sections firstprivate(xa) // OK 233 { 234 foo(); 235 } 236#pragma omp parallel sections firstprivate(S2::S2s) // OK 237 { 238 foo(); 239 } 240#pragma omp parallel sections firstprivate(S2::S2sc) // OK 241 { 242 foo(); 243 } 244#pragma omp parallel sections safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp parallel sections'}} 245 { 246 foo(); 247 } 248#pragma omp parallel sections firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 249 { 250 foo(); 251 } 252#pragma omp parallel sections firstprivate(m) // OK 253 { 254 foo(); 255 } 256#pragma omp parallel sections firstprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be firstprivate}} 257 { 258 foo(); 259 } 260#pragma omp parallel sections private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}} 261 { 262 foo(); 263 } 264#pragma omp parallel shared(xa) 265#pragma omp parallel sections firstprivate(xa) // OK: may be firstprivate 266 { 267 foo(); 268 } 269#pragma omp parallel sections firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} 270 { 271 foo(); 272 } 273#pragma omp parallel sections lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}} 274 { 275 foo(); 276 } 277#pragma omp parallel sections lastprivate(n) firstprivate(n) // OK 278 { 279 foo(); 280 } 281#pragma omp parallel 282 { 283 int v = 0; 284 int i; 285#pragma omp parallel sections firstprivate(i) 286 { 287 foo(); 288 } 289 v += i; 290 } 291#pragma omp parallel private(i) 292#pragma omp parallel sections firstprivate(i) 293 { 294 foo(); 295 } 296#pragma omp parallel reduction(+ : i) 297#pragma omp parallel sections firstprivate(i) 298 { 299 foo(); 300 } 301 302 return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}} 303} 304