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 Levon struct 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 Levon void 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 Levon int 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