diff options
-rw-r--r-- | op.c | 1 | ||||
-rw-r--r-- | pp.c | 6 | ||||
-rw-r--r-- | t/op/smartkve.t | 8 |
3 files changed, 15 insertions, 0 deletions
@@ -1690,6 +1690,7 @@ Perl_op_lvalue(pTHX_ OP *o, I32 type) break; case OP_KEYS: + case OP_RKEYS: if (type != OP_SASSIGN) goto nomod; goto lvalue_func; @@ -4850,6 +4850,12 @@ PP(pp_rkeys) PL_op_desc[PL_op->op_type] ); } + if (PL_op->op_flags & OPf_SPECIAL && SvTYPE(sv) == SVt_PVAV) + DIE(aTHX_ + "Can't modify %s in %s", + PL_op_desc[PL_op->op_type], PL_op_desc[PL_op->op_next->op_type] + ); + /* Delegate to correct function for op type */ PUSHs(sv); if (PL_op->op_type == OP_RKEYS || PL_op->op_type == OP_RVALUES) { diff --git a/t/op/smartkve.t b/t/op/smartkve.t index 7c57e7bba4..ad56e6a9c4 100644 --- a/t/op/smartkve.t +++ b/t/op/smartkve.t @@ -131,6 +131,14 @@ ok(defined $empty, 'Vivify: $empty (after keys $empty->{hash}) is HASHREF'); ok(!defined $empty->{hash} , 'Vivify: $empty->{hash} is undef'); +# Keys -- lvalue +$_{foo} = "bar"; +keys \%_ = 65; +is scalar %_, '1/128', 'keys $hashref as lvalue'; +eval 'keys \@_ = 65'; +like $@, qr/Can't modify keys on reference in scalar assignment/, + 'keys $arrayref as lvalue dies'; + # Keys -- errors $errpat = qr/ (?-x:Type of argument to keys on reference must be unblessed hashref or) |