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