xref: /aosp_15_r20/external/clang/test/OpenMP/single_copyprivate_messages.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp %s
2*67e74705SXin Li 
foo()3*67e74705SXin Li void foo() {
4*67e74705SXin Li }
5*67e74705SXin Li 
6*67e74705SXin Li struct S1; // expected-note 2 {{declared here}}
7*67e74705SXin Li class S2 {
8*67e74705SXin Li   mutable int a;
9*67e74705SXin Li 
10*67e74705SXin Li public:
S2()11*67e74705SXin Li   S2() : a(0) {}
operator =(S2 & s2)12*67e74705SXin Li   S2 &operator=(S2 &s2) { return *this; }
13*67e74705SXin Li };
14*67e74705SXin Li class S3 {
15*67e74705SXin Li   int a;
16*67e74705SXin Li 
17*67e74705SXin Li public:
S3()18*67e74705SXin Li   S3() : a(0) {}
operator =(S3 & s3)19*67e74705SXin Li   S3 &operator=(S3 &s3) { return *this; }
20*67e74705SXin Li };
21*67e74705SXin Li class S4 {
22*67e74705SXin Li   int a;
23*67e74705SXin Li   S4();
24*67e74705SXin Li   S4 &operator=(const S4 &s4); // expected-note 3 {{implicitly declared private here}}
25*67e74705SXin Li 
26*67e74705SXin Li public:
S4(int v)27*67e74705SXin Li   S4(int v) : a(v) {}
28*67e74705SXin Li };
29*67e74705SXin Li class S5 {
30*67e74705SXin Li   int a;
S5()31*67e74705SXin Li   S5() : a(0) {}
operator =(const S5 & s5)32*67e74705SXin Li   S5 &operator=(const S5 &s5) { return *this; } // expected-note 3 {{implicitly declared private here}}
33*67e74705SXin Li 
34*67e74705SXin Li public:
S5(int v)35*67e74705SXin Li   S5(int v) : a(v) {}
36*67e74705SXin Li };
37*67e74705SXin Li 
38*67e74705SXin Li S2 k;
39*67e74705SXin Li S3 h;
40*67e74705SXin Li S4 l(3);
41*67e74705SXin Li S5 m(4);
42*67e74705SXin Li #pragma omp threadprivate(h, k, l, m)
43*67e74705SXin Li 
44*67e74705SXin Li template <class T, class C>
tmain(T argc,C ** argv)45*67e74705SXin Li T tmain(T argc, C **argv) {
46*67e74705SXin Li   T i;
47*67e74705SXin Li   static T TA;
48*67e74705SXin Li #pragma omp parallel
49*67e74705SXin Li #pragma omp single copyprivate // expected-error {{expected '(' after 'copyprivate'}}
50*67e74705SXin Li #pragma omp parallel
51*67e74705SXin Li #pragma omp single copyprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
52*67e74705SXin Li #pragma omp parallel
53*67e74705SXin Li #pragma omp single copyprivate() // expected-error {{expected expression}}
54*67e74705SXin Li #pragma omp parallel
55*67e74705SXin Li #pragma omp single copyprivate(k // expected-error {{expected ')'}} expected-note {{to match this '('}}
56*67e74705SXin Li #pragma omp parallel
57*67e74705SXin Li #pragma omp single copyprivate(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
58*67e74705SXin Li #pragma omp parallel
59*67e74705SXin Li #pragma omp single copyprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
60*67e74705SXin Li #pragma omp parallel
61*67e74705SXin Li #pragma omp single copyprivate(l) // expected-error 2 {{'operator=' is a private member of 'S4'}}
62*67e74705SXin Li #pragma omp parallel
63*67e74705SXin Li #pragma omp single copyprivate(S1) // expected-error {{'S1' does not refer to a value}}
64*67e74705SXin Li #pragma omp parallel
65*67e74705SXin Li #pragma omp single copyprivate(argv[1]) // expected-error {{expected variable name}}
66*67e74705SXin Li #pragma omp parallel // expected-note {{implicitly determined as shared}}
67*67e74705SXin Li #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}}
68*67e74705SXin Li #pragma omp parallel
69*67e74705SXin Li #pragma omp single copyprivate(m) // expected-error 2 {{'operator=' is a private member of 'S5'}}
70*67e74705SXin Li   foo();
71*67e74705SXin Li #pragma omp parallel private(i)
72*67e74705SXin Li   {
73*67e74705SXin Li #pragma omp single copyprivate(i)
74*67e74705SXin Li     foo();
75*67e74705SXin Li   }
76*67e74705SXin Li #pragma omp parallel shared(i) // expected-note {{defined as shared}}
77*67e74705SXin Li   {
78*67e74705SXin Li #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}}
79*67e74705SXin Li     foo();
80*67e74705SXin Li   }
81*67e74705SXin Li #pragma omp parallel private(i)
82*67e74705SXin Li #pragma omp parallel default(shared) // expected-note {{implicitly determined as shared}}
83*67e74705SXin Li   {
84*67e74705SXin Li #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}}
85*67e74705SXin Li     foo();
86*67e74705SXin Li   }
87*67e74705SXin Li #pragma omp parallel private(i)
88*67e74705SXin Li #pragma omp parallel // expected-note {{implicitly determined as shared}}
89*67e74705SXin Li   {
90*67e74705SXin Li #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}}
91*67e74705SXin Li     foo();
92*67e74705SXin Li   }
93*67e74705SXin Li #pragma omp parallel
94*67e74705SXin Li #pragma omp single private(i) copyprivate(i) // expected-error {{private variable cannot be copyprivate}} expected-note {{defined as private}}
95*67e74705SXin Li   foo();
96*67e74705SXin Li #pragma omp parallel
97*67e74705SXin Li #pragma omp single firstprivate(i) copyprivate(i) // expected-error {{firstprivate variable cannot be copyprivate}} expected-note {{defined as firstprivate}}
98*67e74705SXin Li   foo();
99*67e74705SXin Li #pragma omp parallel private(TA)
100*67e74705SXin Li   {
101*67e74705SXin Li #pragma omp single copyprivate(TA)
102*67e74705SXin Li     TA = 99;
103*67e74705SXin Li   }
104*67e74705SXin Li 
105*67e74705SXin Li   return T();
106*67e74705SXin Li }
107*67e74705SXin Li 
bar(S4 a[2],int n,int b[n])108*67e74705SXin Li void bar(S4 a[2], int n, int b[n]) {
109*67e74705SXin Li #pragma omp single copyprivate(a, b)
110*67e74705SXin Li     foo();
111*67e74705SXin Li }
112*67e74705SXin Li 
113*67e74705SXin Li namespace A {
114*67e74705SXin Li double x;
115*67e74705SXin Li #pragma omp threadprivate(x)
116*67e74705SXin Li }
117*67e74705SXin Li namespace B {
118*67e74705SXin Li using A::x;
119*67e74705SXin Li }
120*67e74705SXin Li 
main(int argc,char ** argv)121*67e74705SXin Li int main(int argc, char **argv) {
122*67e74705SXin Li   int i;
123*67e74705SXin Li   static int intA;
124*67e74705SXin Li #pragma omp parallel
125*67e74705SXin Li #pragma omp single copyprivate // expected-error {{expected '(' after 'copyprivate'}}
126*67e74705SXin Li #pragma omp parallel
127*67e74705SXin Li #pragma omp single copyprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
128*67e74705SXin Li #pragma omp parallel
129*67e74705SXin Li #pragma omp single copyprivate() // expected-error {{expected expression}}
130*67e74705SXin Li #pragma omp parallel
131*67e74705SXin Li #pragma omp single copyprivate(k // expected-error {{expected ')'}} expected-note {{to match this '('}}
132*67e74705SXin Li #pragma omp parallel
133*67e74705SXin Li #pragma omp single copyprivate(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
134*67e74705SXin Li #pragma omp parallel
135*67e74705SXin Li #pragma omp single copyprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
136*67e74705SXin Li #pragma omp parallel
137*67e74705SXin Li #pragma omp single copyprivate(l, B::x) // expected-error {{'operator=' is a private member of 'S4'}}
138*67e74705SXin Li #pragma omp parallel
139*67e74705SXin Li #pragma omp single copyprivate(S1) // expected-error {{'S1' does not refer to a value}}
140*67e74705SXin Li #pragma omp parallel
141*67e74705SXin Li #pragma omp single copyprivate(argv[1]) // expected-error {{expected variable name}}
142*67e74705SXin Li #pragma omp parallel // expected-note {{implicitly determined as shared}}
143*67e74705SXin Li #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}}
144*67e74705SXin Li #pragma omp parallel
145*67e74705SXin Li #pragma omp single copyprivate(m) // expected-error {{'operator=' is a private member of 'S5'}}
146*67e74705SXin Li   foo();
147*67e74705SXin Li #pragma omp parallel private(i)
148*67e74705SXin Li   {
149*67e74705SXin Li #pragma omp single copyprivate(i)
150*67e74705SXin Li     foo();
151*67e74705SXin Li   }
152*67e74705SXin Li #pragma omp parallel shared(i) // expected-note {{defined as shared}}
153*67e74705SXin Li   {
154*67e74705SXin Li #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}}
155*67e74705SXin Li     foo();
156*67e74705SXin Li   }
157*67e74705SXin Li #pragma omp parallel private(i)
158*67e74705SXin Li #pragma omp parallel default(shared) // expected-note {{implicitly determined as shared}}
159*67e74705SXin Li   {
160*67e74705SXin Li #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}}
161*67e74705SXin Li     foo();
162*67e74705SXin Li   }
163*67e74705SXin Li #pragma omp parallel private(i)
164*67e74705SXin Li #pragma omp parallel // expected-note {{implicitly determined as shared}}
165*67e74705SXin Li   {
166*67e74705SXin Li #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}}
167*67e74705SXin Li     foo();
168*67e74705SXin Li   }
169*67e74705SXin Li #pragma omp parallel
170*67e74705SXin Li #pragma omp single private(i) copyprivate(i) // expected-error {{private variable cannot be copyprivate}} expected-note {{defined as private}}
171*67e74705SXin Li   foo();
172*67e74705SXin Li #pragma omp parallel
173*67e74705SXin Li #pragma omp single firstprivate(i) copyprivate(i) // expected-error {{firstprivate variable cannot be copyprivate}} expected-note {{defined as firstprivate}}
174*67e74705SXin Li   foo();
175*67e74705SXin Li #pragma omp single copyprivate(i) nowait // expected-error {{the 'copyprivate' clause must not be used with the 'nowait' clause}} expected-note {{'nowait' clause is here}}
176*67e74705SXin Li   foo();
177*67e74705SXin Li #pragma omp parallel private(intA)
178*67e74705SXin Li   {
179*67e74705SXin Li #pragma omp single copyprivate(intA)
180*67e74705SXin Li     intA = 99;
181*67e74705SXin Li   }
182*67e74705SXin Li 
183*67e74705SXin Li   return tmain(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain<int, char>' requested here}}
184*67e74705SXin Li }
185*67e74705SXin Li 
186*67e74705SXin Li extern void abort(void);
187*67e74705SXin Li 
188*67e74705SXin Li void
single(int a,int b)189*67e74705SXin Li single(int a, int b) {
190*67e74705SXin Li #pragma omp single copyprivate(a) copyprivate(b)
191*67e74705SXin Li   {
192*67e74705SXin Li     a = b = 5;
193*67e74705SXin Li   }
194*67e74705SXin Li 
195*67e74705SXin Li   if (a != b)
196*67e74705SXin Li     abort();
197*67e74705SXin Li }
198*67e74705SXin Li 
parallel()199*67e74705SXin Li int parallel() {
200*67e74705SXin Li #pragma omp parallel
201*67e74705SXin Li   single(1, 2);
202*67e74705SXin Li 
203*67e74705SXin Li   return 0;
204*67e74705SXin Li }
205