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