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 Levon static 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 Levon static 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 Levon int 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