1*1f5207b7SJohn Levon #include "check_debug.h" 2*1f5207b7SJohn Levon 3*1f5207b7SJohn Levon struct foo { 4*1f5207b7SJohn Levon int a, b, c; 5*1f5207b7SJohn Levon }; 6*1f5207b7SJohn Levon 7*1f5207b7SJohn Levon struct bar { 8*1f5207b7SJohn Levon struct foo *foo; 9*1f5207b7SJohn Levon }; 10*1f5207b7SJohn Levon get_foo(struct bar * bar)11*1f5207b7SJohn Levonstruct foo *get_foo(struct bar *bar) 12*1f5207b7SJohn Levon { 13*1f5207b7SJohn Levon return bar->foo; 14*1f5207b7SJohn Levon } 15*1f5207b7SJohn Levon frob(struct bar * bar)16*1f5207b7SJohn Levonvoid frob(struct bar *bar) 17*1f5207b7SJohn Levon { 18*1f5207b7SJohn Levon struct foo *f = bar->foo; 19*1f5207b7SJohn Levon f->a = 5; 20*1f5207b7SJohn Levon } 21*1f5207b7SJohn Levon test(struct bar * bar)22*1f5207b7SJohn Levonint test(struct bar *bar) 23*1f5207b7SJohn Levon { 24*1f5207b7SJohn Levon struct foo *f = get_foo(bar); 25*1f5207b7SJohn Levon 26*1f5207b7SJohn Levon f->a = 1; 27*1f5207b7SJohn Levon frob(bar); 28*1f5207b7SJohn Levon __smatch_implied(bar->foo->a); 29*1f5207b7SJohn Levon __smatch_implied(f->a); 30*1f5207b7SJohn Levon 31*1f5207b7SJohn Levon return 0; 32*1f5207b7SJohn Levon } 33*1f5207b7SJohn Levon 34*1f5207b7SJohn Levon /* 35*1f5207b7SJohn Levon * check-name: smatch: indirection #2 36*1f5207b7SJohn Levon * check-command: smatch -I.. sm_indirection2.c 37*1f5207b7SJohn Levon * 38*1f5207b7SJohn Levon * check-output-start 39*1f5207b7SJohn Levon sm_indirection2.c:28 test() implied: bar->foo->a = '5' 40*1f5207b7SJohn Levon sm_indirection2.c:29 test() implied: f->a = '5' 41*1f5207b7SJohn Levon * check-output-end 42*1f5207b7SJohn Levon */ 43