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