This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Avoid using pragmata in opsubs.t - use may not work yet.
[perl5.git] / t / comp / fold.t
... / ...
CommitLineData
1#!./perl
2
3BEGIN {
4 chdir 't';
5 @INC = '../lib';
6 require './test.pl';
7}
8use strict;
9use warnings;
10
11plan (13);
12
13# Historically constant folding was performed by evaluating the ops, and if
14# they threw an exception compilation failed. This was seen as buggy, because
15# even illegal constants in unreachable code would cause failure. So now
16# illegal expressions are reported at runtime, if the expression is reached,
17# making constant folding consistent with many other languages, and purely an
18# optimisation rather than a behaviour change.
19
20
21my $a;
22$a = eval '$b = 0/0 if 0; 3';
23is ($a, 3);
24is ($@, "");
25
26my $b = 0;
27$a = eval 'if ($b) {return sqrt -3} 3';
28is ($a, 3);
29is ($@, "");
30
31$a = eval q{
32 $b = eval q{if ($b) {return log 0} 4};
33 is ($b, 4);
34 is ($@, "");
35 5;
36};
37is ($a, 5);
38is ($@, "");
39
40# warn and die hooks should be disabled during constant folding
41
42{
43 my $c = 0;
44 local $SIG{__WARN__} = sub { $c++ };
45 local $SIG{__DIE__} = sub { $c+= 2 };
46 eval q{
47 is($c, 0, "premature warn/die: $c");
48 my $x = "a"+5;
49 is($c, 1, "missing warn hook");
50 is($x, 5, "a+5");
51 $c = 0;
52 $x = 1/0;
53 };
54 like ($@, qr/division/, "eval caught division");
55 is($c, 2, "missing die hook");
56}