diff options
-rw-r--r-- | scope.c | 2 | ||||
-rwxr-xr-x | t/op/local.t | 16 |
2 files changed, 16 insertions, 2 deletions
@@ -214,7 +214,7 @@ S_save_scalar_at(pTHX_ SV **sptr) PL_tainted = oldtainted; } SvMAGIC(sv) = SvMAGIC(osv); - SvFLAGS(sv) |= SvMAGICAL(osv); + SvFLAGS(sv) |= SvMAGICAL(osv) | SvREADONLY(osv); /* XXX SvMAGIC() is *shared* between osv and sv. This can * lead to coredumps when both SVs are destroyed without one * of their SvMAGIC() slots being NULLed. */ diff --git a/t/op/local.t b/t/op/local.t index 1bb8b8ac1b..5a5b7ee552 100755 --- a/t/op/local.t +++ b/t/op/local.t @@ -1,6 +1,6 @@ #!./perl -print "1..75\n"; +print "1..78\n"; sub foo { local($a, $b) = @_; @@ -257,3 +257,17 @@ print "not " if exists $h{'y'}; print "ok 72\n"; print "not " if exists $h{'z'}; print "ok 73\n"; print "not " if exists $ENV{_A_}; print "ok 74\n"; print "not " if exists $ENV{_B_}; print "ok 75\n"; + +# local() and readonly magic variables + +eval { local $1 = 1 }; +print "not " if $@ !~ /Modification of a read-only value attempted/; +print "ok 76\n"; + +eval { for ($1) { local $_ = 1 } }; +print "not " if $@ !~ /Modification of a read-only value attempted/; +print "ok 77\n"; + +eval { for ($1) { local $_ = 1 } }; +print "not " if $@; +print "ok 78\n"; |