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