blob: f47a2e30492c8a0fc82747c42dd0a31c01cd6b4c [file] [log] [blame]
#define FOR_EACH_SCALAR(F) \
F(sc, signed char) \
F(uc, unsigned char) \
F(ss, short) \
F(us, unsigned short) \
F(si, int) \
F(ui, unsigned int) \
F(sl, long) \
F(ul, unsigned long) \
F(sll, long long) \
F(ull, unsigned long long) \
F(f, float) \
F(d, double) \
F(ld, long double) \
F(ptr, void *)
#define EXTERN(SUFFIX, TYPE) extern TYPE x##SUFFIX;
#define STATIC(SUFFIX, TYPE) static TYPE s##SUFFIX;
#define COMMON(SUFFIX, TYPE) TYPE c##SUFFIX;
#define GETADDR(SUFFIX, TYPE) \
TYPE *get##SUFFIX (int which) \
{ \
return (which == 0 ? &c##SUFFIX \
: which == 1 ? &s##SUFFIX \
: &x##SUFFIX); \
}
#define COPY(SUFFIX, TYPE) c##SUFFIX = s##SUFFIX; s##SUFFIX = x##SUFFIX;
FOR_EACH_SCALAR (EXTERN)
FOR_EACH_SCALAR (STATIC)
FOR_EACH_SCALAR (COMMON)
FOR_EACH_SCALAR (GETADDR)
void
copy (void)
{
FOR_EACH_SCALAR (COPY);
}
extern void foo (int);
void
sibcall1 (void)
{
foo (1);
}
void
sibcall2 (void)
{
foo (csi + ssi + xsi);
}
static void
sibcall3 (void)
{
foo (1);
foo (2);
foo (3);
}
extern void bar (void (*) (void));
int
nested (int x)
{
void sub (void) { foo (x); }
bar (sub);
bar (sibcall3);
return 1;
}