1 typedef int  (*binop_t)(int, int);
2 typedef int  (*unop_t)(int);
3 typedef int  (*idef_t)(void);
4 typedef long (*ldef_t)(void);
5 typedef void (*use_t)(int);
6 
7 // We want to 'fn' have several different types.
8 // The goal is for the ->priv member to be used
9 // with a type different from what it was first stored.
10 
11 int foo(void *fn, int arg1, int arg2);
foo(void * fn,int arg1,int arg2)12 int foo(void *fn, int arg1, int arg2)
13 {
14 	int res = 0;
15 
16 	res += ((binop_t)fn)(arg1, arg2);
17 	res += ((unop_t)fn)(arg1);
18 	res += ((ldef_t)fn)();
19 	res += ((idef_t)fn)();
20 	((use_t)fn)(res);
21 	return res;
22 }
23 
24 int bar(int (*fn)(int), int arg1, int arg2);
bar(int (* fn)(int),int arg1,int arg2)25 int bar(int (*fn)(int), int arg1, int arg2)
26 {
27 	int res = 0;
28 
29 	res += ((binop_t)fn)(arg1, arg2);
30 	res += fn(arg1);
31 	return res;
32 }
33 
34 /*
35  * check-name: mutate function pointer's type
36  * check-command: sparsec -c $file -o tmp.o
37  */
38