1b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid foo() {
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool foobool(int argc) {
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return argc;
8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate <typename T>
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarstruct S {
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  T b;
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  S(T a, T c) {
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma omp task default(none) firstprivate(a, b)
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    a = b = c; // expected-error {{variable 'c' must have explicitly specified data sharing attributes}}
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarS<int> s(3, 4); // expected-note {{in instantiation of member function 'S<int>::S' requested here}}
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct S1; // expected-note {{declared here}} expected-note{{forward declaration of 'S1'}}
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesextern S1 a;
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass S2 {
24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  mutable int a;
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S2() : a(0) {}
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S2(const S2 &s2) : a(s2.a) {}
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static float S2s;
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static const float S2sc;
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst float S2::S2sc = 0;
33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst S2 b;
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst S2 ba[5];
35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass S3 {
36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int a;
37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S3() : a(0) {}
40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S3(const S3 &s3) : a(s3.a) {}
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst S3 c;
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst S3 ca[5];
44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesextern const int f;
45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass S4 {
46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int a;
47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S4();
48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}}
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S4(int v) : a(v) {}
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass S5 {
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int a;
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S5() : a(0) {}
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S5(const S5 &s5) : a(s5.a) {} // expected-note 2 {{implicitly declared private here}}
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S5(int v) : a(v) {}
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesS3 h;
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp threadprivate(h) // expected-note {{defined as threadprivate or thread local}}
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
65b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarvoid bar(int n, int b[n]) {
66b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar#pragma omp task firstprivate(b)
67b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    foo();
68b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
69b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
7058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarnamespace A {
7158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainardouble x;
7258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
7358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
7458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarnamespace B {
7558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarusing A::x;
7658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
7758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint main(int argc, char **argv) {
79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const int d = 5;
80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const int da[5] = {0};
81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S4 e(4);
82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S5 g(5);
83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int i;
8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int &j = i;
8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static int m;
86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate                               // expected-error {{expected '(' after 'firstprivate'}}
87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(                              // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate()                             // expected-error {{expected expression}}
89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(argc                          // expected-error {{expected ')'}} expected-note {{to match this '('}}
90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(argc,                         // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(argc)
93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(S1)            // expected-error {{'S1' does not refer to a value}}
94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(argv[1])       // expected-error {{expected variable name}}
96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(ba)
97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(ca)
98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(da)
99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(S2::S2s)
100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(S2::S2sc)
101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(e, g)          // expected-error 2 {{calling a private constructor of class 'S4'}} expected-error 2 {{calling a private constructor of class 'S5'}}
10258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp task firstprivate(h, B::x)       // expected-error 2 {{threadprivate or thread local variable cannot be firstprivate}}
103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task private(i), firstprivate(i) // expected-error {{private variable cannot be firstprivate}} expected-note{{defined as private}}
104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  foo();
105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task shared(i)
106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp task firstprivate(i)
10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#pragma omp task firstprivate(j)
10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#pragma omp task firstprivate(m) // OK
109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  foo();
110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return 0;
112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
113