[perl #131627] Fix multideref for $x{qw/a/->$*}
authorDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Thu, 22 Jun 2017 19:41:58 +0000 (20:41 +0100)
committerDagfinn Ilmari Mannsåker <ilmari@ilmari.org>
Thu, 22 Jun 2017 20:42:37 +0000 (21:42 +0100)
qw// sets OPf_PARENS on the OP_CONST it generates, which persists when
->$* turns it into an OP_GV.

This used to cause an assertion failure on debugging builds, and didn't
get the multideref optimisation on non-debugging.

op.c
t/op/multideref.t

diff --git a/op.c b/op.c
index 23e1640..83c1af8 100644 (file)
--- a/op.c
+++ b/op.c
@@ -13085,9 +13085,9 @@ S_maybe_multideref(pTHX_ OP *start, OP *orig_o, UV orig_action, U8 hints)
                 case OP_GV:
                     /* it may be a package var index */
 
-                    ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_SPECIAL)));
+                    ASSUME(!(o->op_flags & ~(OPf_WANT|OPf_PARENS|OPf_SPECIAL)));
                     ASSUME(!(o->op_private & ~(OPpEARLY_CV)));
-                    if (  (o->op_flags &~ OPf_SPECIAL) != OPf_WANT_SCALAR
+                    if (  (o->op_flags & ~(OPf_PARENS|OPf_SPECIAL)) != OPf_WANT_SCALAR
                         || o->op_private != 0
                     )
                         break;
index 199e523..20ba1ca 100644 (file)
@@ -18,7 +18,7 @@ BEGIN {
 use warnings;
 use strict;
 
-plan 62;
+plan 63;
 
 
 # check that strict refs hint is handled
@@ -223,3 +223,13 @@ sub defer {}
     ok !defined $x[0][0],"RT #130727 part 2: array not autovivified";
 
 }
+
+# RT #131627: assertion failure on OPf_PAREN on OP_GV
+{
+    my @x = (10..12);
+    our $rt131627 = 1;
+
+    no strict qw(refs vars);
+    is $x[qw(rt131627)->$*], 11, 'RT #131627: $a[qw(var)->$*]';
+}
+