diff options
-rwxr-xr-x | embed.pl | 17 | ||||
-rw-r--r-- | ext/DynaLoader/dl_dlopen.xs | 7 | ||||
-rw-r--r-- | perl.h | 4 | ||||
-rw-r--r-- | sv.c | 11 |
4 files changed, 35 insertions, 4 deletions
@@ -794,10 +794,27 @@ EXTCONST void * const PL_force_link_funcs[] = { #define PERLVARIC(v,t,i) PERLVAR(v,t) #define PERLVARISC(v,i) PERLVAR(v,char) +/* In Tru64 (__DEC && __osf__) the cc option -std1 causes that one + * cannot cast between void pointers and function pointers without + * info level warnings. The PL_force_link_funcs[] would cause a few + * hundred of those warnings. In code one can circumnavigate this by using + * unions that overlay the different pointers, but in declarations one + * cannot use this trick. Therefore we just disable the warning here + * for the duration of the PL_force_link_funcs[] declaration. */ + +#if defined(__DECC) && defined(__osf__) +#pragma message save +#pragma message disable (nonstandcast) +#endif + #include "thrdvar.h" #include "intrpvar.h" #include "perlvars.h" +#if defined(__DECC) && defined(__osf__) +#pragma message restore +#endif + #undef PERLVAR #undef PERLVARA #undef PERLVARI diff --git a/ext/DynaLoader/dl_dlopen.xs b/ext/DynaLoader/dl_dlopen.xs index 66ee066adc..475112a684 100644 --- a/ext/DynaLoader/dl_dlopen.xs +++ b/ext/DynaLoader/dl_dlopen.xs @@ -250,9 +250,16 @@ dl_install_xsub(perl_name, symref, filename="$Package") CODE: DLDEBUG(2,PerlIO_printf(Perl_debug_log, "dl_install_xsub(name=%s, symref=%lx)\n", perl_name, (unsigned long) symref)); +#if defined(__DECC) && defined(__osf__) +#pragma message save +#pragma message disable (nonstandcast) /* Avoid symref cast warning. */ +#endif ST(0) = sv_2mortal(newRV((SV*)newXS(perl_name, (void(*)(pTHX_ CV *))symref, filename))); +#if defined(__DECC) && defined(__osf__) +#pragma message restore +#endif char * @@ -5093,8 +5093,8 @@ extern void moncontrol(int); * but also beware since this evaluates its argument twice, so no x++. */ #define PERL_ABS(x) ((x) < 0 ? -(x) : (x)) -#ifdef __osf__ -#pragma message disable (mainparm) /* We have the envp in main(). */ +#if defined(__DECC) && defined(__osf__) +#pragma message disable (mainparm) /* Perl uses the envp in main(). */ #endif /* and finally... */ @@ -11219,6 +11219,9 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param) void (*dptr) (void*); void (*dxptr) (pTHX_ void*); OP *o; + /* Unions for circumventing strict ANSI C89 casting rules. */ + union { void *vptr; void (*dptr)(void*); } u1, u2; + union { void *vptr; void (*dxptr)(pTHX_ void*); } u3, u4; Newz(54, nss, max, ANY); @@ -11390,13 +11393,17 @@ Perl_ss_dup(pTHX_ PerlInterpreter *proto_perl, CLONE_PARAMS* param) ptr = POPPTR(ss,ix); TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */ dptr = POPDPTR(ss,ix); - TOPDPTR(nss,ix) = (void (*)(void*))any_dup((void *)dptr, proto_perl); + u1.dptr = dptr; + u2.vptr = any_dup(u1.vptr, proto_perl); + TOPDPTR(nss,ix) = u2.dptr; break; case SAVEt_DESTRUCTOR_X: ptr = POPPTR(ss,ix); TOPPTR(nss,ix) = any_dup(ptr, proto_perl); /* XXX quite arbitrary */ dxptr = POPDXPTR(ss,ix); - TOPDXPTR(nss,ix) = (void (*)(pTHX_ void*))any_dup((void *)dxptr, proto_perl); + u3.dxptr = dxptr; + u4.vptr = any_dup(u3.vptr, proto_perl);; + TOPDXPTR(nss,ix) = u4.dxptr; break; case SAVEt_REGCONTEXT: case SAVEt_ALLOC: |