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