develooper Front page | perl.perl5.porters | Postings from December 2012

Re: SvUPGRADE and void

Thread Previous | Thread Next
From:
Dave Mitchell
Date:
December 14, 2012 17:49
Subject:
Re: SvUPGRADE and void
Message ID:
20121214174859.GK1842@iabyn.com
On Fri, Dec 14, 2012 at 03:22:15PM +0000, Dave Mitchell wrote:
> On Fri, Dec 14, 2012 at 01:22:42PM +0000, Nicholas Clark wrote:
> > On Thu, Dec 13, 2012 at 01:14:28PM +0000, Dave Mitchell wrote:
> > 
> > > The first is to stick a (void) in front of every bare SvUPGRADE() in the
> > > the perl distribution (including dist/ and, via rt.cpan.org, cpan/).
> > > This seems like quite a bit of effort and is a retrograde step.
> > 
> > And, arguably, on every distribution on CPAN that also generates a warning?
> > 
> > > The second is to bite the bullet and change SvUPGRADE from an expression
> > > into a statement; i.e.
> > > 
> > > #define SvUPGRADE(sv, mt) (SvTYPE(sv) >= (mt) || (sv_upgrade(sv, mt), 1))
> > > 
> > > becomes
> > > 
> > > #define SvUPGRADE(sv, mt) if (sv->type >= (mt)) { sv_upgrade(sv, mt); }
> > > 
> > > A search for 'if.*SvUPGRADE' on grep.cpan.me indicates that about 15
> > > distributions would fail to compile and need fixing.
> > > 
> > > I'm open to other suggestions.
> > 
> > I think we should bit the bullet and go for it. For anything that needs
> > changing, it's a build-time error from the C compiler? (with an easy fix)
> > That's not going to break anything in production.*
> 
> Ok, I've bitten the bullet.

... and broken g++.

Can anyone suggest a definition for SvUPGRADE that works for both of the
forms

    SvUPGRADE(...);
    (void)SvUPGRADE(...);

on gcc, clang and g++, and doesn't generate warnings?

My new incarnation,

    #define SvUPGRADE(sv, mt) \
        STMT_START { if (SvTYPE(sv) < (mt)) sv_upgrade(sv, mt); } STMT_END

which expands this this line in regcomp.c:

    (void)SvUPGRADE(sv_dat,SVt_PVNV);

into:

    (void)do { if (((svtype)((sv_dat)->sv_flags & 0xff)) < (SVt_PVNV)) Perl_sv_upgrade(my_perl, sv_dat,SVt_PVNV); } while (0);

gives this error under g++:

    regcomp.c:8653:35: error: expected primary-expression before ‘do’
    regcomp.c:8653:35: error: expected ‘;’ before ‘do’

while the old version:

    #define SvUPGRADE(sv, mt) (SvTYPE(sv) >= (mt) || (sv_upgrade(sv, mt), 1))

gave warnings under clang for this form:

    SvUPGRADE(...);


-- 
Diplomacy is telling someone to go to hell in such a way that they'll
look forward to the trip

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About