This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
make false whereso yield undef in scalar context
authorZefram <zefram@fysh.org>
Sat, 23 Dec 2017 05:47:55 +0000 (05:47 +0000)
committerZefram <zefram@fysh.org>
Sat, 23 Dec 2017 05:47:55 +0000 (05:47 +0000)
Fixes [perl #132634].

pp_ctl.c
t/op/whereis.t
t/op/whereso.t

index a0cb31c..a97761d 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -4616,8 +4616,11 @@ PP(pp_enterwhereso)
        to the op that follows the leavewhereso.
        RETURNOP calls PUTBACK which restores the stack pointer after the POPs.
     */
-    if (!SvTRUEx(POPs))
+    if (!SvTRUEx(POPs)) {
+       if (gimme == G_SCALAR)
+           PUSHs(&PL_sv_undef);
        RETURNOP(cLOGOP->op_other->op_next);
+    }
 
     cx = cx_pushblock(CXt_WHERESO, gimme, SP, PL_savestack_ix);
     cx_pushwhereso(cx);
index 522e7d8..c5bc778 100644 (file)
@@ -9,7 +9,7 @@ use strict;
 use warnings;
 no warnings qw(uninitialized experimental::smartmatch);
 
-plan tests => 19;
+plan tests => 21;
 
 foreach(3) {
     CORE::whereis(qr/\A3\z/) {
@@ -75,4 +75,14 @@ foreach my $matcher ($matchabc, $regexpabc) {
     }
 }
 
+foreach("xyz") {
+    no warnings "void";
+    my @a = (qw(a b c), do { whereis($matchabc) { qw(x y) } }, qw(d e f));
+    is join(",", map { $_ // "u" } @a), "a,b,c,d,e,f",
+       "list value of false whereis";
+    @a = (qw(a b c), scalar do { whereis($matchabc) { qw(x y) } }, qw(d e f));
+    is join(",", map { $_ // "u" } @a), "a,b,c,u,d,e,f",
+       "scalar value of false whereis";
+}
+
 1;
index 15d29a8..992ecf7 100644 (file)
@@ -10,7 +10,7 @@ use strict;
 use warnings;
 no warnings 'experimental::smartmatch';
 
-plan tests => 42;
+plan tests => 44;
 
 foreach(3) {
     CORE::whereso(3) {
@@ -204,4 +204,14 @@ $act = "";
 }
 is $act, "[a][c][d]";
 
+{
+    no warnings "void";
+    my @a = (qw(a b c), do { whereso(0) { qw(x y) } }, qw(d e f));
+    is join(",", map { $_ // "u" } @a), "a,b,c,d,e,f",
+       "list value of false whereso";
+    @a = (qw(a b c), scalar do { whereso(0) { qw(x y) } }, qw(d e f));
+    is join(",", map { $_ // "u" } @a), "a,b,c,u,d,e,f",
+       "scalar value of false whereso";
+}
+
 1;