summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doop.c4
-rw-r--r--pp.c4
-rwxr-xr-xt/op/assignwarn.t4
3 files changed, 6 insertions, 6 deletions
diff --git a/doop.c b/doop.c
index 2dccbb993e..cb5560cc3b 100644
--- a/doop.c
+++ b/doop.c
@@ -535,8 +535,8 @@ SV *right;
char *lsave;
char *rsave;
- if (optype == OP_BIT_OR && sv == left && !SvOK(sv) && !SvGMAGICAL(sv))
- sv_setpvn(sv, "", 0); /* avoid undef warning on |= */
+ if (sv != left || (optype != OP_BIT_AND && !SvOK(sv) && !SvGMAGICAL(sv)))
+ sv_setpvn(sv, "", 0); /* avoid undef warning on |= and ^= */
lsave = lc = SvPV(left, leftlen);
rsave = rc = SvPV(right, rightlen);
len = leftlen < rightlen ? leftlen : rightlen;
diff --git a/pp.c b/pp.c
index 089d523966..7a24843f5d 100644
--- a/pp.c
+++ b/pp.c
@@ -977,11 +977,11 @@ PP(pp_bit_xor)
dPOPTOPssrl;
if (SvNIOKp(left) || SvNIOKp(right)) {
if (op->op_private & HINT_INTEGER) {
- IBW value = SvIV(left) ^ SvIV(right);
+ IBW value = (USE_LEFT(left) ? SvIV(left) : 0) ^ SvIV(right);
SETi( value );
}
else {
- UBW value = SvUV(left) ^ SvUV(right);
+ UBW value = (USE_LEFT(left) ? SvUV(left) : 0) ^ SvUV(right);
SETu( value );
}
}
diff --git a/t/op/assignwarn.t b/t/op/assignwarn.t
index 32ee5bb2e9..57e89c45e0 100755
--- a/t/op/assignwarn.t
+++ b/t/op/assignwarn.t
@@ -43,7 +43,7 @@ print "1..23\n";
{ my $x; $x &= 1; ok 13, uninitialized; }
{ my $x; $x |= 1; ok 14, ! uninitialized; }
-{ my $x; $x ^= 1; ok 15, uninitialized; }
+{ my $x; $x ^= 1; ok 15, ! uninitialized; }
{ my $x; $x &&= 1; ok 16, ! uninitialized; }
{ my $x; $x ||= 1; ok 17, ! uninitialized; }
@@ -53,7 +53,7 @@ print "1..23\n";
{ my $x; $x &= "x"; ok 20, uninitialized; }
{ my $x; $x |= "x"; ok 21, ! uninitialized; }
-{ my $x; $x ^= "x"; ok 22, uninitialized; }
+{ my $x; $x ^= "x"; ok 22, ! uninitialized; }
ok 23, $warn eq '';