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