On Mon, Sep 19, 2005 at 11:31:19PM +0100, Nicholas Clark wrote: > Merijn notices this line in 5.8.x in S_new_logop > > if ((type == OP_AND) == (SvTRUE(((SVOP*)first)->op_sv))) { > > It's wonky. It seems to be wrong. But it's been that way since 5.8.0 started. > > The corresponding point in blead is > > if ((type == OP_AND && SvTRUE(((SVOP*)first)->op_sv)) || > (type == OP_OR && !SvTRUE(((SVOP*)first)->op_sv)) || > (type == OP_DOR && !SvOK(((SVOP*)first)->op_sv))) { > > > This was patched by Marcus Holland-Moritz, changing that == to && in the > process: > > http://public.activestate.com/cgi-bin/perlbrowse?patch=22625 > > Presumably '==' is wrong. But if this is a bug, how can it be detected > with a perl level regression test?
== is correct; if both operands are 0 or 1, a == b is equivalent to !(a ^ b) is equivalent to !(a && !b || !a && b) is equivlent to a && b || !a && !b.