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