summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gv.c16
-rw-r--r--pp.h2
-rw-r--r--t/op/tie_fetch_count.t51
3 files changed, 38 insertions, 31 deletions
diff --git a/gv.c b/gv.c
index b1bc60f4e6..2abe418519 100644
--- a/gv.c
+++ b/gv.c
@@ -2077,9 +2077,21 @@ Perl_try_amagic_bin(pTHX_ int method, int flags) {
return TRUE;
}
}
+ if(left==right && SvGMAGICAL(left)) {
+ SV * const left = sv_newmortal();
+ *(sp-1) = left;
+ /* Print the uninitialized warning now, so it includes the vari-
+ able name. */
+ if (!SvOK(right)) {
+ if (ckWARN(WARN_UNINITIALIZED)) report_uninit(right);
+ sv_setsv_flags(left, &PL_sv_no, 0);
+ }
+ else sv_setsv_flags(left, right, 0);
+ SvGETMAGIC(right);
+ }
if (flags & AMGf_numeric) {
- if (SvROK(left))
- *(sp-1) = sv_2num(left);
+ if (SvROK(TOPm1s))
+ *(sp-1) = sv_2num(TOPm1s);
if (SvROK(right))
*sp = sv_2num(right);
}
diff --git a/pp.h b/pp.h
index 7ae6afa2ca..ca45f61687 100644
--- a/pp.h
+++ b/pp.h
@@ -358,7 +358,7 @@ Does not use C<TARG>. See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
SV *rightsv = POPs; \
SV *leftsv = CAT2(X,s); \
IV left = USE_LEFT(leftsv) ? SvIV_nomg(leftsv) : 0; \
- IV right = SvIV(rightsv)
+ IV right = SvIV_nomg(rightsv)
#define dPOPPOPssrl dPOPXssrl(POP)
#define dPOPPOPnnrl dPOPXnnrl(POP)
diff --git a/t/op/tie_fetch_count.t b/t/op/tie_fetch_count.t
index df1c0feba0..e90f2e6d40 100644
--- a/t/op/tie_fetch_count.t
+++ b/t/op/tie_fetch_count.t
@@ -196,34 +196,29 @@ sub bin_int_test {
check_count "$op under use integer", 2;
}
-our $TODO;
-my $todo = 'bug #87708';
-{
- local $TODO = $todo;
- bin_test '**', 2, 3, 8;
- bin_test '*' , 2, 3, 6;
- bin_test '/' , 10, 2, 5;
- bin_test '%' , 11, 2, 1;
- bin_test 'x' , 11, 2, 1111;
- bin_test '-' , 11, 2, 9;
- bin_test '<<', 11, 2, 44;
- bin_test '>>', 44, 2, 11;
- bin_test '<' , 1, 2, 1;
- bin_test '>' , 44, 2, 1;
- bin_test '<=', 44, 2, "";
- bin_test '>=', 1, 2, "";
- bin_test '!=', 1, 2, 1;
- bin_test '<=>', 1, 2, -1;
- bin_test 'le', 4, 2, "";
- bin_test 'lt', 1, 2, 1;
- bin_test 'gt', 4, 2, 1;
- bin_test 'ge', 1, 2, "";
- bin_test 'eq', 1, 2, "";
- bin_test 'ne', 1, 2, 1;
- bin_test 'cmp', 1, 2, -1;
- bin_test '&' , 1, 2, 0;
- bin_test '|' , 1, 2, 3;
-}
+bin_test '**', 2, 3, 8;
+bin_test '*' , 2, 3, 6;
+bin_test '/' , 10, 2, 5;
+bin_test '%' , 11, 2, 1;
+bin_test 'x' , 11, 2, 1111;
+bin_test '-' , 11, 2, 9;
+bin_test '<<', 11, 2, 44;
+bin_test '>>', 44, 2, 11;
+bin_test '<' , 1, 2, 1;
+bin_test '>' , 44, 2, 1;
+bin_test '<=', 44, 2, "";
+bin_test '>=', 1, 2, "";
+bin_test '!=', 1, 2, 1;
+bin_test '<=>', 1, 2, -1;
+bin_test 'le', 4, 2, "";
+bin_test 'lt', 1, 2, 1;
+bin_test 'gt', 4, 2, 1;
+bin_test 'ge', 1, 2, "";
+bin_test 'eq', 1, 2, "";
+bin_test 'ne', 1, 2, 1;
+bin_test 'cmp', 1, 2, -1;
+bin_test '&' , 1, 2, 0;
+bin_test '|' , 1, 2, 3;
bin_test '.' , 1, 2, 12;
bin_test '==', 1, 2, "";
bin_test '+' , 1, 2, 3;