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