This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix spurious 'Use of reference' warning
authorDavid Mitchell <davem@iabyn.com>
Wed, 10 Dec 2014 13:20:38 +0000 (13:20 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 10 Dec 2014 13:25:57 +0000 (13:25 +0000)
My recent OP_MULTIDEREF addition introduced a bug where, when
converting a constant array index into a UV, it checked for a ref
and issued a "Use of reference "HASH(0x7fd190915ba8)" as array index"
warning *before* it had confirmed that the OP_CONST was the only op in
the index expression. So things like

    use constant HASHREF => { a => 1 };
    () = $_[HASHREF->{a} ];

would generate two spurious warnings.

The fix is easy. Only test for the warning on the second pass;
we'll already have abandoned the optimisation attempt on the first pass
if the index expression isn't a simple constant.

op.c
t/lib/warnings/pp_hot

diff --git a/op.c b/op.c
index c168c64..cef99f2 100644 (file)
--- a/op.c
+++ b/op.c
@@ -12398,7 +12398,7 @@ S_maybe_multideref(pTHX_ OP *start, OP *orig_o, UV orig_action, U8 hints)
                     else {
                         /* it's a constant array index */
                         SV *ix_sv = cSVOPo->op_sv;
-                        if (UNLIKELY(SvROK(ix_sv) && !SvGAMAGIC(ix_sv)
+                        if (pass && UNLIKELY(SvROK(ix_sv) && !SvGAMAGIC(ix_sv)
                                                 && ckWARN(WARN_MISC)))
                         Perl_warner(aTHX_ packWARN(WARN_MISC),
                                 "Use of reference \"%"SVf"\" as array index",
index 4e63073..702df08 100644 (file)
@@ -343,3 +343,17 @@ print $x[$b];
 EXPECT
 OPTION regex
 Use of reference ".*" as array index at - line 7.
+########
+use warnings 'misc';
+use constant FOO => { a => 1 };
+() = $_[FOO->{a}];
+
+EXPECT
+########
+use warnings 'misc';
+use constant FOO => {};
+() = $_[FOO];
+
+EXPECT
+OPTION regex
+Use of reference "HASH\(0x\w+\)" as array index at - line 3.