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};
18ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S2 b;
19ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S2 ba[5];
20ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S3 {
21ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int a;
22ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
23ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
24ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S3() : a(0) {}
25ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
26ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconst S3 ca[5];
27ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S4 { // expected-note {{'S4' declared here}}
28ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int a;
29ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S4();
30ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
31ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
32ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S4(int v) : a(v) {}
33ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
34ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesclass S5 { // expected-note {{'S5' declared here}}
35ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int a;
36ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S5() : a(0) {}
37ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
38ef8225444452a1486bd721f3285301fe84643b00Stephen Hinespublic:
39ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S5(int v) : a(v) {}
40ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
41ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
42ef8225444452a1486bd721f3285301fe84643b00Stephen HinesS3 h;
43ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
44ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
45ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <class I, class C>
46ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint foomain(I argc, C **argv) {
47ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  I e(4);
48ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  I g(5);
49ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int i;
50ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int &j = i;           // expected-note {{'j' defined here}}
51ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private // expected-error {{expected '(' after 'private'}}
52ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
53ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
54ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
55ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
56ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
57ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private() // expected-error {{expected expression}}
58ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
59ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
60ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
61ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
62ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
63ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
64ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
65ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
66ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
67ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
68ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
69ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argc)
70ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
71ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
72ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(S1) // expected-error {{'S1' does not refer to a value}}
73ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
74ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
75ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
76ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
77ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
78ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argv[1]) // expected-error {{expected variable name}}
79ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
80ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
81ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(e, g)
82ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
83ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
84ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
85ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
86ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
87ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp parallel for'}}
88ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
89ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
90ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
91ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  {
92ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    int v = 0;
93ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    int i;
94ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(i)
95ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (int k = 0; k < argc; ++k) {
96ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      i = k;
97ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      v += i;
98ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
100ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel shared(i)
101ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel private(i)
102ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}}
103ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
104ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
105ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(i)
106ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
107ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
108ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return 0;
109ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
110ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
111ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint main(int argc, char **argv) {
112ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S4 e(4); // expected-note {{'e' defined here}}
113ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  S5 g(5); // expected-note {{'g' defined here}}
114ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int i;
115ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int &j = i;           // expected-note {{'j' defined here}}
116ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private // expected-error {{expected '(' after 'private'}}
117ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
118ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
119ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
120ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
121ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
122ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private() // expected-error {{expected expression}}
123ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
124ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
125ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
126ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
127ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
128ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
129ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
130ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
131ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
132ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
133ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
134ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argc)
135ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
136ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
137ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(S1) // expected-error {{'S1' does not refer to a value}}
138ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
139ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
140ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
141ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
142ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
143ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(argv[1]) // expected-error {{expected variable name}}
144ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
145ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
146ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(e, g) // expected-error 2 {{private variable must have an accessible, unambiguous default constructor}}
147ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
148ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
149ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
150ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
151ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
152ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for nowait // expected-error {{unexpected OpenMP clause 'nowait' in directive '#pragma omp parallel for'}}
153ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
154ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
155ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel
156ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  {
157ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    int i;
158ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(i)
159ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    for (int k = 0; k < argc; ++k)
160ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      ++k;
161ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
162ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel shared(i)
163ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel private(i)
164ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}}
165ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
166ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
167ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#pragma omp parallel for private(i)
168ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (int k = 0; k < argc; ++k)
169ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ++k;
170ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return 0;
172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
174