1*1f5207b7SJohn Levon #include <stdio.h> 2*1f5207b7SJohn Levon #include "check_debug.h" 3*1f5207b7SJohn Levon 4*1f5207b7SJohn Levon struct foo { 5*1f5207b7SJohn Levon int a, b, c; 6*1f5207b7SJohn Levon int (*func)(int *p); 7*1f5207b7SJohn Levon void (*func2)(int a); 8*1f5207b7SJohn Levon void *data; 9*1f5207b7SJohn Levon }; 10*1f5207b7SJohn Levon frob1(int * val)11*1f5207b7SJohn Levonstatic int frob1(int *val) 12*1f5207b7SJohn Levon { 13*1f5207b7SJohn Levon __smatch_implied(*val); 14*1f5207b7SJohn Levon return *val + 1; 15*1f5207b7SJohn Levon } 16*1f5207b7SJohn Levon frob2(int * val)17*1f5207b7SJohn Levonstatic int frob2(int *val) 18*1f5207b7SJohn Levon { 19*1f5207b7SJohn Levon __smatch_implied(*val); 20*1f5207b7SJohn Levon return *val + 1; 21*1f5207b7SJohn Levon } 22*1f5207b7SJohn Levon 23*1f5207b7SJohn Levon static struct foo one_struct = { 24*1f5207b7SJohn Levon .a = 1, 25*1f5207b7SJohn Levon .func = frob1, 26*1f5207b7SJohn Levon }; 27*1f5207b7SJohn Levon 28*1f5207b7SJohn Levon static struct foo two_struct = { 29*1f5207b7SJohn Levon .a = 2, 30*1f5207b7SJohn Levon .func = frob2, 31*1f5207b7SJohn Levon }; 32*1f5207b7SJohn Levon 33*1f5207b7SJohn Levon struct foo *unknown(void); 34*1f5207b7SJohn Levon struct foo *p; 35*1f5207b7SJohn Levon main(void)36*1f5207b7SJohn Levonint main(void) 37*1f5207b7SJohn Levon { 38*1f5207b7SJohn Levon int ret; 39*1f5207b7SJohn Levon 40*1f5207b7SJohn Levon p = unknown(); 41*1f5207b7SJohn Levon ret = p->func(&p->a); 42*1f5207b7SJohn Levon 43*1f5207b7SJohn Levon return 0; 44*1f5207b7SJohn Levon } 45*1f5207b7SJohn Levon 46*1f5207b7SJohn Levon /* 47*1f5207b7SJohn Levon * check-name: smatch mtag #2 48*1f5207b7SJohn Levon * check-command: validation/smatch_db_test.sh -I.. sm_mtag2.c 49*1f5207b7SJohn Levon * 50*1f5207b7SJohn Levon * check-output-start 51*1f5207b7SJohn Levon sm_mtag2.c:13 frob1() implied: *val = '1' 52*1f5207b7SJohn Levon sm_mtag2.c:19 frob2() implied: *val = '2' 53*1f5207b7SJohn Levon * check-output-end 54*1f5207b7SJohn Levon */ 55