This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #78064] print(const || bare) and const folding
authorFather Chrysostomos <sprout@cpan.org>
Thu, 5 Jul 2012 01:22:09 +0000 (18:22 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 5 Jul 2012 01:25:25 +0000 (18:25 -0700)
Constant folding should not be able to change the meaning of print
followed by || or && or ?: with barewords as operands.

The previous commit recorded which constant ops are the result of con-
stant folding (including collapsing of conditionals).

This commit uses that information (OpCONST_FOLDED) to fix this.

op.c
t/comp/fold.t

diff --git a/op.c b/op.c
index e5707df..e353d5c 100644 (file)
--- a/op.c
+++ b/op.c
@@ -8821,7 +8821,8 @@ Perl_ck_listiob(pTHX_ OP *o)
     if (kid && o->op_flags & OPf_STACKED)
        kid = kid->op_sibling;
     else if (kid && !kid->op_sibling) {                /* print HANDLE; */
-       if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
+       if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE
+        && !(kid->op_private & OPpCONST_FOLDED)) {
            o->op_flags |= OPf_STACKED; /* make it a filehandle */
            kid = newUNOP(OP_RV2GV, OPf_REF, scalar(kid));
            cLISTOPo->op_first->op_sibling = kid;
index ec95f1a..69d1903 100644 (file)
@@ -4,7 +4,7 @@
 # we've not yet verified that use works.
 # use strict;
 
-print "1..19\n";
+print "1..23\n";
 my $test = 0;
 
 # Historically constant folding was performed by evaluating the ops, and if
@@ -118,3 +118,17 @@ is ($@, '', 'no error');
  ok scalar $jing =~ (0 || y/fo//),
    'lone y/// is not bound via =~ after || folding';
 }
+
+# [perl #78064] or print
+package other { # hide the "ok" sub
+ BEGIN { $^W = 0 }
+ print 0 ? not_ok : ok;
+ print " ", ++$test, " - print followed by const ? BEAR : BEAR\n";
+ print 1 ? ok : not_ok;
+ print " ", ++$test, " - print followed by const ? BEAR : BEAR (again)\n";
+ print 1 && ok;
+ print " ", ++$test, " - print followed by const && BEAR\n";
+ print 0 || ok;
+ print " ", ++$test, " - print followed by const || URSINE\n";
+ BEGIN { $^W = 1 }
+}