This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
aelemfast_lex in aassign_common_vars_aliases_only
authorFather Chrysostomos <sprout@cpan.org>
Mon, 13 Oct 2014 21:48:13 +0000 (14:48 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 13 Oct 2014 21:48:31 +0000 (14:48 -0700)
S_aassign_common_vars_aliases_only needs to handle aelemfast_lex,
otherwise we miss some rare cases where we have aliased scalars and
elements on both sides of the assignment.

op.c
t/op/lvref.t

diff --git a/op.c b/op.c
index fdbc5ee..6d6b1a8 100644 (file)
--- a/op.c
+++ b/op.c
@@ -5994,6 +5994,7 @@ S_aassign_common_vars_aliases_only(pTHX_ OP *o)
        if ((curop->op_type == OP_PADSV ||
             curop->op_type == OP_PADAV ||
             curop->op_type == OP_PADHV ||
+            curop->op_type == OP_AELEMFAST_LEX ||
             curop->op_type == OP_PADANY)
           && PAD_COMPNAME_GEN(curop->op_targ) == PERL_INT_MAX)
            return TRUE;
index 747c127..d55ccd2 100644 (file)
@@ -4,7 +4,7 @@ BEGIN {
     set_up_inc("../lib");
 }
 
-plan 152;
+plan 153;
 
 eval '\$x = \$y';
 like $@, qr/^Experimental lvalue references not enabled/,
@@ -572,3 +572,18 @@ SKIP: {
     \($x) = \$y;
     goto do_test2;
 }
+{
+    my @a;
+    goto do_aliasing3;
+
+   do_test3:
+    @a[0,1] = qw<a b>;
+    my($y,$x) = ($a[0],$a[1]);
+    is "@a", 'b a',
+       'aelemfast_lex-to-scalar list assignment "before" aliasing';
+    last;
+
+   do_aliasing3:
+    \(@a) = \($x,$y);
+    goto do_test3;
+}