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 (*func)(struct foo *);
6*1f5207b7SJohn Levon 	int a, b, c;
7*1f5207b7SJohn Levon 	int *p;
8*1f5207b7SJohn Levon };
9*1f5207b7SJohn Levon 
frob1(struct foo * p)10*1f5207b7SJohn Levon int frob1(struct foo *p)
11*1f5207b7SJohn Levon {
12*1f5207b7SJohn Levon 	__smatch_implied(*p->p);
13*1f5207b7SJohn Levon }
14*1f5207b7SJohn Levon 
frob2(struct foo * p)15*1f5207b7SJohn Levon int frob2(struct foo *p)
16*1f5207b7SJohn Levon {
17*1f5207b7SJohn Levon 	__smatch_implied(*p->p);
18*1f5207b7SJohn Levon }
19*1f5207b7SJohn Levon 
20*1f5207b7SJohn Levon int x = 42;
21*1f5207b7SJohn Levon int y = 43;
22*1f5207b7SJohn Levon 
23*1f5207b7SJohn Levon struct foo aaa = {
24*1f5207b7SJohn Levon 	.func = frob1,
25*1f5207b7SJohn Levon 	.a = 1, .b = 2, .c = 3,
26*1f5207b7SJohn Levon 	.p = &x,
27*1f5207b7SJohn Levon };
28*1f5207b7SJohn Levon struct foo bbb = {
29*1f5207b7SJohn Levon 	.func = frob2,
30*1f5207b7SJohn Levon 	.a = 10, .b = 11, .c = 13,
31*1f5207b7SJohn Levon 	.p = &y,
32*1f5207b7SJohn Levon };
33*1f5207b7SJohn Levon 
main(void)34*1f5207b7SJohn Levon int main(void)
35*1f5207b7SJohn Levon {
36*1f5207b7SJohn Levon 	aaa.func(&aaa);
37*1f5207b7SJohn Levon 	bbb.func(&bbb);
38*1f5207b7SJohn Levon 	return 0;
39*1f5207b7SJohn Levon }
40*1f5207b7SJohn Levon 
41*1f5207b7SJohn Levon /*
42*1f5207b7SJohn Levon  * check-name: smatch mtag #7
43*1f5207b7SJohn Levon  * check-command: validation/smatch_db_test.sh -I.. sm_mtag7.c
44*1f5207b7SJohn Levon  *
45*1f5207b7SJohn Levon  * check-output-start
46*1f5207b7SJohn Levon sm_mtag7.c:12 frob1() implied: *p->p = '42'
47*1f5207b7SJohn Levon sm_mtag7.c:17 frob2() implied: *p->p = '43'
48*1f5207b7SJohn Levon  * check-output-end
49*1f5207b7SJohn Levon  */
50