1 int __raw_local_irq_save();
2 int _spin_trylock(int x);
3 int raw_local_irq_restore(flags);
4 
5 #define spin_trylock_irqsave(lock, flags) \
6 ({ \
7         (flags) = __raw_local_irq_save(); \
8         _spin_trylock(lock) ? 1 : ({ raw_local_irq_restore(flags);  0; }); \
9 })
10 
11 void _spin_unlock_irqrestore(int lock, int flags);
12 
13 int zzz;
14 
func(void)15 void func (void)
16 {
17 	int lock = 1;
18 	int flags = 1;
19 
20 	if (!spin_trylock_irqsave(lock, flags))
21 		return;
22 	_spin_unlock_irqrestore(lock, flags);
23 	if (zzz)
24 		return;
25 	if (spin_trylock_irqsave(lock, flags))
26 		return;
27 	return;
28 }
29 /*
30  * check-name: Smatch locking #6
31  * check-command: smatch -p=kernel sm_locking6.c
32  *
33  * check-output-start
34 sm_locking6.c:27 func() warn: inconsistent returns 'flags'.
35   Locked on  : 26
36   Unlocked on: 21,24,27
37 sm_locking6.c:27 func() warn: inconsistent returns 'lock'.
38   Locked on  : 26
39   Unlocked on: 21,24,27
40  * check-output-end
41  */
42