Make scalar() propagate lvalueness
authorFather Chrysostomos <sprout@cpan.org>
Tue, 13 Dec 2011 06:29:39 +0000 (22:29 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 13 Dec 2011 16:53:45 +0000 (08:53 -0800)
As mentioned in ticket #24346, scalar() should not change lvalueness.
The fact that it did was a side effect of the implementation and a
bug.  foo(scalar substr(....)) should pass a substr lvalue to foo just
as it would without scalar() or with a $ prototype (which is meant to
be equivalent to scalar()).

This also makes it possible to force scalar context in list assignment
to lvalue subroutines, as in (foo(), scalar bar()) = @list.

op.c
t/op/substr.t

diff --git a/op.c b/op.c
index 718f0e6..2cd3e44 100644 (file)
--- a/op.c
+++ b/op.c
@@ -2001,6 +2001,7 @@ Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags)
        else if (!(o->op_flags & OPf_KIDS))
            break;
        if (o->op_targ != OP_LIST) {
+    case OP_SCALAR:
            op_lvalue(cBINOPo->op_first, type);
            break;
        }
index ceacdf6..abd5d7f 100644 (file)
@@ -23,7 +23,7 @@ $SIG{__WARN__} = sub {
 
 BEGIN { require './test.pl'; }
 
-plan(381);
+plan(382);
 
 run_tests() unless caller;
 
@@ -684,6 +684,13 @@ is($x, "\x{100}\x{200}\xFFb");
     }
 }
 
+# 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
 
 {