parallel_for_firstprivate_messages.cpp revision ef8225444452a1486bd721f3285301fe84643b00
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// RUN: %clang_cc1 -verify -fopenmp=libiomp5 %s
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid foo() {
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgbool foobool(int argc) {
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return argc;
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern S1 a;
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S2 {
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  mutable int a;
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S2() : a(0) {}
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S2(S2 &s2) : a(s2.a) {}
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static float S2s;
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static const float S2sc;
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst float S2::S2sc = 0;
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst S2 b;
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst S2 ba[5];
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S3 {
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int a;
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S3 &operator=(const S3 &s3);
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S3() : a(0) {}
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S3(S3 &s3) : a(s3.a) {}
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst S3 c;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst S3 ca[5];
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern const int f;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S4 { // expected-note 2 {{'S4' declared here}}
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int a;
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S4();
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S4(const S4 &s4);
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S4(int v) : a(v) {}
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S5 { // expected-note 4 {{'S5' declared here}}
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int a;
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S5(const S5 &s5) : a(s5.a) {}
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S5() : a(0) {}
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S5(int v) : a(v) {}
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S6 {
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int a;
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S6() : a(0) {}
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S6(const S6 &s6) : a(s6.a) {}
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S6(int v) : a(v) {}
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgS3 h;
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtemplate <class I, class C>
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint foomain(int argc, char **argv) {
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  I e(4); // expected-note {{'e' defined here}}
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  C g(5); // expected-note 2 {{'g' defined here}}
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int i;
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int &j = i; // expected-note {{'j' defined here}}
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate // expected-error {{expected '(' after 'firstprivate'}}
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate() // expected-error {{expected expression}}
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argc)
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}}
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argv[1]) // expected-error {{expected variable name}}
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(e, g) // expected-error 2 {{firstprivate variable must have an accessible, unambiguous copy constructor}}
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for linear(i) // expected-error {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel for'}}
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  {
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int v = 0;
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int i;
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(i)
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    for (int k = 0; k < argc; ++k) {
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      i = k;
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      v += i;
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel shared(i)
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel private(i)
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}}
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(i)
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (int k = 0; k < argc; ++k)
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ++k;
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for lastprivate(g) firstprivate(g) // expected-error {{firstprivate variable must have an accessible, unambiguous copy constructor}}
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (i = 0; i < argc; ++i)
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    foo();
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel private(i)
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}}
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}}
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    foo();
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel reduction(+ : i)
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}}
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}}
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    foo();
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return 0;
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint main(int argc, char **argv) {
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const int d = 5;
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const int da[5] = {0};
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S4 e(4); // expected-note {{'e' defined here}}
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S5 g(5); // expected-note 2 {{'g' defined here}}
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S3 m;
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  S6 n(2);
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int i;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int &j = i; // expected-note {{'j' defined here}}
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate // expected-error {{expected '(' after 'firstprivate'}}
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (i = 0; i < argc; ++i)
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    foo();
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for (i = 0; i < argc; ++i)
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    foo();
155#pragma omp parallel for firstprivate() // expected-error {{expected expression}}
156  for (i = 0; i < argc; ++i)
157    foo();
158#pragma omp parallel for firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
159  for (i = 0; i < argc; ++i)
160    foo();
161#pragma omp parallel for firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
162  for (i = 0; i < argc; ++i)
163    foo();
164#pragma omp parallel for firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
165  for (i = 0; i < argc; ++i)
166    foo();
167#pragma omp parallel for firstprivate(argc)
168  for (i = 0; i < argc; ++i)
169    foo();
170#pragma omp parallel for firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
171  for (i = 0; i < argc; ++i)
172    foo();
173#pragma omp parallel for firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
174  for (i = 0; i < argc; ++i)
175    foo();
176#pragma omp parallel for firstprivate(argv[1]) // expected-error {{expected variable name}}
177  for (i = 0; i < argc; ++i)
178    foo();
179#pragma omp parallel for firstprivate(2 * 2) // expected-error {{expected variable name}}
180  for (i = 0; i < argc; ++i)
181    foo();
182#pragma omp parallel for firstprivate(ba) // OK
183  for (i = 0; i < argc; ++i)
184    foo();
185#pragma omp parallel for firstprivate(ca) // OK
186  for (i = 0; i < argc; ++i)
187    foo();
188#pragma omp parallel for firstprivate(da) // OK
189  for (i = 0; i < argc; ++i)
190    foo();
191  int xa;
192#pragma omp parallel for firstprivate(xa) // OK
193  for (i = 0; i < argc; ++i)
194    foo();
195#pragma omp parallel for firstprivate(S2::S2s) // OK
196  for (i = 0; i < argc; ++i)
197    foo();
198#pragma omp parallel for firstprivate(S2::S2sc) // OK
199  for (i = 0; i < argc; ++i)
200    foo();
201#pragma omp parallel for safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp parallel for'}}
202  for (i = 0; i < argc; ++i)
203    foo();
204#pragma omp parallel for firstprivate(e, g) // expected-error 2 {{firstprivate variable must have an accessible, unambiguous copy constructor}}
205  for (i = 0; i < argc; ++i)
206    foo();
207#pragma omp parallel for firstprivate(m) // OK
208  for (i = 0; i < argc; ++i)
209    foo();
210#pragma omp parallel for firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
211  for (i = 0; i < argc; ++i)
212    foo();
213#pragma omp parallel for private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}}
214  for (i = 0; i < argc; ++i)
215    foo();
216#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}}
217  for (i = 0; i < argc; ++i)    // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}}
218    foo();
219#pragma omp parallel shared(xa)
220#pragma omp parallel for firstprivate(xa) // OK: may be firstprivate
221  for (i = 0; i < argc; ++i)
222    foo();
223#pragma omp parallel for firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}}
224  for (i = 0; i < argc; ++i)
225    foo();
226#pragma omp parallel for lastprivate(g) firstprivate(g) // expected-error {{firstprivate variable must have an accessible, unambiguous copy constructor}}
227  for (i = 0; i < argc; ++i)
228    foo();
229#pragma omp parallel for lastprivate(n) firstprivate(n) // OK
230  for (i = 0; i < argc; ++i)
231    foo();
232#pragma omp parallel
233  {
234    int v = 0;
235    int i;
236#pragma omp parallel for firstprivate(i)
237    for (int k = 0; k < argc; ++k) {
238      i = k;
239      v += i;
240    }
241  }
242#pragma omp parallel private(i)
243#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}}
244  for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}}
245    foo();
246#pragma omp parallel reduction(+ : i)
247#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}}
248  for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}}
249    foo();
250
251  return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
252}
253