1*c85f09ccSJohn Levon extern int ival;
2*c85f09ccSJohn Levon extern int *ipval;
3*c85f09ccSJohn Levon extern int array[3];
4*c85f09ccSJohn Levon extern int matrix[3][3];
5*c85f09ccSJohn Levon extern int fun(int);
61f5207b7SJohn Levon 
7*c85f09ccSJohn Levon // via an argument
8*c85f09ccSJohn Levon void arg(int a, int *p, int (*fb)(unsigned char), int (*fi)(int), int (*fl)(long), int (*fv)(void), int (*fip)(int *), int (*fim)(int (*)[3]), int (*fvp)(void *), int (*ffp)(int (*)(int)));
arg(int a,int * p,int (* fb)(unsigned char),int (* fi)(int),int (* fl)(long),int (* fv)(void),int (* fip)(int *),int (* fim)(int (*)[3]),int (* fvp)(void *),int (* ffp)(int (*)(int)))9*c85f09ccSJohn Levon void arg(int a, int *p, int (*fb)(unsigned char), int (*fi)(int), int (*fl)(long), int (*fv)(void), int (*fip)(int *), int (*fim)(int (*)[3]), int (*fvp)(void *), int (*ffp)(int (*)(int)))
101f5207b7SJohn Levon {
11*c85f09ccSJohn Levon 	fv();
12*c85f09ccSJohn Levon 
13*c85f09ccSJohn Levon 	fb(a);
14*c85f09ccSJohn Levon 	fi(a);
15*c85f09ccSJohn Levon 	fl(a);
16*c85f09ccSJohn Levon 	fb(123);
17*c85f09ccSJohn Levon 	fi(123);
18*c85f09ccSJohn Levon 	fl(123);
19*c85f09ccSJohn Levon 	fb(123L);
20*c85f09ccSJohn Levon 	fi(123L);
21*c85f09ccSJohn Levon 	fl(123L);
22*c85f09ccSJohn Levon 	fb(ival);
23*c85f09ccSJohn Levon 	fi(ival);
24*c85f09ccSJohn Levon 	fl(ival);
25*c85f09ccSJohn Levon 
26*c85f09ccSJohn Levon 	fip(p);
27*c85f09ccSJohn Levon 	fip((void*)0);
28*c85f09ccSJohn Levon 	fip(ipval);
29*c85f09ccSJohn Levon 	fip(&ival);
30*c85f09ccSJohn Levon 	fip(array);
31*c85f09ccSJohn Levon 	fim(matrix);
32*c85f09ccSJohn Levon 
33*c85f09ccSJohn Levon 	fvp(p);
34*c85f09ccSJohn Levon 	fvp((void*)0);
35*c85f09ccSJohn Levon 	fvp(ipval);
36*c85f09ccSJohn Levon 	fvp(&ival);
37*c85f09ccSJohn Levon 	fvp(array);
38*c85f09ccSJohn Levon 	fvp(matrix);
39*c85f09ccSJohn Levon 
40*c85f09ccSJohn Levon 	fvp(fun);
41*c85f09ccSJohn Levon 	fvp(&fun);
42*c85f09ccSJohn Levon 	ffp(fun);
43*c85f09ccSJohn Levon 	ffp(&fun);
44*c85f09ccSJohn Levon }
45*c85f09ccSJohn Levon 
46*c85f09ccSJohn Levon // a global
47*c85f09ccSJohn Levon extern int (*fb)(unsigned char);
48*c85f09ccSJohn Levon extern int (*fi)(int);
49*c85f09ccSJohn Levon extern int (*fl)(long);
50*c85f09ccSJohn Levon extern int (*fv)(void);
51*c85f09ccSJohn Levon extern int (*fip)(int *);
52*c85f09ccSJohn Levon extern int (*fim)(int (*)[3]);
53*c85f09ccSJohn Levon extern int (*fvp)(void *);
54*c85f09ccSJohn Levon extern int (*ffp)(int (*)(int));
55*c85f09ccSJohn Levon 
56*c85f09ccSJohn Levon void glb(int a, int *p);
glb(int a,int * p)57*c85f09ccSJohn Levon void glb(int a, int *p)
58*c85f09ccSJohn Levon {
59*c85f09ccSJohn Levon 	fv();
60*c85f09ccSJohn Levon 
61*c85f09ccSJohn Levon 	fb(a);
62*c85f09ccSJohn Levon 	fi(a);
63*c85f09ccSJohn Levon 	fl(a);
64*c85f09ccSJohn Levon 	fb(123);
65*c85f09ccSJohn Levon 	fi(123);
66*c85f09ccSJohn Levon 	fl(123);
67*c85f09ccSJohn Levon 	fb(123L);
68*c85f09ccSJohn Levon 	fi(123L);
69*c85f09ccSJohn Levon 	fl(123L);
70*c85f09ccSJohn Levon 	fb(ival);
71*c85f09ccSJohn Levon 	fi(ival);
72*c85f09ccSJohn Levon 	fl(ival);
73*c85f09ccSJohn Levon 
74*c85f09ccSJohn Levon 	fip(p);
75*c85f09ccSJohn Levon 	fip((void*)0);
76*c85f09ccSJohn Levon 	fip(ipval);
77*c85f09ccSJohn Levon 	fip(&ival);
78*c85f09ccSJohn Levon 	fip(array);
79*c85f09ccSJohn Levon 	fim(matrix);
80*c85f09ccSJohn Levon 
81*c85f09ccSJohn Levon 	fvp(p);
82*c85f09ccSJohn Levon 	fvp((void*)0);
83*c85f09ccSJohn Levon 	fvp(ipval);
84*c85f09ccSJohn Levon 	fvp(&ival);
85*c85f09ccSJohn Levon 	fvp(array);
86*c85f09ccSJohn Levon 	fvp(matrix);
87*c85f09ccSJohn Levon 
88*c85f09ccSJohn Levon 	fvp(fun);
89*c85f09ccSJohn Levon 	fvp(&fun);
90*c85f09ccSJohn Levon 	ffp(fun);
91*c85f09ccSJohn Levon 	ffp(&fun);
92*c85f09ccSJohn Levon }
93*c85f09ccSJohn Levon 
94*c85f09ccSJohn Levon // via a struct member:
95*c85f09ccSJohn Levon // -> force to create a register containing the function pointer
96*c85f09ccSJohn Levon struct ops {
97*c85f09ccSJohn Levon 	int (*fb)(unsigned char);
98*c85f09ccSJohn Levon 	int (*fi)(int);
99*c85f09ccSJohn Levon 	int (*fl)(long);
100*c85f09ccSJohn Levon 	int (*fv)(void);
101*c85f09ccSJohn Levon 	int (*fip)(int *);
102*c85f09ccSJohn Levon 	int (*fim)(int (*)[3]);
103*c85f09ccSJohn Levon 	int (*fvp)(void *);
104*c85f09ccSJohn Levon 	int (*ffp)(int (*)(int));
105*c85f09ccSJohn Levon 
106*c85f09ccSJohn Levon 	int (*const cfi)(int);		// for the fun of it
107*c85f09ccSJohn Levon };
108*c85f09ccSJohn Levon 
109*c85f09ccSJohn Levon void ops(int a, int *p, struct ops *ops);
ops(int a,int * p,struct ops * ops)110*c85f09ccSJohn Levon void ops(int a, int *p, struct ops *ops)
111*c85f09ccSJohn Levon {
112*c85f09ccSJohn Levon 	ops->fv();
113*c85f09ccSJohn Levon 
114*c85f09ccSJohn Levon 	ops->fb(a);
115*c85f09ccSJohn Levon 	ops->fi(a);
116*c85f09ccSJohn Levon 	ops->fl(a);
117*c85f09ccSJohn Levon 	ops->fb(123);
118*c85f09ccSJohn Levon 	ops->fi(123);
119*c85f09ccSJohn Levon 	ops->fl(123);
120*c85f09ccSJohn Levon 	ops->fb(123L);
121*c85f09ccSJohn Levon 	ops->fi(123L);
122*c85f09ccSJohn Levon 	ops->fl(123L);
123*c85f09ccSJohn Levon 	ops->fb(ival);
124*c85f09ccSJohn Levon 	ops->fi(ival);
125*c85f09ccSJohn Levon 	ops->fl(ival);
126*c85f09ccSJohn Levon 
127*c85f09ccSJohn Levon 	ops->fip(p);
128*c85f09ccSJohn Levon 	ops->fip((void*)0);
129*c85f09ccSJohn Levon 	ops->fip(ipval);
130*c85f09ccSJohn Levon 	ops->fip(&ival);
131*c85f09ccSJohn Levon 	ops->fip(array);
132*c85f09ccSJohn Levon 	ops->fim(matrix);
133*c85f09ccSJohn Levon 
134*c85f09ccSJohn Levon 	ops->fvp(p);
135*c85f09ccSJohn Levon 	ops->fvp((void*)0);
136*c85f09ccSJohn Levon 	ops->fvp(ipval);
137*c85f09ccSJohn Levon 	ops->fvp(&ival);
138*c85f09ccSJohn Levon 	ops->fvp(array);
139*c85f09ccSJohn Levon 	ops->fvp(matrix);
140*c85f09ccSJohn Levon 
141*c85f09ccSJohn Levon 	ops->fvp(fun);
142*c85f09ccSJohn Levon 	ops->fvp(&fun);
143*c85f09ccSJohn Levon 	ops->ffp(fun);
144*c85f09ccSJohn Levon 	ops->ffp(&fun);
145*c85f09ccSJohn Levon 	ops->fvp(fi);
146*c85f09ccSJohn Levon 
147*c85f09ccSJohn Levon 	ops->cfi(42);
1481f5207b7SJohn Levon }
1491f5207b7SJohn Levon 
1501f5207b7SJohn Levon /*
1511f5207b7SJohn Levon  * check-name: Function pointer code generation
1521f5207b7SJohn Levon  * check-command: sparsec -c $file -o tmp.o
1531f5207b7SJohn Levon  */
154