1b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// RUN: %clang_cc1 -verify -fopenmp %s
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid foo() {
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool foobool(int argc) {
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return argc;
8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesextern S1 a;
12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass S2 {
13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  mutable int a;
14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S2() : a(0) {}
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S2(S2 &s2) : a(s2.a) {}
1858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  S2 &operator =(const S2&);
1958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  const S2 &operator =(const S2&) const;
20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static float S2s; // expected-note {{static data member is predetermined as shared}}
21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  static const float S2sc;
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}}
24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst S2 b;
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst S2 ba[5];
2658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarclass S3 {
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int a;
2858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  S3 &operator=(const S3 &s3); // expected-note 2 {{implicitly declared private here}}
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S3() : a(0) {}
32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S3(S3 &s3) : a(s3.a) {}
33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst S3 c;         // expected-note {{global variable is predetermined as shared}}
35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesconst S3 ca[5];     // expected-note {{global variable is predetermined as shared}}
36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesextern const int f; // expected-note {{global variable is predetermined as shared}}
3758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarclass S4 {
38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int a;
3958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  S4();             // expected-note 3 {{implicitly declared private here}}
40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S4(const S4 &s4);
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S4(int v) : a(v) {}
44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
4558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarclass S5 {
46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int a;
4758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  S5() : a(0) {} // expected-note {{implicitly declared private here}}
48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S5(const S5 &s5) : a(s5.a) {}
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S5(int v) : a(v) {}
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass S6 {
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int a;
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S6() : a(0) {}
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinespublic:
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S6(const S6 &s6) : a(s6.a) {}
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S6(int v) : a(v) {}
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesS3 h;
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <class I, class C>
66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint foomain(int argc, char **argv) {
6758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  I e(4);
6858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  I g(5);
69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int i;
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int &j = i;
71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}}
73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate() // expected-error {{expected expression}}
81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argc)
97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(S1) // expected-error {{'S1' does not refer to a value}}
101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(a, b) // expected-error {{lastprivate variable with incomplete type 'S1'}}
105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argv[1]) // expected-error {{expected variable name}}
109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
11258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp for simd lastprivate(e, g) // expected-error 2 {{calling a private constructor of class 'S4'}}
113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
114176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
115176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
116176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}
117176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
118176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
119176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
120176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd
121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  {
125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int v = 0;
126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    int i;                     // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for simd' directive into a parallel or another task region?}}
127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(i) // expected-error {{lastprivate variable must be shared}}
128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (int k = 0; k < argc; ++k) {
129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      i = k;
130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      v += i;
131176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    }
132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
133176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel shared(i)
134176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel private(i)
13587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#pragma omp for simd lastprivate(j)
136176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
137176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
138176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(i)
140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (int k = 0; k < argc; ++k)
141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    ++k;
142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return 0;
143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
14558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarnamespace A {
14658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainardouble x;
14758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
14858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
14958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarnamespace B {
15058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainarusing A::x;
15158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar}
15258878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar
153176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesint main(int argc, char **argv) {
154176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const int d = 5;       // expected-note {{constant variable is predetermined as shared}}
155176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  const int da[5] = {0}; // expected-note {{constant variable is predetermined as shared}}
15658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  S4 e(4);
15758878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  S5 g(5);
15858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar  S3 m;
159176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  S6 n(2);
160176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int i;
16187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  int &j = i;
162176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
163176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}}
164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
165176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
168176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
170176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
171176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate() // expected-error {{expected expression}}
172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
180176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
181176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
182176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
183176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
184176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
185176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
186176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
187176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argc)
188176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
189176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
190176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
191176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(S1) // expected-error {{'S1' does not refer to a value}}
192176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
193176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be lastprivate}}
196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
197176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
198176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
199176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(argv[1]) // expected-error {{expected variable name}}
200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
202176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
203176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(2 * 2) // expected-error {{expected variable name}}
204176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
205176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
207176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(ba)
208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
210176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
211176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(ca) // expected-error {{shared variable cannot be lastprivate}}
212176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
213176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
214176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
215176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(da) // expected-error {{shared variable cannot be lastprivate}}
216176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
218176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int xa;
219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
220176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(xa) // OK
221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
222176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
223176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}}
225176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
228176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(S2::S2sc) // expected-error {{shared variable cannot be lastprivate}}
229176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
232176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd
233176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
234176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
235176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
23658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp for simd lastprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
237176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
238176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
239176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
24058878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp for simd lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}}
241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
24458878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp for simd lastprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be lastprivate}}
245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
246176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
247176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
248176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd private(xa), lastprivate(xa) // expected-error {{private variable cannot be lastprivate}} expected-note {{defined as private}}
249176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
250176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
251176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(i) // expected-note {{defined as lastprivate}}
253176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp for simd' directive may not be lastprivate, predetermined as linear}}
254176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
255176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel private(xa) // expected-note {{defined as private}}
256176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(xa)  // expected-error {{lastprivate variable must be shared}}
257176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
258176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
259176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel reduction(+ : xa) // expected-note {{defined as reduction}}
260176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(xa)        // expected-error {{lastprivate variable must be shared}}
261176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
262176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
263176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
26487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#pragma omp for simd lastprivate(j)
265176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
266176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
267176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
26858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar#pragma omp for simd firstprivate(m) lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}}
269176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
270176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
271176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp parallel
272176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma omp for simd lastprivate(n) firstprivate(n) // OK
273176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  for (i = 0; i < argc; ++i)
274176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    foo();
27587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  static int si;
27687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#pragma omp for simd lastprivate(si) // OK
27787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  for (i = 0; i < argc; ++i)
27887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    si = i + 1;
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
281