xref: /aosp_15_r20/external/clang/test/OpenMP/task_messages.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s
2*67e74705SXin Li 
foo()3*67e74705SXin Li void foo() {
4*67e74705SXin Li }
5*67e74705SXin Li 
6*67e74705SXin Li #pragma omp task // expected-error {{unexpected OpenMP directive '#pragma omp task'}}
7*67e74705SXin Li 
8*67e74705SXin Li class S {
S(const S & s)9*67e74705SXin Li   S(const S &s) { a = s.a + 12; } // expected-note 10 {{implicitly declared private here}}
10*67e74705SXin Li   int a;
11*67e74705SXin Li 
12*67e74705SXin Li public:
S()13*67e74705SXin Li   S() : a(0) {}
S(int a)14*67e74705SXin Li   S(int a) : a(a) {}
operator int()15*67e74705SXin Li   operator int() { return a; }
operator ++()16*67e74705SXin Li   S &operator++() { return *this; }
operator +(const S &)17*67e74705SXin Li   S operator+(const S &) { return *this; }
18*67e74705SXin Li };
19*67e74705SXin Li 
20*67e74705SXin Li class S1 {
21*67e74705SXin Li   int a;
22*67e74705SXin Li 
23*67e74705SXin Li public:
S1()24*67e74705SXin Li   S1() : a(0) {}
operator ++()25*67e74705SXin Li   S1 &operator++() { return *this; }
26*67e74705SXin Li   S1(const S1 &) = delete; // expected-note 2 {{'S1' has been explicitly marked deleted here}}
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li template <class T>
foo()30*67e74705SXin Li int foo() {
31*67e74705SXin Li   T a;
32*67e74705SXin Li   T &b = a;
33*67e74705SXin Li   int r;
34*67e74705SXin Li   S1 s1;
35*67e74705SXin Li // expected-error@+1 2 {{call to deleted constructor of 'S1'}}
36*67e74705SXin Li #pragma omp task
37*67e74705SXin Li // expected-note@+1 2 {{predetermined as a firstprivate in a task construct here}}
38*67e74705SXin Li   ++s1;
39*67e74705SXin Li #pragma omp task default(none)
40*67e74705SXin Li #pragma omp task default(shared)
41*67e74705SXin Li   ++a;
42*67e74705SXin Li #pragma omp task default(none)
43*67e74705SXin Li #pragma omp task
44*67e74705SXin Li   // expected-error@+1 {{calling a private constructor of class 'S'}}
45*67e74705SXin Li   ++a;
46*67e74705SXin Li #pragma omp task
47*67e74705SXin Li #pragma omp task
48*67e74705SXin Li   // expected-error@+1 {{calling a private constructor of class 'S'}}
49*67e74705SXin Li   ++a;
50*67e74705SXin Li #pragma omp task default(shared)
51*67e74705SXin Li #pragma omp task
52*67e74705SXin Li   ++a;
53*67e74705SXin Li #pragma omp task
54*67e74705SXin Li #pragma omp parallel
55*67e74705SXin Li   ++a;
56*67e74705SXin Li // expected-error@+2 {{calling a private constructor of class 'S'}}
57*67e74705SXin Li #pragma omp task
58*67e74705SXin Li   ++b;
59*67e74705SXin Li #pragma omp task
60*67e74705SXin Li // expected-error@+1 2 {{calling a private constructor of class 'S'}}
61*67e74705SXin Li #pragma omp parallel shared(a, b)
62*67e74705SXin Li   ++a, ++b;
63*67e74705SXin Li // expected-note@+1 2 {{defined as reduction}}
64*67e74705SXin Li #pragma omp parallel reduction(+ : r)
65*67e74705SXin Li // expected-error@+1 2 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}}
66*67e74705SXin Li #pragma omp task firstprivate(r)
67*67e74705SXin Li   ++r;
68*67e74705SXin Li // expected-note@+1 2 {{defined as reduction}}
69*67e74705SXin Li #pragma omp parallel reduction(+ : r)
70*67e74705SXin Li #pragma omp task default(shared)
71*67e74705SXin Li   // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
72*67e74705SXin Li   ++r;
73*67e74705SXin Li // expected-note@+1 2 {{defined as reduction}}
74*67e74705SXin Li #pragma omp parallel reduction(+ : r)
75*67e74705SXin Li #pragma omp task
76*67e74705SXin Li   // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
77*67e74705SXin Li   ++r;
78*67e74705SXin Li #pragma omp parallel
79*67e74705SXin Li // expected-note@+1 2 {{defined as reduction}}
80*67e74705SXin Li #pragma omp for reduction(+ : r)
81*67e74705SXin Li   for (int i = 0; i < 10; ++i)
82*67e74705SXin Li // expected-error@+1 2 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}}
83*67e74705SXin Li #pragma omp task firstprivate(r)
84*67e74705SXin Li     ++r;
85*67e74705SXin Li #pragma omp parallel
86*67e74705SXin Li // expected-note@+1 2 {{defined as reduction}}
87*67e74705SXin Li #pragma omp for reduction(+ : r)
88*67e74705SXin Li   for (int i = 0; i < 10; ++i)
89*67e74705SXin Li #pragma omp task default(shared)
90*67e74705SXin Li     // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
91*67e74705SXin Li     ++r;
92*67e74705SXin Li #pragma omp parallel
93*67e74705SXin Li // expected-note@+1 2 {{defined as reduction}}
94*67e74705SXin Li #pragma omp for reduction(+ : r)
95*67e74705SXin Li   for (int i = 0; i < 10; ++i)
96*67e74705SXin Li #pragma omp task
97*67e74705SXin Li     // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
98*67e74705SXin Li     ++r;
99*67e74705SXin Li // expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}}
100*67e74705SXin Li #pragma omp task
101*67e74705SXin Li // expected-error@+2 {{reduction variable must be shared}}
102*67e74705SXin Li // expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
103*67e74705SXin Li #pragma omp for reduction(+ : r)
104*67e74705SXin Li   ++r;
105*67e74705SXin Li // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}}
106*67e74705SXin Li #pragma omp task untied untied
107*67e74705SXin Li   ++r;
108*67e74705SXin Li // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}}
109*67e74705SXin Li #pragma omp task mergeable mergeable
110*67e74705SXin Li   ++r;
111*67e74705SXin Li   return a + b;
112*67e74705SXin Li }
113*67e74705SXin Li 
main(int argc,char ** argv)114*67e74705SXin Li int main(int argc, char **argv) {
115*67e74705SXin Li   int a;
116*67e74705SXin Li   int &b = a;
117*67e74705SXin Li   S sa;
118*67e74705SXin Li   S &sb = sa;
119*67e74705SXin Li   int r;
120*67e74705SXin Li #pragma omp task { // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
121*67e74705SXin Li   foo();
122*67e74705SXin Li #pragma omp task( // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
123*67e74705SXin Li   foo();
124*67e74705SXin Li #pragma omp task[ // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
125*67e74705SXin Li   foo();
126*67e74705SXin Li #pragma omp task] // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
127*67e74705SXin Li   foo();
128*67e74705SXin Li #pragma omp task) // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
129*67e74705SXin Li   foo();
130*67e74705SXin Li #pragma omp task } // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
131*67e74705SXin Li   foo();
132*67e74705SXin Li #pragma omp task
133*67e74705SXin Li // expected-warning@+1 {{extra tokens at the end of '#pragma omp task' are ignored}}
134*67e74705SXin Li #pragma omp task unknown()
135*67e74705SXin Li   foo();
136*67e74705SXin Li L1:
137*67e74705SXin Li   foo();
138*67e74705SXin Li #pragma omp task
139*67e74705SXin Li   ;
140*67e74705SXin Li #pragma omp task
141*67e74705SXin Li   {
142*67e74705SXin Li     goto L1; // expected-error {{use of undeclared label 'L1'}}
143*67e74705SXin Li     argc++;
144*67e74705SXin Li   }
145*67e74705SXin Li 
146*67e74705SXin Li   for (int i = 0; i < 10; ++i) {
147*67e74705SXin Li     switch (argc) {
148*67e74705SXin Li     case (0):
149*67e74705SXin Li #pragma omp task
150*67e74705SXin Li     {
151*67e74705SXin Li       foo();
152*67e74705SXin Li       break;    // expected-error {{'break' statement not in loop or switch statement}}
153*67e74705SXin Li       continue; // expected-error {{'continue' statement not in loop statement}}
154*67e74705SXin Li     }
155*67e74705SXin Li     default:
156*67e74705SXin Li       break;
157*67e74705SXin Li     }
158*67e74705SXin Li   }
159*67e74705SXin Li #pragma omp task default(none)
160*67e74705SXin Li   ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
161*67e74705SXin Li 
162*67e74705SXin Li   goto L2; // expected-error {{use of undeclared label 'L2'}}
163*67e74705SXin Li #pragma omp task
164*67e74705SXin Li L2:
165*67e74705SXin Li   foo();
166*67e74705SXin Li #pragma omp task
167*67e74705SXin Li   {
168*67e74705SXin Li     return 1; // expected-error {{cannot return from OpenMP region}}
169*67e74705SXin Li   }
170*67e74705SXin Li 
171*67e74705SXin Li   [[]] // expected-error {{an attribute list cannot appear here}}
172*67e74705SXin Li #pragma omp task
173*67e74705SXin Li       for (int n = 0; n < 100; ++n) {
174*67e74705SXin Li   }
175*67e74705SXin Li 
176*67e74705SXin Li #pragma omp task default(none)
177*67e74705SXin Li #pragma omp task default(shared)
178*67e74705SXin Li   ++a;
179*67e74705SXin Li #pragma omp task default(none)
180*67e74705SXin Li #pragma omp task
181*67e74705SXin Li   ++a;
182*67e74705SXin Li #pragma omp task default(shared)
183*67e74705SXin Li #pragma omp task
184*67e74705SXin Li   ++a;
185*67e74705SXin Li #pragma omp task
186*67e74705SXin Li #pragma omp parallel
187*67e74705SXin Li   ++a;
188*67e74705SXin Li #pragma omp task
189*67e74705SXin Li   ++b;
190*67e74705SXin Li #pragma omp task
191*67e74705SXin Li #pragma omp parallel shared(a, b)
192*67e74705SXin Li   ++a, ++b;
193*67e74705SXin Li #pragma omp task default(none)
194*67e74705SXin Li #pragma omp task default(shared)
195*67e74705SXin Li   ++sa;
196*67e74705SXin Li #pragma omp task default(none)
197*67e74705SXin Li #pragma omp task
198*67e74705SXin Li   // expected-error@+1 {{calling a private constructor of class 'S'}}
199*67e74705SXin Li   ++sa;
200*67e74705SXin Li #pragma omp task
201*67e74705SXin Li #pragma omp task
202*67e74705SXin Li   // expected-error@+1 {{calling a private constructor of class 'S'}}
203*67e74705SXin Li   ++sa;
204*67e74705SXin Li #pragma omp task default(shared)
205*67e74705SXin Li #pragma omp task
206*67e74705SXin Li   ++sa;
207*67e74705SXin Li #pragma omp task
208*67e74705SXin Li #pragma omp parallel
209*67e74705SXin Li   ++sa;
210*67e74705SXin Li // expected-error@+2 {{calling a private constructor of class 'S'}}
211*67e74705SXin Li #pragma omp task
212*67e74705SXin Li   ++sb;
213*67e74705SXin Li // expected-error@+2 2 {{calling a private constructor of class 'S'}}
214*67e74705SXin Li #pragma omp task
215*67e74705SXin Li #pragma omp parallel shared(sa, sb)
216*67e74705SXin Li   ++sa, ++sb;
217*67e74705SXin Li // expected-note@+1 2 {{defined as reduction}}
218*67e74705SXin Li #pragma omp parallel reduction(+ : r)
219*67e74705SXin Li // expected-error@+1 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}}
220*67e74705SXin Li #pragma omp task firstprivate(r)
221*67e74705SXin Li   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
222*67e74705SXin Li   ++r;
223*67e74705SXin Li // expected-note@+1 {{defined as reduction}}
224*67e74705SXin Li #pragma omp parallel reduction(+ : r)
225*67e74705SXin Li #pragma omp task default(shared)
226*67e74705SXin Li   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
227*67e74705SXin Li   ++r;
228*67e74705SXin Li // expected-note@+1 {{defined as reduction}}
229*67e74705SXin Li #pragma omp parallel reduction(+ : r)
230*67e74705SXin Li #pragma omp task
231*67e74705SXin Li   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
232*67e74705SXin Li   ++r;
233*67e74705SXin Li #pragma omp parallel
234*67e74705SXin Li // expected-note@+1 2 {{defined as reduction}}
235*67e74705SXin Li #pragma omp for reduction(+ : r)
236*67e74705SXin Li   for (int i = 0; i < 10; ++i)
237*67e74705SXin Li // expected-error@+1 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}}
238*67e74705SXin Li #pragma omp task firstprivate(r)
239*67e74705SXin Li     // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
240*67e74705SXin Li     ++r;
241*67e74705SXin Li #pragma omp parallel
242*67e74705SXin Li // expected-note@+1 {{defined as reduction}}
243*67e74705SXin Li #pragma omp for reduction(+ : r)
244*67e74705SXin Li   for (int i = 0; i < 10; ++i)
245*67e74705SXin Li #pragma omp task default(shared)
246*67e74705SXin Li     // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
247*67e74705SXin Li     ++r;
248*67e74705SXin Li #pragma omp parallel
249*67e74705SXin Li // expected-note@+1 {{defined as reduction}}
250*67e74705SXin Li #pragma omp for reduction(+ : r)
251*67e74705SXin Li   for (int i = 0; i < 10; ++i)
252*67e74705SXin Li #pragma omp task
253*67e74705SXin Li     // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
254*67e74705SXin Li     ++r;
255*67e74705SXin Li // expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}}
256*67e74705SXin Li #pragma omp task
257*67e74705SXin Li // expected-error@+2 {{reduction variable must be shared}}
258*67e74705SXin Li // expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
259*67e74705SXin Li #pragma omp for reduction(+ : r)
260*67e74705SXin Li   ++r;
261*67e74705SXin Li // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}}
262*67e74705SXin Li #pragma omp task untied untied
263*67e74705SXin Li   ++r;
264*67e74705SXin Li // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}}
265*67e74705SXin Li #pragma omp task mergeable mergeable
266*67e74705SXin Li   ++r;
267*67e74705SXin Li   // expected-note@+2 {{in instantiation of function template specialization 'foo<int>' requested here}}
268*67e74705SXin Li   // expected-note@+1 {{in instantiation of function template specialization 'foo<S>' requested here}}
269*67e74705SXin Li   return foo<int>() + foo<S>();
270*67e74705SXin Li }
271*67e74705SXin Li 
272