1int __raw_local_irq_save();
2int _spin_trylock(int x);
3int 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
11void _spin_unlock_irqrestore(int lock, int flags);
12
13int zzz;
14
15void 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
34sm_locking6.c:27 func() warn: inconsistent returns 'flags'.
35  Locked on  : 26
36  Unlocked on: 21,24,27
37sm_locking6.c:27 func() warn: inconsistent returns 'lock'.
38  Locked on  : 26
39  Unlocked on: 21,24,27
40 * check-output-end
41 */
42