1 #define __cond_lock(c) ((c) ? ({ __context__(1); 1; }) : 0)
2
3 static void a(void) __attribute__((context(0,1)))
4 {
5 __context__(1);
6 }
7
8 static void r(void) __attribute__((context(1,0)))
9 {
10 __context__(-1);
11 }
12
13 extern int _ca(int fail);
14 #define ca(fail) __cond_lock(_ca(fail))
15
16 static void good_paired1(void)
17 {
18 a();
19 r();
20 }
21
22 static void good_paired2(void)
23 {
24 a();
25 r();
26 a();
27 r();
28 }
29
30 static void good_paired3(void)
31 {
32 a();
33 a();
34 r();
35 r();
36 }
37
38 static void good_lock1(void) __attribute__((context(0,1)))
39 {
40 a();
41 }
42
43 static void good_lock2(void) __attribute__((context(0,1)))
44 {
45 a();
46 r();
47 a();
48 }
49
50 static void good_lock3(void) __attribute__((context(0,1)))
51 {
52 a();
53 a();
54 r();
55 }
56
57 static void good_unlock1(void) __attribute__((context(1,0)))
58 {
59 r();
60 }
61
62 static void good_unlock2(void) __attribute__((context(1,0)))
63 {
64 a();
65 r();
66 r();
67 }
68
69 static void warn_lock1(void)
70 {
71 a();
72 }
73
74 static void warn_lock2(void)
75 {
76 a();
77 r();
78 a();
79 }
80
81 static void warn_lock3(void)
82 {
83 a();
84 a();
85 r();
86 }
87
88 static void warn_unlock1(void)
89 {
90 r();
91 }
92
93 static void warn_unlock2(void)
94 {
95 a();
96 r();
97 r();
98 }
99
100 extern int condition, condition2;
101
102 static int good_if1(void)
103 {
104 a();
105 if(condition) {
106 r();
107 return -1;
108 }
109 r();
110 return 0;
111 }
112
113 static void good_if2(void)
114 {
115 if(condition) {
116 a();
117 r();
118 }
119 }
120
121 static void good_if3(void)
122 {
123 a();
124 if(condition) {
125 a();
126 r();
127 }
128 r();
129 }
130
131 static int warn_if1(void)
132 {
133 a();
134 if(condition)
135 return -1;
136 r();
137 return 0;
138 }
139
140 static int warn_if2(void)
141 {
142 a();
143 if(condition) {
144 r();
145 return -1;
146 }
147 return 0;
148 }
149
150 static void good_while1(void)
151 {
152 a();
153 while(condition)
154 ;
155 r();
156 }
157
158 static void good_while2(void)
159 {
160 while(condition) {
161 a();
162 r();
163 }
164 }
165
166 static void good_while3(void)
167 {
168 while(condition) {
169 a();
170 r();
171 if(condition2)
172 break;
173 a();
174 r();
175 }
176 }
177
178 static void good_while4(void)
179 {
180 a();
181 while(1) {
182 if(condition2) {
183 r();
184 break;
185 }
186 }
187 }
188
189 static void good_while5(void)
190 {
191 a();
192 while(1) {
193 r();
194 if(condition2)
195 break;
196 a();
197 }
198 }
199
200 static void warn_while1(void)
201 {
202 while(condition) {
203 a();
204 }
205 }
206
207 static void warn_while2(void)
208 {
209 while(condition) {
210 r();
211 }
212 }
213
214 static void warn_while3(void)
215 {
216 while(condition) {
217 a();
218 if(condition2)
219 break;
220 r();
221 }
222 }
223
224 static void good_goto1(void)
225 {
226 a();
227 goto label;
228 label:
229 r();
230 }
231
232 static void good_goto2(void)
233 {
234 a();
235 goto label;
236 a();
237 r();
238 label:
239 r();
240 }
241
242 static void good_goto3(void)
243 {
244 a();
245 if(condition)
246 goto label;
247 a();
248 r();
249 label:
250 r();
251 }
252
253 static void good_goto4(void)
254 {
255 if(condition)
256 goto label;
257 a();
258 r();
259 label:
260 ;
261 }
262
263 static void good_goto5(void)
264 {
265 a();
266 if(condition)
267 goto label;
268 r();
269 return;
270 label:
271 r();
272 }
273
274 static void warn_goto1(void)
275 {
276 a();
277 goto label;
278 r();
279 label:
280 ;
281 }
282
283 static void warn_goto2(void)
284 {
285 a();
286 goto label;
287 r();
288 label:
289 a();
290 r();
291 }
292
293 static void warn_goto3(void)
294 {
295 a();
296 if(condition)
297 goto label;
298 r();
299 label:
300 r();
301 }
302
303 static void good_cond_lock1(void)
304 {
305 if(ca(condition)) {
306 condition2 = 1; /* do stuff */
307 r();
308 }
309 }
310
311 static void warn_cond_lock1(void)
312 {
313 if(ca(condition))
314 condition2 = 1; /* do stuff */
315 r();
316 }
317 /*
318 * check-name: Check -Wcontext
319 *
320 * check-error-start
321 context.c:69:13: warning: context imbalance in 'warn_lock1' - wrong count at exit
322 context.c:74:13: warning: context imbalance in 'warn_lock2' - wrong count at exit
323 context.c:81:13: warning: context imbalance in 'warn_lock3' - wrong count at exit
324 context.c:88:13: warning: context imbalance in 'warn_unlock1' - unexpected unlock
325 context.c:93:13: warning: context imbalance in 'warn_unlock2' - unexpected unlock
326 context.c:131:12: warning: context imbalance in 'warn_if1' - wrong count at exit
327 context.c:140:12: warning: context imbalance in 'warn_if2' - different lock contexts for basic block
328 context.c:202:9: warning: context imbalance in 'warn_while1' - different lock contexts for basic block
329 context.c:210:17: warning: context imbalance in 'warn_while2' - unexpected unlock
330 context.c:216:9: warning: context imbalance in 'warn_while3' - wrong count at exit
331 context.c:274:13: warning: context imbalance in 'warn_goto1' - wrong count at exit
332 context.c:283:13: warning: context imbalance in 'warn_goto2' - wrong count at exit
333 context.c:300:5: warning: context imbalance in 'warn_goto3' - different lock contexts for basic block
334 context.c:315:5: warning: context imbalance in 'warn_cond_lock1' - different lock contexts for basic block
335 * check-error-end
336 */