8 sub a : lvalue { my $a = 34; ${\(bless \$a)} } # Return a temporary
9 sub b : lvalue { ${\shift} }
11 my $out = a(b()); # Check that temporaries are allowed.
12 is(ref $out, 'main'); # Not reached if error.
14 my @out = grep /main/, a(b()); # Check that temporaries are allowed.
15 cmp_ok(scalar @out, '==', 1); # Not reached if error.
19 # Check that we can return localized values from subroutines:
21 sub in : lvalue { $in = shift; }
22 sub neg : lvalue { #(num_str) return num_str
32 sub get_lex : lvalue { $in }
33 sub get_st : lvalue { $blah }
34 sub id : lvalue { ${\shift} }
35 sub id1 : lvalue { $_[0] }
36 sub inc : lvalue { ${\++$_[0]} }
43 cmp_ok($blah, '==', 7);
51 cmp_ok($blah, '==', 8);
59 cmp_ok($blah, '==', 10);
63 cmp_ok($in, '==', 10);
67 cmp_ok($blah, '==', 11);
71 cmp_ok($in, '==', 11);
75 cmp_ok($blah, '==', 20);
79 cmp_ok($in, '==', 20);
83 cmp_ok($blah, '==', 21);
87 cmp_ok($in, '==', 21);
91 cmp_ok($blah, '==', 22);
95 cmp_ok($in, '==', 22);
99 cmp_ok($blah, '==', 23);
103 cmp_ok($in, '==', 23);
105 ++inc(id1(id(get_st)));
107 cmp_ok($blah, '==', 25);
109 ++inc(id1(id(get_lex)));
111 cmp_ok($in, '==', 25);
115 $#c = 3; # These slots are not fillable.
117 # Explanation: empty slots contain &sv_undef.
119 =for disabled constructs
127 eval <<'EOE' or $_ = $@;
128 ($x, a3, $y, b2, $z, c4, $t) = (34 .. 78);
132 #@out = ($x, a3, $y, b2, $z, c4, $t);
133 #@in = (34 .. 41, (undef) x 4, 46);
134 #print "# `@out' ne `@in'\nnot " unless "@out" eq "@in";
136 like($_, qr/Can\'t return an uninitialized value from lvalue subroutine/);
144 sub a::var : lvalue { $var }
148 cmp_ok($var, '==', 45);
151 $o = bless \$oo, "a";
155 cmp_ok($var, '==', 47);
157 sub o : lvalue { $o }
161 cmp_ok($var, '==', 49);
163 sub nolv () { $x0, $x1 } # Not lvalue
167 eval <<'EOE' or $_ = $@;
172 like($_, qr/Can\'t modify non-lvalue subroutine call in scalar assignment/);
176 eval <<'EOE' or $_ = $@;
181 like($_, qr/Can\'t modify non-lvalue subroutine call in scalar assignment/);
185 eval <<'EOE' or $_ = $@;
190 like($_, qr/Can\'t modify non-lvalue subroutine call in scalar assignment/);
192 $x0 = $x1 = $_ = undef;
195 eval <<'EOE' or $_ = $@;
196 $nolv->() = (2,3) if $_;
200 ok(!defined $_) or diag "'$_', '$x0', '$x1'";
202 $x0 = $x1 = $_ = undef;
205 eval <<'EOE' or $_ = $@;
210 like($_, qr/Can\'t modify non-lvalue subroutine call/)
211 or diag "'$_', '$x0', '$x1'";
214 sub rlv0 : lvalue { return }
217 eval <<'EOE' or $_ = $@;
222 like($_, qr/Can't return undef from lvalue subroutine/);
225 eval <<'EOE' or $_ = $@;
230 like($_, qr/Can't return undef from lvalue subroutine/,
231 'explicit return of nothing in scalar context');
234 eval <<'EOE' or $_ = $@;
239 ok(!defined $_) or diag $_;
242 eval <<'EOE' or $_ = $@;
247 ok(!defined $_, 'explicit return of nothing in list context') or diag $_;
250 (lv0($a,$b)) = (3,4);
251 is +($a//'undef') . ($b//'undef'), 'undefundef',
252 'list assignment to empty lvalue sub';
255 sub lv1u :lvalue { undef }
256 sub rlv1u :lvalue { undef }
259 eval <<'EOE' or $_ = $@;
264 like($_, qr/Can't return undef from lvalue subroutine/);
267 eval <<'EOE' or $_ = $@;
272 like($_, qr/Can't return undef from lvalue subroutine/,
273 'explicitly returning undef in scalar context');
276 eval <<'EOE' or $_ = $@;
281 ok(!defined, 'implicitly returning undef in list context');
284 eval <<'EOE' or $_ = $@;
289 ok(!defined, 'explicitly returning undef in list context');
294 eval <<'EOE' or $_ = $@;
295 sub lv1t : lvalue { index $x, 2 }
300 like($_, qr/Can\'t return a temporary from lvalue subroutine/);
303 eval <<'EOE' or $_ = $@;
304 sub rlv1t : lvalue { index $x, 2 }
309 like($_, qr/Can\'t return a temporary from lvalue subroutine/,
310 'returning a PADTMP explicitly');
313 eval <<'EOE' or $_ = $@;
318 like($_, qr/Can\'t return a temporary from lvalue subroutine/,
319 'returning a PADTMP explicitly (list context)');
322 sub lv2t : lvalue { shift }
327 sub xxx () { $xxx } # Not lvalue
330 eval <<'EOE' or $_ = $@;
331 sub lv1tmp : lvalue { xxx } # is it a TEMP?
336 is($_, undef, "returning a temp from an lvalue sub in scalar context");
339 eval <<'EOE' or $_ = $@;
344 is($_, undef, "returning a temp from an lvalue sub in list context");
346 sub yyy () { 'yyy' } # Const, not lvalue
349 eval <<'EOE' or $_ = $@;
350 sub lv1tmpr : lvalue { yyy } # is it read-only?
355 like($_, qr/Can\'t return a readonly value from lvalue subroutine at/);
358 eval <<'EOE' or $_ = $@;
363 like($_, qr/Can\'t return a readonly value from lvalue subroutine/);
365 sub lva : lvalue {@a}
370 eval <<'EOE' or $_ = $@;
375 is("'@a' $_", "'2 3' ");
381 eval <<'EOE' or $_ = $@;
386 is("'@a' $_", "'2 3' ");
388 is lva->${\sub { return $_[0] }}, 2,
389 'lvalue->$thing when lvalue returns array';
391 my @my = qw/ a b c /;
392 sub lvmya : lvalue { @my }
394 is lvmya->${\sub { return $_[0] }}, 3,
395 'lvalue->$thing when lvalue returns lexical array';
397 sub lv1n : lvalue { $newvar }
400 eval <<'EOE' or $_ = $@;
405 is("'$newvar' $_", "'4' ");
407 sub lv1nn : lvalue { $nnewvar }
410 eval <<'EOE' or $_ = $@;
415 is("'$nnewvar' $_", "'3' ");
421 eval 'sub AUTOLOAD : lvalue { $newvar }';
427 sub alv : lvalue { $array[1] }
428 sub alv2 : lvalue { $array[$_[0]] }
429 sub hlv : lvalue { $hash{"foo"} }
430 sub hlv2 : lvalue { $hash{$_[0]} }
431 $array[1] = "not ok 51\n";
433 is(alv(), "ok 50\n");
435 alv2(20) = "ok 51\n";
436 is($array[20], "ok 51\n");
438 $hash{"foo"} = "not ok 52\n";
440 is($hash{foo}, "ok 52\n");
442 $hash{bar} = "not ok 53\n";
443 hlv("bar") = "ok 53\n";
444 is(hlv("bar"), "ok 53\n");
446 sub array : lvalue { @array }
447 sub array2 : lvalue { @array2 } # This is a global.
448 sub hash : lvalue { %hash }
449 sub hash2 : lvalue { %hash2 } # So's this.
450 @array2 = qw(foo bar);
451 %hash2 = qw(foo bar);
453 (array()) = qw(ok 54);
454 is("@array", "ok 54");
456 (array2()) = qw(ok 55);
457 is("@array2", "ok 55");
459 (hash()) = qw(ok 56);
460 cmp_ok($hash{ok}, '==', 56);
462 (hash2()) = qw(ok 57);
463 cmp_ok($hash2{ok}, '==', 57);
465 @array = qw(a b c d);
466 sub aslice1 : lvalue { @array[0,2] };
467 (aslice1()) = ("ok", "already");
468 is("@array", "ok b already d");
470 @array2 = qw(a B c d);
471 sub aslice2 : lvalue { @array2[0,2] };
472 (aslice2()) = ("ok", "already");
473 is("@array2", "ok B already d");
475 %hash = qw(a Alpha b Beta c Gamma);
476 sub hslice : lvalue { @hash{"c", "b"} }
477 (hslice()) = ("CISC", "BogoMIPS");
478 is(join("/",@hash{"c","a","b"}), "CISC/Alpha/BogoMIPS");
481 $str = "Hello, world!";
482 sub sstr : lvalue { substr($str, 1, 4) }
484 is($str, "Hi, world!");
486 $str = "Made w/ JavaScript";
487 sub veclv : lvalue { vec($str, 2, 32) }
488 if (ord('A') != 193) {
489 veclv() = 0x5065726C;
492 veclv() = 0xD7859993;
494 is($str, "Made w/ PerlScript");
496 sub position : lvalue { pos }
498 $_ = "fee fi fo fum";
505 sub keeze : lvalue { keys %__ }
508 is scalar %__, '1/64', 'keys assignment through lvalue sub';
510 # Bug 20001223.002: split thought that the list had only one element
512 sub lval1 : lvalue { $ary[0]; }
513 sub lval2 : lvalue { $ary[1]; }
514 (lval1(), lval2()) = split ' ', "1 2 3 4";
516 is(join(':', @ary), "1:2:6");
518 # check that an element of a tied hash/array can be assigned to via lvalueness
523 sub TIEHASH { bless \my $v => __PACKAGE__ }
524 sub STORE { ($key, $val) = @_[1,2] }
527 sub lval_tie_hash : lvalue {
528 tie my %t => 'Tie_Hash';
532 eval { lval_tie_hash() = "value"; };
534 is($@, "", "element of tied hash");
536 is("$Tie_Hash::key-$Tie_Hash::val", "key-value");
542 sub TIEARRAY { bless \my $v => __PACKAGE__ }
543 sub STORE { $val[ $_[1] ] = $_[2] }
546 sub lval_tie_array : lvalue {
547 tie my @t => 'Tie_Array';
551 eval { lval_tie_array() = "value"; };
554 is($@, "", "element of tied array");
556 is ($Tie_Array::val[0], "value");
559 # Check that tied pad vars that are returned can be assigned to
560 sub TIESCALAR { bless [] }
561 sub STORE {$wheel = $_[1]}
563 sub tied_pad_var :lvalue { tie my $tyre, ''; $tyre }
564 sub tied_pad_varr :lvalue { tie my $tyre, ''; return $tyre }
566 is $wheel, 1, 'tied pad var returned in scalar lvalue context';
567 tied_pad_var->${\sub{ $_[0] = 2 }};
568 is $wheel, 2, 'tied pad var returned in scalar ref context';
570 is $wheel, 3, 'tied pad var returned in list lvalue context';
571 $_ = 4 for tied_pad_var;
572 is $wheel, 4, 'tied pad var returned in list ref context';
574 is $wheel, 5, 'tied pad var explicitly returned in scalar lvalue context';
575 tied_pad_varr->${\sub{ $_[0] = 6 }};
576 is $wheel, 6, 'tied pad var explicitly returned in scalar ref context';
578 is $wheel, 7, 'tied pad var explicitly returned in list lvalue context';
579 $_ = 8 for tied_pad_varr;
580 is $wheel, 8, 'tied pad var explicitly returned in list ref context';
583 # Test explicit return of lvalue expression
585 # subs are copies from tests 1-~18 with an explicit return added.
586 # They used not to work, which is why they are ‘badly’ named.
587 sub bad_get_lex : lvalue { return $in };
588 sub bad_get_st : lvalue { return $blah }
590 sub bad_id : lvalue { return ${\shift} }
591 sub bad_id1 : lvalue { return $_[0] }
592 sub bad_inc : lvalue { return ${\++$_[0]} }
607 is($blah, 8, "yada");
610 cmp_ok($in, '==', 8);
612 bad_id(bad_get_st) = 10;
613 cmp_ok($blah, '==', 10);
615 bad_id(bad_get_lex) = 10;
616 cmp_ok($in, '==', 10);
618 ++bad_id(bad_get_st);
619 cmp_ok($blah, '==', 11);
621 ++bad_id(bad_get_lex);
622 cmp_ok($in, '==', 11);
624 bad_id1(bad_get_st) = 20;
625 cmp_ok($blah, '==', 20);
627 bad_id1(bad_get_lex) = 20;
628 cmp_ok($in, '==', 20);
630 ++bad_id1(bad_get_st);
631 cmp_ok($blah, '==', 21);
633 ++bad_id1(bad_get_lex);
634 cmp_ok($in, '==', 21);
637 cmp_ok($blah, '==', 22);
639 bad_inc(bad_get_lex);
640 cmp_ok($in, '==', 22);
642 bad_inc(bad_id(bad_get_st));
643 cmp_ok($blah, '==', 23);
645 bad_inc(bad_id(bad_get_lex));
646 cmp_ok($in, '==', 23);
648 ++bad_inc(bad_id1(bad_id(bad_get_st)));
649 cmp_ok($blah, '==', 25);
651 ++bad_inc(bad_id1(bad_id(bad_get_lex)));
652 cmp_ok($in, '==', 25);
658 my $depth = shift//0;
659 if ($depth == 2) { return $to_modify }
660 return &$r($depth+1);
663 is $to_modify, 7, 'recursive lvalue sub';
665 # Recursive with substr [perl #72706]
670 return &$pie($depth) if $depth--;
673 for my $depth (0, 1, 2) {
674 my $value = "Good $depth";
676 &$pie($depth) = $value;
678 is($@, '', "recursive lvalue substr return depth $depth");
680 "value assigned to recursive lvalue substr (depth $depth)");
685 my @arr = qw /one two three/;
687 sub lval_array () : lvalue {@arr}
693 is($line, "zeroonetwothree");
695 sub trythislval { scalar(@_)."x".join "", @_ }
696 is(trythislval(lval_array()), "3xonetwothree");
698 sub changeme { $_[2] = "free" }
699 changeme(lval_array);
700 is("@arr", "one two free");
702 # test again, with explicit return
703 sub rlval_array() : lvalue {return @arr}
704 @arr = qw /one two three/;
709 is($line, "zeroonetwothree");
710 is(trythislval(rlval_array()), "3xonetwothree");
711 changeme(rlval_array);
712 is("@arr", "one two free");
714 # Variations on the same theme, with multiple vars returned
716 sub lval_scalar_array () : lvalue { $scalar, @arr }
717 @arr = qw /one two three/;
719 for (lval_scalar_array) {
722 is($line, "zerohalfonetwothree");
723 is(trythislval(lval_scalar_array()), "4xhalfonetwothree");
724 changeme(lval_scalar_array);
725 is("@arr", "one free three");
727 sub lval_array_scalar () : lvalue { @arr, $scalar }
728 @arr = qw /one two three/;
731 for (lval_array_scalar) {
734 is($line, "zeroonetwothreefour");
735 is(trythislval(lval_array_scalar()), "4xonetwothreefour");
736 changeme(lval_array_scalar);
737 is("@arr", "one two free");
739 # Tests for specific ops not tested above
741 @array2 = qw 'one two free';
742 is join(',', map $_, sub:lvalue{@array2}->()), 'one,two,free',
743 'rv2av in reference context';
744 is join(',', map $_, sub:lvalue{@{\@array2}}->()), 'one,two,free',
745 'rv2av-with-ref in reference context';
747 my %hash = qw[a b c d];
748 like join(',', map $_, sub:lvalue{%hash}->()),
749 qr/^(?:a,b,c,d|c,d,a,b)\z/, 'padhv in reference context';
751 %hash2 = qw[a b c d];
752 like join(',', map $_, sub:lvalue{%hash2}->()),
753 qr/^(?:a,b,c,d|c,d,a,b)\z/, 'rv2hv in reference context';
754 like join(',', map $_, sub:lvalue{%{\%hash2}}->()),
755 qr/^(?:a,b,c,d|c,d,a,b)\z/, 'rv2hv-with-ref in reference context';
760 sub AUTOLOAD :lvalue { *{$AUTOLOAD} };
762 my $foo = bless {},"Foo";
764 $foo->bar = sub { $result = "bar" };
766 is ($result, 'bar', "RT #41550");
769 SKIP: { skip 'no attributes.pm', 1 unless eval 'require attributes';
770 fresh_perl_is(<<'----', <<'====', "lvalue can not be set after definition. [perl #68758]");
775 sub MODIFY_CODE_ATTRIBUTES {}
776 sub foo : lvalue : fr0g;
779 lvalue attribute ignored after the subroutine has been defined at - line 4.
780 lvalue attribute ignored after the subroutine has been defined at - line 6.
781 Can't modify non-lvalue subroutine call in scalar assignment at - line 7, near "3;"
782 Execution of - aborted due to compilation errors.
788 sub lval_decl : lvalue;
791 is($x, 5, "subroutine declared with lvalue before definition retains lvalue. [perl #68758]");
794 SKIP: { skip "no attributes.pm", 2 unless eval { require attributes };
795 sub utf8::valid :lvalue;
797 is "@{[ &attributes::get(\&utf8::valid) ]}", 'lvalue',
798 'sub declaration with :lvalue applies it to XSUBs';
800 BEGIN { *wonky = \&marjibberous }
802 is "@{[ &attributes::get(\&wonky) ]}", 'lvalue',
803 'sub declaration with :lvalue applies it to assigned stub';
806 sub fleen : lvalue { $pnare }
807 $pnare = __PACKAGE__;
808 ok eval { fleen = 1 }, "lvalues can return COWs (CATTLE?) [perl #75656]";\
809 is $pnare, 1, 'and returning CATTLE actually works';
810 $pnare = __PACKAGE__;
811 ok eval { (fleen) = 1 }, "lvalues can return COWs in list context";
812 is $pnare, 1, 'and returning COWs in list context actually works';
813 $pnare = __PACKAGE__;
814 ok eval { $_ = 1 for(fleen); 1 }, "lvalues can return COWs in ref cx";
815 is $pnare, 1, 'and returning COWs in reference context actually works';
818 # Returning an arbitrary expression, not necessarily lvalue
819 +sub :lvalue { return $ambaga || $ambaga }->() = 73;
820 is $ambaga, 73, 'explicit return of arbitrary expression (scalar context)';
821 (sub :lvalue { return $ambaga || $ambaga }->()) = 74;
822 is $ambaga, 74, 'explicit return of arbitrary expression (list context)';
823 +sub :lvalue { $ambaga || $ambaga }->() = 73;
824 is $ambaga, 73, 'implicit return of arbitrary expression (scalar context)';
825 (sub :lvalue { $ambaga || $ambaga }->()) = 74;
826 is $ambaga, 74, 'implicit return of arbitrary expression (list context)';
827 eval { +sub :lvalue { return 3 }->() = 4 };
828 like $@, qr/Can\'t return a readonly value from lvalue subroutine at/,
829 'assignment to numeric constant explicitly returned from lv sub';
830 eval { (sub :lvalue { return 3 }->()) = 4 };
831 like $@, qr/Can\'t return a readonly value from lvalue subroutine at/,
832 'assignment to num constant explicitly returned (list cx)';
833 eval { +sub :lvalue { 3 }->() = 4 };
834 like $@, qr/Can\'t return a readonly value from lvalue subroutine at/,
835 'assignment to numeric constant implicitly returned from lv sub';
836 eval { (sub :lvalue { 3 }->()) = 4 };
837 like $@, qr/Can\'t return a readonly value from lvalue subroutine at/,
838 'assignment to num constant implicitly returned (list cx)';
840 # reference (potential lvalue) context
842 for my $sub (sub :lvalue {$_}, sub :lvalue {return $_}) {
843 &$sub()->${\sub { $_[0] = 37 }};
844 is $_, '37', 'lvalue->method'.$suffix;
845 ${\scalar &$sub()} = 38;
846 is $_, '38', 'scalar(lvalue)'.$suffix;
847 sub assign39_with_proto ($) { $_[0] = 39 }
848 assign39_with_proto(&$sub());
849 is $_, '39', 'func(lvalue) when func has $ proto'.$suffix;
851 ${\(&$sub()||undef)} = 40;
852 is $_, '40', 'lvalue||...'.$suffix;
853 ${\(${\undef}||&$sub())} = 41; # extra ${\...} to bypass const folding
854 is $_, '41', '...||lvalue'.$suffix;
856 ${\(&$sub()&&undef)} = 42;
857 is $_, '42', 'lvalue&&...'.$suffix;
858 ${\(${\1}&&&$sub())} = 43;
859 is $_, '43', '...&&lvalue'.$suffix;
860 ${\(&$sub())[0]} = 44;
861 is $_, '44', '(lvalue)[0]'.$suffix;
863 continue { $suffix = ' (explicit return)' }
867 for my $sub (sub :lvalue {$_}, sub :lvalue {return $_}) {
870 is $_->[3], 4, 'func->[...] autovivification'.$suffix;
873 is $_->{3}, 4, 'func->{...} autovivification'.$suffix;
876 is $$_, 4, '${func()} autovivification' .$suffix;
879 is "@$_", 4, '@{func()} autovivification' .$suffix;
882 is join('-',%$_), '4-5', '%{func()} autovivification'.$suffix;
884 continue { $suffix = ' (explicit return)' }
886 # [perl #92406] [perl #92290] Returning a pad var in rvalue context
889 sub :lvalue { my $x = 72; $x },
890 sub :lvalue { my $x = 72; return $x }
892 is scalar(&$sub), 72, "sub returning pad var in scalar context$suffix";
893 is +(&$sub)[0], 72, "sub returning pad var in list context$suffix";
895 continue { $suffix = ' (explicit return)' }
897 # Returning read-only values in reference context
900 sub :lvalue { $] }->(),
901 sub :lvalue { return $] }->()
903 is \$_, \$], 'read-only values are returned in reference context'
904 .$suffix # (they used to be copied)
906 continue { $suffix = ' (explicit return)' }
908 # Returning unwritables from nested lvalue sub call in in rvalue context
909 # First, ensure we are testing what we think we are:
910 if (!Internals::SvREADONLY($])) { Internals::SvREADONLY($],1); }
911 sub squibble : lvalue { return $] }
912 sub squebble : lvalue { squibble }
913 sub squabble : lvalue { return squibble }
914 is $x = squebble, $], 'returning ro from nested lv sub call in rv cx';
915 is $x = squabble, $], 'explct. returning ro from nested lv sub in rv cx';
916 is \squebble, \$], 'returning ro from nested lv sub call in ref cx';
917 is \squabble, \$], 'explct. returning ro from nested lv sub in ref cx';