jvdias 0833027
--- perl-5.8.8/t/op/local.t.U27914	2006-01-03 10:11:35.000000000 -0500
jvdias 0833027
+++ perl-5.8.8/t/op/local.t	2006-06-01 19:49:54.000000000 -0400
jvdias 0833027
@@ -4,7 +4,7 @@
jvdias 0833027
     chdir 't' if -d 't';
jvdias 0833027
     require './test.pl';
jvdias 0833027
 }
jvdias 0833027
-plan tests => 81;
jvdias 0833027
+plan tests => 85;
jvdias 0833027
 
jvdias 0833027
 my $list_assignment_supported = 1;
jvdias 0833027
 
jvdias 0833027
@@ -313,3 +313,19 @@
jvdias 0833027
     { local @x{c,d,e}; }
jvdias 0833027
     ok(! exists $x{c});
jvdias 0833027
 }
jvdias 0833027
+
jvdias 0833027
+# local() and readonly magic variables
jvdias 0833027
+
jvdias 0833027
+eval { local $1 = 1 };
jvdias 0833027
+like($@, qr/Modification of a read-only value attempted/);
jvdias 0833027
+
jvdias 0833027
+eval { for ($1) { local $_ = 1 } };
jvdias 0833027
+like($@, qr/Modification of a read-only value attempted/);
jvdias 0833027
+
jvdias 0833027
+# make sure $1 is still read-only
jvdias 0833027
+eval { for ($1) { local $_ = 1 } };
jvdias 0833027
+is($@, "");
jvdias 0833027
+
jvdias 0833027
+# The s/// adds 'g' magic to $_, but it should remain non-readonly
jvdias 0833027
+eval { for("a") { for $x (1,2) { local $_="b"; s/(.*)/+$1/ } } };
jvdias 0833027
+is($@, "");
jvdias 0833027
--- perl-5.8.8/scope.c.U27914	2005-09-30 09:56:51.000000000 -0400
jvdias 0833027
+++ perl-5.8.8/scope.c	2006-06-01 19:49:54.000000000 -0400
jvdias 0833027
@@ -205,9 +205,9 @@
jvdias 0833027
     register SV * const sv = *sptr = NEWSV(0,0);
jvdias 0833027
 
jvdias 0833027
     if (SvTYPE(osv) >= SVt_PVMG && SvMAGIC(osv) && SvTYPE(osv) != SVt_PVGV) {
jvdias 0833027
+	MAGIC *mg;
jvdias 0833027
 	sv_upgrade(sv, SvTYPE(osv));
jvdias 0833027
 	if (SvGMAGICAL(osv)) {
jvdias 0833027
-	    MAGIC* mg;
jvdias 0833027
 	    const bool oldtainted = PL_tainted;
jvdias 0833027
 	    mg_get(osv);		/* note, can croak! */
jvdias 0833027
 	    if (PL_tainting && PL_tainted &&
jvdias 0833027
@@ -220,6 +220,16 @@
jvdias 0833027
 	    PL_tainted = oldtainted;
jvdias 0833027
 	}
jvdias 0833027
 	SvMAGIC_set(sv, SvMAGIC(osv));
jvdias 0833027
+	/* if it's a special scalar or if it has no 'set' magic,
jvdias 0833027
+	 * propagate the SvREADONLY flag. --rgs 20030922 */
jvdias 0833027
+	for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
jvdias 0833027
+	    if (mg->mg_type == '\0'
jvdias 0833027
+		    || !(mg->mg_virtual && mg->mg_virtual->svt_set))
jvdias 0833027
+	    {
jvdias 0833027
+		SvFLAGS(sv) |= SvREADONLY(osv);
jvdias 0833027
+		break;
jvdias 0833027
+	    }
jvdias 0833027
+	}
jvdias 0833027
 	SvFLAGS(sv) |= SvMAGICAL(osv);
jvdias 0833027
 	/* XXX SvMAGIC() is *shared* between osv and sv.  This can
jvdias 0833027
 	 * lead to coredumps when both SVs are destroyed without one