+is($x, "\x{100}\x{200}\xFFb");
+
+# [perl #20933]
+{
+ my $s = "ab";
+ my @r;
+ $r[$_] = \ substr $s, $_, 1 for (0, 1);
+ is(join("", map { $$_ } @r), "ab");
+}
+
+# [perl #23207]
+{
+ sub ss {
+ substr($_[0],0,1) ^= substr($_[0],1,1) ^=
+ substr($_[0],0,1) ^= substr($_[0],1,1);
+ }
+ my $x = my $y = 'AB'; ss $x; ss $y;
+ is($x, $y);
+}
+
+# [perl #24605]
+{
+ my $x = "0123456789\x{500}";
+ my $y = substr $x, 4;
+ is(substr($x, 7, 1), "7");
+}
+
+# multiple assignments to lvalue [perl #24346]
+{
+ my $x = "abcdef";
+ for (substr($x,1,3)) {
+ is($_, 'bcd');
+ $_ = 'XX';
+ is($_, 'XX');
+ is($x, 'aXXef');
+ $_ = "\xFF";
+ is($_, "\xFF");
+ is($x, "a\xFFef");
+ $_ = "\xF1\xF2\xF3\xF4\xF5\xF6";
+ is($_, "\xF1\xF2\xF3\xF4\xF5\xF6");
+ is($x, "a\xF1\xF2\xF3\xF4\xF5\xF6ef");
+ $_ = 'YYYY';
+ is($_, 'YYYY');
+ is($x, 'aYYYYef');
+ }
+ $x = "abcdef";
+ for (substr($x,1)) {
+ is($_, 'bcdef');
+ $_ = 'XX';
+ is($_, 'XX');
+ is($x, 'aXX');
+ $x .= "frompswiggle";
+ is $_, "XXfrompswiggle";
+ }
+ $x = "abcdef";
+ for (substr($x,1,-1)) {
+ is($_, 'bcde');
+ $_ = 'XX';
+ is($_, 'XX');
+ is($x, 'aXXf');
+ $x .= "frompswiggle";
+ is $_, "XXffrompswiggl";
+ }
+ $x = "abcdef";
+ for (substr($x,-5,3)) {
+ is($_, 'bcd');
+ $_ = 'XX'; # now $_ is substr($x, -4, 2)
+ is($_, 'XX');
+ is($x, 'aXXef');
+ $x .= "frompswiggle";
+ is $_, "gg";
+ }
+ $x = "abcdef";
+ for (substr($x,-5)) {
+ is($_, 'bcdef');
+ $_ = 'XX'; # now substr($x, -2)
+ is($_, 'XX');
+ is($x, 'aXX');
+ $x .= "frompswiggle";
+ is $_, "le";
+ }
+ $x = "abcdef";
+ for (substr($x,-5,-1)) {
+ is($_, 'bcde');
+ $_ = 'XX'; # now substr($x, -3, -1)
+ is($_, 'XX');
+ is($x, 'aXXf');
+ $x .= "frompswiggle";
+ is $_, "gl";
+ }
+}
+
+# Also part of perl #24346; scalar(substr...) should not affect lvalueness
+{
+ my $str = "abcdef";
+ sub { $_[0] = 'dea' }->( scalar substr $str, 3, 2 );
+ is $str, 'abcdeaf', 'scalar does not affect lvalueness of substr';
+}
+
+# [perl #24200] string corruption with lvalue sub
+
+{
+ sub bar: lvalue { substr $krunch, 0 }
+ bar = "XXX";
+ is(bar, 'XXX');
+ $krunch = '123456789';
+ is(bar, '123456789');
+}
+
+# [perl #29149]
+{
+ my $text = "0123456789\xED ";
+ utf8::upgrade($text);
+ my $pos = 5;
+ pos($text) = $pos;
+ my $a = substr($text, $pos, $pos);
+ is(substr($text,$pos,1), $pos);
+
+}
+
+# [perl #23765]
+{
+ my $a = pack("C", 0xbf);
+ substr($a, -1) &= chr(0xfeff);
+ is($a, "\xbf");
+}
+
+# [perl #34976] incorrect caching of utf8 substr length
+{
+ my $a = "abcd\x{100}";
+ is(substr($a,1,2), 'bc');
+ is(substr($a,1,1), 'b');
+}
+
+# [perl #62646] offsets exceeding 32 bits on 64-bit system
+SKIP: {
+ skip("32-bit system", 24) unless ~0 > 0xffffffff;
+ my $a = "abc";
+ my $s;
+ my $r;
+
+ utf8::downgrade($a);
+ for (1..2) {
+ $w = 0;
+ $r = substr($a, 0xffffffff, 1);
+ is($r, undef);
+ is($w, 1);
+
+ $w = 0;
+ $r = substr($a, 0xffffffff+1, 1);
+ is($r, undef);
+ is($w, 1);
+
+ $w = 0;
+ ok( !eval { $r = substr($s=$a, 0xffffffff, 1, "_"); 1 } );
+ is($r, undef);
+ is($s, $a);
+ is($w, 0);
+
+ $w = 0;
+ ok( !eval { $r = substr($s=$a, 0xffffffff+1, 1, "_"); 1 } );
+ is($r, undef);
+ is($s, $a);
+ is($w, 0);
+
+ utf8::upgrade($a);
+ }
+}
+
+}
+