1*1f5207b7SJohn Levon void _spin_lock(int name);
2*1f5207b7SJohn Levon void _spin_unlock(int name);
3*1f5207b7SJohn Levon 
4*1f5207b7SJohn Levon int a, b, c;
5*1f5207b7SJohn Levon 
func(void)6*1f5207b7SJohn Levon int func (void)
7*1f5207b7SJohn Levon {
8*1f5207b7SJohn Levon 	int mylock = 1;
9*1f5207b7SJohn Levon 	int mylock2 = 1;
10*1f5207b7SJohn Levon 	int mylock3 = 1;
11*1f5207b7SJohn Levon 
12*1f5207b7SJohn Levon 	if (a) {
13*1f5207b7SJohn Levon 		return;
14*1f5207b7SJohn Levon 	}
15*1f5207b7SJohn Levon 
16*1f5207b7SJohn Levon 	_spin_lock(mylock);
17*1f5207b7SJohn Levon 	_spin_unlock(mylock);
18*1f5207b7SJohn Levon 
19*1f5207b7SJohn Levon 	if (b) {
20*1f5207b7SJohn Levon 		_spin_unlock(mylock2);
21*1f5207b7SJohn Levon 		return;
22*1f5207b7SJohn Levon 	}
23*1f5207b7SJohn Levon 
24*1f5207b7SJohn Levon 	if (c)
25*1f5207b7SJohn Levon 		_spin_lock(mylock3);
26*1f5207b7SJohn Levon 	return;
27*1f5207b7SJohn Levon }
28*1f5207b7SJohn Levon /*
29*1f5207b7SJohn Levon  * check-name: Smatch locking #1
30*1f5207b7SJohn Levon  * check-command: smatch --project=kernel --spammy sm_locking.c
31*1f5207b7SJohn Levon  *
32*1f5207b7SJohn Levon  * check-output-start
33*1f5207b7SJohn Levon sm_locking.c:26 func() warn: 'spin_lock:mylock3' is sometimes locked here and sometimes unlocked.
34*1f5207b7SJohn Levon sm_locking.c:26 func() warn: inconsistent returns 'spin_lock:mylock2'.
35*1f5207b7SJohn Levon   Locked on:   line 13
36*1f5207b7SJohn Levon                line 26
37*1f5207b7SJohn Levon   Unlocked on: line 21
38*1f5207b7SJohn Levon  * check-output-end
39*1f5207b7SJohn Levon  */
40