1b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s
2c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
3c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesvoid foo() {
4c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
5c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
6c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesbool foobool(int argc) {
7c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return argc;
8c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
9c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
10c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct S1; // expected-note {{declared here}}
11c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesextern S1 a;
12c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass S2 {
13c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  mutable int a;
14c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
15c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
16c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S2() : a(0) {}
17c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S2(S2 &s2) : a(s2.a) {}
18c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
19c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesconst S2 b;
20c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesconst S2 ba[5];
21c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass S3 {
22c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int a;
23c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
24c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
25c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S3() : a(0) {}
26c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S3(S3 &s3) : a(s3.a) {}
27c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
28c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesconst S3 c;
29c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesconst S3 ca[5];
30c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesextern const int f;
31c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass S4 {
32c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int a;
33c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S4();
34c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S4(const S4 &s4);
35c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
36c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
37c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S4(int v) : a(v) {}
38c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
39c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesclass S5 {
40c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int a;
41c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S5() : a(0) {}
42c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S5(const S5 &s5) : a(s5.a) {}
43c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
44c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinespublic:
45c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S5(int v) : a(v) {}
46c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines};
47c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
48c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesS3 h;
49c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp threadprivate(h) // expected-note {{defined as threadprivate or thread local}}
50c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
5158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarnamespace A {
5258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainardouble x;
5358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
5458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
5558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarnamespace B {
5658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarusing A::x;
5758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
5858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
59c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint main(int argc, char **argv) {
60c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  const int d = 5;
61c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  const int da[5] = {0};
62c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S4 e(4);
63c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  S5 g(5);
64c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int i;
65c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  int &j = i;
66c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared // expected-error {{expected '(' after 'shared'}}
67c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
68c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
69c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
70c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared() // expected-error {{expected expression}}
71c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
72c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
73c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
74c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
75c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
76c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
77c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
78c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(argc)
79c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
80c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(S1) // expected-error {{'S1' does not refer to a value}}
81c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
82c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(a, b, c, d, f)
83c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
84c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(argv[1]) // expected-error {{expected variable name}}
85c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
86c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(ba)
87c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
88c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(ca)
89c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
90c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(da)
91c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
92c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(e, g)
93c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
9458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp parallel sections shared(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be shared}}
95c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
96c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections private(i), shared(i) // expected-error {{private variable cannot be shared}} expected-note {{defined as private}}
97c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
98c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections firstprivate(i), shared(i) // expected-error {{firstprivate variable cannot be shared}} expected-note {{defined as firstprivate}}
99c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  { foo(); }
100c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections private(i)
101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  {
102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(i)
103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    {
104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(j)
105c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      { foo(); }
106c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
107c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
108c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections firstprivate(i)
109c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  {
110c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(i)
111c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    {
112c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#pragma omp parallel sections shared(j)
113c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      { foo(); }
114c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    }
115c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  }
116c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines
117c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines  return 0;
118c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}
119