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; // expected-note {{static data member is predetermined as shared}}
19ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  static const float S2sc;
20ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
21ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}}
22ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S2 b;
23ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S2 ba[5];
24ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S3 { // expected-note 2 {{'S3' declared here}}
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;         // expected-note {{global variable is predetermined as shared}}
33ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S3 ca[5];     // expected-note {{global variable is predetermined as shared}}
34ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesextern const int f; // expected-note {{global variable is predetermined as shared}}
35ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S4 {          // expected-note 3 {{'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 {{'S5' declared here}}
44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int a;
45ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S5() : a(0) {}
46ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
47ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
48ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S5(const S5 &s5) : a(s5.a) {}
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  I g(5); // expected-note {{'g' defined here}}
67ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int i;
68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int &j = i;                        // expected-note {{'j' defined here}}
69ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate // expected-error {{expected '(' after 'lastprivate'}}
70ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
71ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
72ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate( // 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 lastprivate() // expected-error {{expected expression}}
76ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
77ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
78ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(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 lastprivate(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 lastprivate(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 lastprivate(argc)
88ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
89ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
90ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(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 lastprivate(a, b) // expected-error {{lastprivate variable with incomplete type 'S1'}}
94ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
95ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
96ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(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 lastprivate(e, g) // expected-error 2 {{lastprivate variable must have an accessible, unambiguous default constructor}}
100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
101ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
102ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}
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 lastprivate(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 lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}}
121ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
122ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
123ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(i)
124ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
125ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
126ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return 0;
127ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
128ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
129ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint main(int argc, char **argv) {
130ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const int d = 5;       // expected-note {{constant variable is predetermined as shared}}
131ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const int da[5] = {0}; // expected-note {{constant variable is predetermined as shared}}
132ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S4 e(4);               // expected-note {{'e' defined here}}
133ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S5 g(5);               // expected-note {{'g' defined here}}
134ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S3 m;                  // expected-note 2 {{'m' defined here}}
135ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S6 n(2);
136ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int i;
137ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int &j = i;                        // expected-note {{'j' defined here}}
138ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate // expected-error {{expected '(' after 'lastprivate'}}
139ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
140ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
141ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
142ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
143ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
144ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate() // expected-error {{expected expression}}
145ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
146ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
147ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
148ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
149ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
150ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
151ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
152ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
153ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
154ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
155ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
156ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(argc)
157ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
158ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
159ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(S1) // expected-error {{'S1' does not refer to a value}}
160ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
161ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
162ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be lastprivate}}
163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(argv[1]) // expected-error {{expected variable name}}
166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(2 * 2) // expected-error {{expected variable name}}
169ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
170ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(ba)
172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(ca) // expected-error {{shared variable cannot be lastprivate}}
175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(da) // expected-error {{shared variable cannot be lastprivate}}
178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int xa;
181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(xa) // OK
182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
184ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}}
185ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
186ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
187ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(S2::S2sc) // expected-error {{shared variable cannot be lastprivate}}
188ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
189ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
190ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp parallel for'}}
191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
192ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
193ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(e, g) // expected-error 2 {{lastprivate variable must have an accessible, unambiguous default constructor}}
194ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
195ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
196ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(m) // expected-error {{lastprivate variable must have an accessible, unambiguous copy assignment operator}}
197ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
198ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
199ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}
200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
202ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(xa), lastprivate(xa) // expected-error {{private variable cannot be lastprivate}} expected-note {{defined as private}}
203ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
204ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
205ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(i)
206ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
207ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
208ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel private(xa)
209ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(xa)
210ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
211ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
212ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel reduction(+ : xa)
213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(xa)
214ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
215ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
216ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}}
217ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
219ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for firstprivate(m) lastprivate(m) // expected-error {{lastprivate variable must have an accessible, unambiguous copy assignment operator}}
220ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
221ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
222ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for lastprivate(n) firstprivate(n) // OK
223ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (i = 0; i < argc; ++i)
224ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    foo();
225ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
226ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
227