On Thursday 19 June 2008 15:33:14 Parrot via RT wrote: > "src/packfile.c", line 351: warning: argument #1 is incompatible with > prototype: > prototype: pointer to char : "/usr/include/sys/mman.h", line 161 > argument : pointer to long > "src/packfile.c", line 878: warning: argument #1 is incompatible with > prototype: > prototype: pointer to char : "/usr/include/sys/mman.h", line 161 > argument : pointer to long
I'm concluding that these warnings are due to incorrect casting inside of packfile.c. In both cases, the code generating the warnings looks like this: munmap(PARROT_const_cast(opcode_t *, pf->src), pf->size); pf->src is a const opcode_t* and the purpose of the PARROT_const_cast is to drop the const. The first argument to munmap() is a void* on Linux and Mac, but a char* on Solaris; I tried globally defining the feature-test macros _POSIX_C_SOURCE or _XPG4_2, but these are supposed to be an all-or-nothing choice, and in both cases they broke the build elsewhere. In C any pointer auto-converts to a void*, but has to be cast to any other pointer type such as a char*. If we change the above casts to void* the warning on Solaris goes away. I have checked this on Linux and it builds fine. Hence the attached patch to packfile.c - Andrew -- Talk is cheap. Show me the code. -- Linus Torvalds
Index: src/packfile.c =================================================================== --- src/packfile.c (revision 28514) +++ src/packfile.c (working copy) @@ -348,7 +348,7 @@ #ifdef PARROT_HAS_HEADER_SYSMMAN if (pf->is_mmap_ped) { DECL_CONST_CAST; - munmap(PARROT_const_cast(opcode_t *, pf->src), pf->size); + munmap(PARROT_const_cast(void *, pf->src), pf->size); } #endif @@ -875,7 +875,7 @@ if (self->is_mmap_ped && (self->need_endianize || self->need_wordsize)) { DECL_CONST_CAST; - munmap(PARROT_const_cast(opcode_t *, self->src), self->size); + munmap(PARROT_const_cast(void *, self->src), self->size); self->is_mmap_ped = 0; } #endif