This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
warn on $a.$b.$c in void context
authorZefram <zefram@fysh.org>
Thu, 14 Dec 2017 04:23:58 +0000 (04:23 +0000)
committerZefram <zefram@fysh.org>
Thu, 14 Dec 2017 04:23:58 +0000 (04:23 +0000)
$a.$b.$c gets transformed early on to execute as ($a.$b).=$c, which didn't
warn about void context becuase .= looks like a useful side effect.
Happily, the recently-added OPpCONCAT_NESTED flag identifies that this
has happened.  Make scalarvoid() pay attention to this flag when a concat
op is put into void context.  Fixes [perl #6997]

op.c
t/lib/warnings/op

diff --git a/op.c b/op.c
index 74de752..402c6f1 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1949,6 +1949,11 @@ Perl_scalarvoid(pTHX_ OP *arg)
             if (o->op_type == OP_REPEAT)
                 scalar(cBINOPo->op_first);
             goto func_ops;
+       case OP_CONCAT:
+            if ((o->op_flags & OPf_STACKED) &&
+                   !(o->op_private & OPpCONCAT_NESTED))
+                break;
+           goto func_ops;
         case OP_SUBSTR:
             if (o->op_private == 4)
                 break;
index ead60ad..b28c4e9 100644 (file)
@@ -2065,3 +2065,12 @@ use warnings;
 $_="3.14159";
 tr/0-9/\x{6F0}-\x{6F9}/;
 EXPECT
+########
+# Useless use of concatenation should appear for any number of args
+use warnings;
+($a, $b, $c) = (42)x3;
+$a.$b;
+$a.$b.$c;
+EXPECT
+Useless use of concatenation (.) or string in void context at - line 4.
+Useless use of concatenation (.) or string in void context at - line 5.