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