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