11f5207b7SJohn Levon int _spin_trylock(int name);
21f5207b7SJohn Levon void _spin_lock(int name);
31f5207b7SJohn Levon void _spin_unlock(int name);
41f5207b7SJohn Levon 
func(void)51f5207b7SJohn Levon int func (void)
61f5207b7SJohn Levon {
71f5207b7SJohn Levon 	int mylock = 1;
81f5207b7SJohn Levon 
91f5207b7SJohn Levon 	if (!({frob(); frob(); _spin_trylock(mylock);}))
101f5207b7SJohn Levon 		return;
111f5207b7SJohn Levon 
121f5207b7SJohn Levon 	frob();
131f5207b7SJohn Levon 	_spin_unlock(mylock);
141f5207b7SJohn Levon 
151f5207b7SJohn Levon 	if (((_spin_trylock(mylock)?1:0)?1:0))
161f5207b7SJohn Levon 		return;
171f5207b7SJohn Levon 	frob_somemore();
181f5207b7SJohn Levon 	_spin_unlock(mylock);
191f5207b7SJohn Levon 
201f5207b7SJohn Levon 	return;
211f5207b7SJohn Levon }
221f5207b7SJohn Levon /*
231f5207b7SJohn Levon  * check-name: Smatch locking #3
241f5207b7SJohn Levon  * check-command: smatch --project=kernel sm_locking3.c
251f5207b7SJohn Levon  *
261f5207b7SJohn Levon  * check-output-start
27*31ad075eSJohn Levon sm_locking3.c:18 func() error: double unlocked 'mylock' (orig line 15)
28*31ad075eSJohn Levon sm_locking3.c:20 func() warn: inconsistent returns 'mylock'.
29*31ad075eSJohn Levon   Locked on  : 16
30*31ad075eSJohn Levon   Unlocked on: 10,20
311f5207b7SJohn Levon  * check-output-end
321f5207b7SJohn Levon  */
33