diff options
author | David Mitchell <davem@iabyn.com> | 2017-02-18 10:46:53 +0000 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2017-02-18 10:46:53 +0000 |
commit | d8f2fe0966b076afb4b85eb04d1524b6af37e344 (patch) | |
tree | a04ee71aa85ca4b7418ad21915a024b0a1d04447 | |
parent | f62fd06d790b3f8da5a193403a316ebbea86ba52 (diff) | |
download | perl-d8f2fe0966b076afb4b85eb04d1524b6af37e344.tar.gz |
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.
-rw-r--r-- | op.c | 8 | ||||
-rw-r--r-- | t/op/multideref.t | 8 |
2 files changed, 14 insertions, 2 deletions
@@ -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"; + } |