1*89a1d03eSRichard // RUN: %check_clang_tidy %s openmp-use-default-none %t -- -- -fopenmp=libomp -fopenmp-version=51
2*89a1d03eSRichard // RUN: %check_clang_tidy -std=c11 %s openmp-use-default-none %t -- -- -x c -fopenmp=libomp -fopenmp-version=51
3*89a1d03eSRichard
4*89a1d03eSRichard //----------------------------------------------------------------------------//
5*89a1d03eSRichard // Null cases.
6*89a1d03eSRichard //----------------------------------------------------------------------------//
7*89a1d03eSRichard
8*89a1d03eSRichard // 'for' directive can not have 'default' clause, no diagnostics.
n0(const int a)9*89a1d03eSRichard void n0(const int a) {
10*89a1d03eSRichard #pragma omp for
11*89a1d03eSRichard for (int b = 0; b < a; b++)
12*89a1d03eSRichard ;
13*89a1d03eSRichard }
14*89a1d03eSRichard
15*89a1d03eSRichard //----------------------------------------------------------------------------//
16*89a1d03eSRichard // Single-directive positive cases.
17*89a1d03eSRichard //----------------------------------------------------------------------------//
18*89a1d03eSRichard
19*89a1d03eSRichard // 'parallel' directive.
20*89a1d03eSRichard
21*89a1d03eSRichard // 'parallel' directive can have 'default' clause, but said clause is not
22*89a1d03eSRichard // specified, diagnosed.
p0_0(void)23*89a1d03eSRichard void p0_0(void) {
24*89a1d03eSRichard #pragma omp parallel
25*89a1d03eSRichard ;
26*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'parallel' does not specify 'default' clause, consider specifying 'default(none)' clause
27*89a1d03eSRichard }
28*89a1d03eSRichard
29*89a1d03eSRichard // 'parallel' directive can have 'default' clause, and said clause specified,
30*89a1d03eSRichard // with 'none' kind, all good.
p0_1(void)31*89a1d03eSRichard void p0_1(void) {
32*89a1d03eSRichard #pragma omp parallel default(none)
33*89a1d03eSRichard ;
34*89a1d03eSRichard }
35*89a1d03eSRichard
36*89a1d03eSRichard // 'parallel' directive can have 'default' clause, and said clause specified,
37*89a1d03eSRichard // but with 'shared' kind, which is not 'none', diagnose.
p0_2(void)38*89a1d03eSRichard void p0_2(void) {
39*89a1d03eSRichard #pragma omp parallel default(shared)
40*89a1d03eSRichard ;
41*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'parallel' specifies 'default(shared)' clause, consider using 'default(none)' clause instead
42*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:22: note: existing 'default' clause specified here
43*89a1d03eSRichard }
44*89a1d03eSRichard
45*89a1d03eSRichard // 'parallel' directive can have 'default' clause, and said clause specified,
46*89a1d03eSRichard // but with 'firstprivate' kind, which is not 'none', diagnose.
p0_3(void)47*89a1d03eSRichard void p0_3(void) {
48*89a1d03eSRichard #pragma omp parallel default(firstprivate)
49*89a1d03eSRichard ;
50*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'parallel' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
51*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:22: note: existing 'default' clause specified here
52*89a1d03eSRichard }
53*89a1d03eSRichard
54*89a1d03eSRichard // 'task' directive.
55*89a1d03eSRichard
56*89a1d03eSRichard // 'task' directive can have 'default' clause, but said clause is not
57*89a1d03eSRichard // specified, diagnosed.
p1_0(void)58*89a1d03eSRichard void p1_0(void) {
59*89a1d03eSRichard #pragma omp task
60*89a1d03eSRichard ;
61*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'task' does not specify 'default' clause, consider specifying 'default(none)' clause
62*89a1d03eSRichard }
63*89a1d03eSRichard
64*89a1d03eSRichard // 'task' directive can have 'default' clause, and said clause specified,
65*89a1d03eSRichard // with 'none' kind, all good.
p1_1(void)66*89a1d03eSRichard void p1_1(void) {
67*89a1d03eSRichard #pragma omp task default(none)
68*89a1d03eSRichard ;
69*89a1d03eSRichard }
70*89a1d03eSRichard
71*89a1d03eSRichard // 'task' directive can have 'default' clause, and said clause specified,
72*89a1d03eSRichard // but with 'shared' kind, which is not 'none', diagnose.
p1_2(void)73*89a1d03eSRichard void p1_2(void) {
74*89a1d03eSRichard #pragma omp task default(shared)
75*89a1d03eSRichard ;
76*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'task' specifies 'default(shared)' clause, consider using 'default(none)' clause instead
77*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:18: note: existing 'default' clause specified here
78*89a1d03eSRichard }
79*89a1d03eSRichard
80*89a1d03eSRichard // 'task' directive can have 'default' clause, and said clause specified,
81*89a1d03eSRichard // but with 'firstprivate' kind, which is not 'none', diagnose.
p1_3(void)82*89a1d03eSRichard void p1_3(void) {
83*89a1d03eSRichard #pragma omp task default(firstprivate)
84*89a1d03eSRichard ;
85*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'task' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
86*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:18: note: existing 'default' clause specified here
87*89a1d03eSRichard }
88*89a1d03eSRichard
89*89a1d03eSRichard // 'teams' directive. (has to be inside of 'target' directive)
90*89a1d03eSRichard
91*89a1d03eSRichard // 'teams' directive can have 'default' clause, but said clause is not
92*89a1d03eSRichard // specified, diagnosed.
p2_0(void)93*89a1d03eSRichard void p2_0(void) {
94*89a1d03eSRichard #pragma omp target
95*89a1d03eSRichard #pragma omp teams
96*89a1d03eSRichard ;
97*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'teams' does not specify 'default' clause, consider specifying 'default(none)' clause
98*89a1d03eSRichard }
99*89a1d03eSRichard
100*89a1d03eSRichard // 'teams' directive can have 'default' clause, and said clause specified,
101*89a1d03eSRichard // with 'none' kind, all good.
p2_1(void)102*89a1d03eSRichard void p2_1(void) {
103*89a1d03eSRichard #pragma omp target
104*89a1d03eSRichard #pragma omp teams default(none)
105*89a1d03eSRichard ;
106*89a1d03eSRichard }
107*89a1d03eSRichard
108*89a1d03eSRichard // 'teams' directive can have 'default' clause, and said clause specified,
109*89a1d03eSRichard // but with 'shared' kind, which is not 'none', diagnose.
p2_2(void)110*89a1d03eSRichard void p2_2(void) {
111*89a1d03eSRichard #pragma omp target
112*89a1d03eSRichard #pragma omp teams default(shared)
113*89a1d03eSRichard ;
114*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'teams' specifies 'default(shared)' clause, consider using 'default(none)' clause instead
115*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:19: note: existing 'default' clause specified here
116*89a1d03eSRichard }
117*89a1d03eSRichard
118*89a1d03eSRichard // 'teams' directive can have 'default' clause, and said clause specified,
119*89a1d03eSRichard // but with 'firstprivate' kind, which is not 'none', diagnose.
p2_3(void)120*89a1d03eSRichard void p2_3(void) {
121*89a1d03eSRichard #pragma omp target
122*89a1d03eSRichard #pragma omp teams default(firstprivate)
123*89a1d03eSRichard ;
124*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-2]]:1: warning: OpenMP directive 'teams' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
125*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:19: note: existing 'default' clause specified here
126*89a1d03eSRichard }
127*89a1d03eSRichard
128*89a1d03eSRichard // 'taskloop' directive.
129*89a1d03eSRichard
130*89a1d03eSRichard // 'taskloop' directive can have 'default' clause, but said clause is not
131*89a1d03eSRichard // specified, diagnosed.
p3_0(const int a)132*89a1d03eSRichard void p3_0(const int a) {
133*89a1d03eSRichard #pragma omp taskloop
134*89a1d03eSRichard for (int b = 0; b < a; b++)
135*89a1d03eSRichard ;
136*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'taskloop' does not specify 'default' clause, consider specifying 'default(none)' clause
137*89a1d03eSRichard }
138*89a1d03eSRichard
139*89a1d03eSRichard // 'taskloop' directive can have 'default' clause, and said clause specified,
140*89a1d03eSRichard // with 'none' kind, all good.
p3_1(const int a)141*89a1d03eSRichard void p3_1(const int a) {
142*89a1d03eSRichard #pragma omp taskloop default(none) shared(a)
143*89a1d03eSRichard for (int b = 0; b < a; b++)
144*89a1d03eSRichard ;
145*89a1d03eSRichard }
146*89a1d03eSRichard
147*89a1d03eSRichard // 'taskloop' directive can have 'default' clause, and said clause specified,
148*89a1d03eSRichard // but with 'shared' kind, which is not 'none', diagnose.
p3_2(const int a)149*89a1d03eSRichard void p3_2(const int a) {
150*89a1d03eSRichard #pragma omp taskloop default(shared)
151*89a1d03eSRichard for (int b = 0; b < a; b++)
152*89a1d03eSRichard ;
153*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'taskloop' specifies 'default(shared)' clause, consider using 'default(none)' clause instead
154*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-4]]:22: note: existing 'default' clause specified here
155*89a1d03eSRichard }
156*89a1d03eSRichard
157*89a1d03eSRichard // 'taskloop' directive can have 'default' clause, and said clause specified,
158*89a1d03eSRichard // but with 'firstprivate' kind, which is not 'none', diagnose.
p3_3(const int a)159*89a1d03eSRichard void p3_3(const int a) {
160*89a1d03eSRichard #pragma omp taskloop default(firstprivate)
161*89a1d03eSRichard for (int b = 0; b < a; b++)
162*89a1d03eSRichard ;
163*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'taskloop' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
164*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-4]]:22: note: existing 'default' clause specified here
165*89a1d03eSRichard }
166*89a1d03eSRichard
167*89a1d03eSRichard //----------------------------------------------------------------------------//
168*89a1d03eSRichard // Combined directives.
169*89a1d03eSRichard // Let's not test every single possible permutation/combination of directives,
170*89a1d03eSRichard // but just *one* combined directive. The rest will be the same.
171*89a1d03eSRichard //----------------------------------------------------------------------------//
172*89a1d03eSRichard
173*89a1d03eSRichard // 'parallel' directive can have 'default' clause, but said clause is not
174*89a1d03eSRichard // specified, diagnosed.
p4_0(const int a)175*89a1d03eSRichard void p4_0(const int a) {
176*89a1d03eSRichard #pragma omp parallel for
177*89a1d03eSRichard for (int b = 0; b < a; b++)
178*89a1d03eSRichard ;
179*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'parallel for' does not specify 'default' clause, consider specifying 'default(none)' clause
180*89a1d03eSRichard }
181*89a1d03eSRichard
182*89a1d03eSRichard // 'parallel' directive can have 'default' clause, and said clause specified,
183*89a1d03eSRichard // with 'none' kind, all good.
p4_1(const int a)184*89a1d03eSRichard void p4_1(const int a) {
185*89a1d03eSRichard #pragma omp parallel for default(none) shared(a)
186*89a1d03eSRichard for (int b = 0; b < a; b++)
187*89a1d03eSRichard ;
188*89a1d03eSRichard }
189*89a1d03eSRichard
190*89a1d03eSRichard // 'parallel' directive can have 'default' clause, and said clause specified,
191*89a1d03eSRichard // but with 'shared' kind, which is not 'none', diagnose.
p4_2(const int a)192*89a1d03eSRichard void p4_2(const int a) {
193*89a1d03eSRichard #pragma omp parallel for default(shared)
194*89a1d03eSRichard for (int b = 0; b < a; b++)
195*89a1d03eSRichard ;
196*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'parallel for' specifies 'default(shared)' clause, consider using 'default(none)' clause instead
197*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-4]]:26: note: existing 'default' clause specified here
198*89a1d03eSRichard }
199*89a1d03eSRichard
200*89a1d03eSRichard // 'parallel' directive can have 'default' clause, and said clause specified,
201*89a1d03eSRichard // but with 'firstprivate' kind, which is not 'none', diagnose.
p4_3(const int a)202*89a1d03eSRichard void p4_3(const int a) {
203*89a1d03eSRichard #pragma omp parallel for default(firstprivate)
204*89a1d03eSRichard for (int b = 0; b < a; b++)
205*89a1d03eSRichard ;
206*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-3]]:1: warning: OpenMP directive 'parallel for' specifies 'default(firstprivate)' clause, consider using 'default(none)' clause instead
207*89a1d03eSRichard // CHECK-NOTES: :[[@LINE-4]]:26: note: existing 'default' clause specified here
208*89a1d03eSRichard }
209