dVAR;
STRLEN len, lsv_len, oldtarglen, newtarglen;
const char * const tmps = SvPV_const(sv, len);
+ const char *targs;
SV * const lsv = LvTARG(sv);
STRLEN lvoff = LvTARGOFF(sv);
STRLEN lvlen = LvTARGLEN(sv);
Perl_ck_warner(aTHX_ packWARN(WARN_SUBSTR),
"Attempt to use reference as lvalue in substr"
);
- if (SvUTF8(lsv)) lsv_len = sv_len_utf8_nomg(lsv);
- else (void)SvPV_nomg(lsv,lsv_len);
+ targs = SvPV_nomg(lsv,lsv_len);
+ if (SvUTF8(lsv)) lsv_len = sv_or_pv_len_utf8(lsv,targs,lsv_len);
if (!translate_substr_offsets(
lsv_len,
negoff ? -(IV)lvoff : (IV)lvoff, !negoff,
BEGIN { require './test.pl'; }
-plan(381);
+plan(382);
run_tests() unless caller;
is($result_3363, "best", "ref-to-substr retains lvalue-ness under recursion [perl #3363]");
}
+
+# Test that UTF8-ness of magic var changing does not confuse substr lvalue
+# assignment.
+# We use overloading for our magic var, but a typeglob would work, too.
+package o {
+ use overload '""' => sub { $_[0][0] }
+}
+my $refee = bless ["\x{100}a"], o::;
+my $substr = \substr $refee, -2; # UTF8 flag still off for $$substr.
+$$substr = "b"; # UTF8 flag turns on when setsubstr
+is $refee, "b", # magic stringifies $$substr.
+ 'substr lvalue assignment when stringification turns on UTF8ness';