11f5207b7SJohn Levon #include "check_debug.h" 21f5207b7SJohn Levon 31f5207b7SJohn Levon unsigned long arch_local_irq_save(); 41f5207b7SJohn Levon void arch_local_irq_restore(unsigned long flags); 51f5207b7SJohn Levon int spin_trylock(); 61f5207b7SJohn Levon void frob(); 71f5207b7SJohn Levon 81f5207b7SJohn Levon void func(int *y) 91f5207b7SJohn Levon { 101f5207b7SJohn Levon int lock; 111f5207b7SJohn Levon unsigned long flags; 121f5207b7SJohn Levon 131f5207b7SJohn Levon if (({ 141f5207b7SJohn Levon int __ret; 151f5207b7SJohn Levon flags = arch_local_irq_save(); 161f5207b7SJohn Levon __ret = spin_trylock(&lock); 171f5207b7SJohn Levon if (!__ret) 181f5207b7SJohn Levon arch_local_irq_restore(flags); 191f5207b7SJohn Levon __ret; 201f5207b7SJohn Levon })) 211f5207b7SJohn Levon return; 221f5207b7SJohn Levon frob(); 231f5207b7SJohn Levon } 241f5207b7SJohn Levon 251f5207b7SJohn Levon /* 261f5207b7SJohn Levon * check-name: smatch locking #7 271f5207b7SJohn Levon * check-command: smatch -p=kernel -I.. sm_locking7.c 281f5207b7SJohn Levon * 291f5207b7SJohn Levon * check-output-start 30*31ad075eSJohn Levon sm_locking7.c:22 func() warn: inconsistent returns 'flags'. 31*31ad075eSJohn Levon Locked on : 21 32*31ad075eSJohn Levon Unlocked on: 22 33*31ad075eSJohn Levon sm_locking7.c:22 func() warn: inconsistent returns 'lock'. 34*31ad075eSJohn Levon Locked on : 21 35*31ad075eSJohn Levon Unlocked on: 22 361f5207b7SJohn Levon * check-output-end 371f5207b7SJohn Levon */ 38