In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/d8f2fe0966b076afb4b85eb04d1524b6af37e344?hp=f62fd06d790b3f8da5a193403a316ebbea86ba52>

- Log -----------------------------------------------------------------
commit d8f2fe0966b076afb4b85eb04d1524b6af37e344
Author: David Mitchell <[email protected]>
Date:   Sat Feb 18 10:46:53 2017 +0000

    pp_multideref: tweak an assertion
    
    My recent commit v5.25.9-89-g43dbb3c added an assertion to the effect that
    in
    
        @{ local $a[0]{b}[1] } = 1;
    
    the 'local' could only appear at the end of a block and so asserted that the
    next op should be OP_LEAVE. However, this:
    
        @{1, local $a[0]{b}[1] } = 1;
    
    inserts an OP_LIST before the OP_LEAVE.
    
    Improve the assert to cope with any number of OP_NULL or OP_LISTs before
    the OP_LEAVE.
-----------------------------------------------------------------------

Summary of changes:
 op.c              | 8 +++++++-
 t/op/multideref.t | 8 +++++++-
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/op.c b/op.c
index f16c6b509a..66c4a9b1b4 100644
--- a/op.c
+++ b/op.c
@@ -13193,7 +13193,13 @@ S_maybe_multideref(pTHX_ OP *start, OP *orig_o, UV 
orig_action, U8 hints)
                  * block of code would need rethinking.
                  */
                 if (is_deref && (o->op_private & OPpLVAL_INTRO)) {
-                    assert(o->op_next->op_type == OP_LEAVE);
+#ifdef DEBUGGING
+                    OP *n = o->op_next;
+                    while (n && (  n->op_type == OP_NULL
+                                || n->op_type == OP_LIST))
+                        n = n->op_next;
+                    assert(n && n->op_type == OP_LEAVE);
+#endif
                     o->op_private &= ~OPpDEREF;
                     is_deref = FALSE;
                 }
diff --git a/t/op/multideref.t b/t/op/multideref.t
index 87c57e8ddd..199e523451 100644
--- a/t/op/multideref.t
+++ b/t/op/multideref.t
@@ -18,7 +18,7 @@ BEGIN {
 use warnings;
 use strict;
 
-plan 60;
+plan 62;
 
 
 # check that strict refs hint is handled
@@ -216,4 +216,10 @@ sub defer {}
     like $@, qr/Can't use an undefined value as an ARRAY reference/,
                     "RT #130727 error";
     ok !defined $x[0][0],"RT #130727 array not autovivified";
+
+    eval { @{1, local $x[0][0]} = 1; };
+    like $@, qr/Can't use an undefined value as an ARRAY reference/,
+                    "RT #130727 part 2: error";
+    ok !defined $x[0][0],"RT #130727 part 2: array not autovivified";
+
 }

--
Perl5 Master Repository

Reply via email to