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