1 // RUN: %clang_cc1 -verify -fopenmp %s
2
foo()3 void foo() {
4 }
5
foobool(int argc)6 bool foobool(int argc) {
7 return argc;
8 }
9
10 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
11 extern S1 a;
12 class S2 {
13 mutable int a;
14
15 public:
S2()16 S2() : a(0) {}
17 };
18 const S2 b;
19 const S2 ba[5];
20 class S3 {
21 int a;
22
23 public:
S3()24 S3() : a(0) {}
25 };
26 const S3 ca[5];
27 class S4 {
28 int a;
29 S4(); // expected-note {{implicitly declared private here}}
30
31 public:
S4(int v)32 S4(int v) : a(v) {}
33 };
34 class S5 {
35 int a;
S5()36 S5() : a(0) {} // expected-note {{implicitly declared private here}}
37
38 public:
S5(int v)39 S5(int v) : a(v) {}
40 };
41
42 S3 h;
43 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
44
45 template <class I, class C>
foomain(I argc,C ** argv)46 int foomain(I argc, C **argv) {
47 I e(4);
48 I g(5);
49 int i;
50 int &j = i;
51 #pragma omp for private // expected-error {{expected '(' after 'private'}}
52 for (int k = 0; k < argc; ++k)
53 ++k;
54 #pragma omp for private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
55 for (int k = 0; k < argc; ++k)
56 ++k;
57 #pragma omp for private() // expected-error {{expected expression}}
58 for (int k = 0; k < argc; ++k)
59 ++k;
60 #pragma omp for private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
61 for (int k = 0; k < argc; ++k)
62 ++k;
63 #pragma omp for private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
64 for (int k = 0; k < argc; ++k)
65 ++k;
66 #pragma omp for private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
67 for (int k = 0; k < argc; ++k)
68 ++k;
69 #pragma omp for private(argc)
70 for (int k = 0; k < argc; ++k)
71 ++k;
72 #pragma omp for private(S1) // expected-error {{'S1' does not refer to a value}}
73 for (int k = 0; k < argc; ++k)
74 ++k;
75 #pragma omp for private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
76 for (int k = 0; k < argc; ++k)
77 ++k;
78 #pragma omp for private(argv[1]) // expected-error {{expected variable name}}
79 for (int k = 0; k < argc; ++k)
80 ++k;
81 #pragma omp for private(e, g)
82 for (int k = 0; k < argc; ++k)
83 ++k;
84 #pragma omp for private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
85 for (int k = 0; k < argc; ++k)
86 ++k;
87 #pragma omp for shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp for'}}
88 for (int k = 0; k < argc; ++k)
89 ++k;
90 #pragma omp parallel
91 {
92 int v = 0;
93 int i;
94 #pragma omp for private(i)
95 for (int k = 0; k < argc; ++k) {
96 i = k;
97 v += i;
98 }
99 }
100 #pragma omp parallel shared(i)
101 #pragma omp parallel private(i)
102 #pragma omp for private(j)
103 for (int k = 0; k < argc; ++k)
104 ++k;
105 #pragma omp for private(i)
106 for (int k = 0; k < argc; ++k)
107 ++k;
108 return 0;
109 }
110
bar(S4 a[2])111 void bar(S4 a[2]) {
112 #pragma omp parallel
113 #pragma omp for private(a)
114 for (int i = 0; i < 2; ++i)
115 foo();
116 }
117
118 namespace A {
119 double x;
120 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
121 }
122 namespace B {
123 using A::x;
124 }
125
main(int argc,char ** argv)126 int main(int argc, char **argv) {
127 S4 e(4);
128 S5 g(5);
129 int i;
130 int &j = i;
131 #pragma omp for private // expected-error {{expected '(' after 'private'}}
132 for (int k = 0; k < argc; ++k)
133 ++k;
134 #pragma omp for private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
135 for (int k = 0; k < argc; ++k)
136 ++k;
137 #pragma omp for private() // expected-error {{expected expression}}
138 for (int k = 0; k < argc; ++k)
139 ++k;
140 #pragma omp for private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
141 for (int k = 0; k < argc; ++k)
142 ++k;
143 #pragma omp for private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
144 for (int k = 0; k < argc; ++k)
145 ++k;
146 #pragma omp for private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
147 for (int k = 0; k < argc; ++k)
148 ++k;
149 #pragma omp for private(argc)
150 for (int k = 0; k < argc; ++k)
151 ++k;
152 #pragma omp for private(S1) // expected-error {{'S1' does not refer to a value}}
153 for (int k = 0; k < argc; ++k)
154 ++k;
155 #pragma omp for private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
156 for (int k = 0; k < argc; ++k)
157 ++k;
158 #pragma omp for private(argv[1]) // expected-error {{expected variable name}}
159 for (int k = 0; k < argc; ++k)
160 ++k;
161 #pragma omp for private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
162 for (int k = 0; k < argc; ++k)
163 ++k;
164 #pragma omp for private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
165 for (int k = 0; k < argc; ++k)
166 ++k;
167 #pragma omp for private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
168 for (int k = 0; k < argc; ++k)
169 ++k;
170 #pragma omp for shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp for'}}
171 for (int k = 0; k < argc; ++k)
172 ++k;
173 #pragma omp parallel
174 {
175 int i;
176 #pragma omp for private(i)
177 for (int k = 0; k < argc; ++k)
178 ++k;
179 }
180 #pragma omp parallel shared(i)
181 #pragma omp parallel private(i)
182 #pragma omp for private(j)
183 for (int k = 0; k < argc; ++k)
184 ++k;
185 #pragma omp for private(i)
186 for (int k = 0; k < argc; ++k)
187 ++k;
188 static int si;
189 #pragma omp for private(si) // OK
190 for(int k = 0; k < argc; ++k)
191 si = k + 1;
192
193 return 0;
194 }
195
196