This should correct warnings on a few compilers and outright breakage on tcc.
It uses the D2FPTR/F2DPTR macros to cast between data and function pointers where needed. --Josh Index: nci.c =================================================================== RCS file: /cvs/public/parrot/nci.c,v retrieving revision 1.3 diff -u -r1.3 nci.c --- nci.c 21 Nov 2002 02:00:23 -0000 1.3 +++ nci.c 21 Nov 2002 05:39:52 -0000 @@ -20,7 +20,7 @@ /* Return void, take nothing */ static void pcf_v_v(struct Parrot_Interp *interpreter, PMC *self) { void (*pointer)(); - pointer = self->cache.struct_val; + pointer = (void (*)())D2FPTR(self->cache.struct_val); (void)(*pointer)(); interpreter->ctx.int_reg.registers[0] = 0; interpreter->ctx.int_reg.registers[1] = 0; @@ -34,7 +34,7 @@ static void pcf_i_v(struct Parrot_Interp *interpreter, PMC *self) { int (*pointer)(); int return_data; - pointer = self->cache.struct_val; + pointer = (int (*)())D2FPTR(self->cache.struct_val); return_data = (int)(*pointer)(); interpreter->ctx.int_reg.registers[5] = return_data; interpreter->ctx.int_reg.registers[0] = 0; @@ -49,7 +49,7 @@ static void pcf_d_v(struct Parrot_Interp *interpreter, PMC *self) { double (*pointer)(); double return_data; - pointer = self->cache.struct_val; + pointer = (double (*)())D2FPTR(self->cache.struct_val); return_data = (double)(*pointer)(); interpreter->ctx.num_reg.registers[5] = return_data; interpreter->ctx.int_reg.registers[0] = 0; @@ -65,7 +65,7 @@ double (*pointer)(); double return_data; - pointer = self->cache.struct_val; + pointer = (double (*)())D2FPTR(self->cache.struct_val); return_data = (double)(*pointer)(interpreter->ctx.num_reg.registers[5]); interpreter->ctx.num_reg.registers[5] = return_data; interpreter->ctx.int_reg.registers[0] = 0; @@ -91,13 +91,13 @@ #else /* And in here is the platform-independent way. Which is to say "here there be hacks" */ - if (0 == string_length(signature)) return pcf_v_v; + if (0 == string_length(signature)) return F2DPTR(pcf_v_v); if (!string_compare(interpreter, signature, string_from_c_string(interpreter, "i", 1))) - return pcf_i_v; + return F2DPTR(pcf_i_v); if (!string_compare(interpreter, signature, string_from_c_string(interpreter, "d", 1))) - return pcf_d_v; + return F2DPTR(pcf_d_v); if (!string_compare(interpreter, signature, string_from_c_string(interpreter, "dd", 2))) - return pcf_d_d; + return F2DPTR(pcf_d_d); return NULL; #endif