diff options
-rw-r--r-- | gv.c | 16 | ||||
-rw-r--r-- | pp.h | 2 | ||||
-rw-r--r-- | t/op/tie_fetch_count.t | 51 |
3 files changed, 38 insertions, 31 deletions
@@ -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); } @@ -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; |