This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix range op under aborted constant folding
[perl5.git] / t / comp / fold.t
index f6a9470..a72394e 100644 (file)
@@ -4,7 +4,7 @@
 # we've not yet verified that use works.
 # use strict;
 
-print "1..27\n";
+print "1..35\n";
 my $test = 0;
 
 # Historically constant folding was performed by evaluating the ops, and if
@@ -156,5 +156,39 @@ for(1+2) {
     print "not " unless $_ eq 4;
     print "ok ", ++$test,
           " - 1+2 returns mutable value, just like \$a+\$b",
-          " # TODO\n";
+          "\n";
 }
+
+# [perl #119055]
+# We hide the implementation detail that qq "foo" is implemented using
+# constant folding.
+eval { ${\"hello\n"}++ };
+print "not " unless $@ =~ "Modification of a read-only value attempted at";
+print "ok ", ++$test, " - qq with no vars is a constant\n";
+
+# [perl #119501]
+my @values;
+for (1,2) { for (\(1+3)) { push @values, $$_; $$_++ } }
+is "@values", "4 4",
+   '\1+3 folding making modification affect future retvals';
+
+{
+    BEGIN { $^W = 0; $::{u} = \undef }
+    my $w;
+    local $SIG{__WARN__} = sub { ++$w };
+    () = 1 + u;
+    is $w, 1, '1+undef_constant is not folded outside warninsg scope';
+    BEGIN { $^W = 1 }
+}
+
+$a = eval 'my @z; @z = 0..~0 if 0; 3';
+is ($a, 3, "list constant folding doesn't signal compile-time error");
+is ($@, '', 'no error');
+
+$b = 0;
+$a = eval 'my @z; @z = 0..~0 if $b; 3';
+is ($a, 3, "list constant folding doesn't signal compile-time error");
+is ($@, '', 'no error');
+
+$a = eval 'local $SIG{__WARN__} = sub {}; join("", ":".."~", "z")';
+is ($a, ":z", "aborted list constant folding still executable");