X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=t%2F05-words.t;h=9fe39ff5567399a86216440453bda179d794c4a2;hb=2e30a0f24d9b8f169ec974af21051e098a7d9516;hp=6971da61f9a1130a507f3302a1c880b76cd97ee3;hpb=eefb9e3f4b67e0aa0e8c3e705d7f7010a49f0540;p=perl%2Fmodules%2FScope-Upper.git diff --git a/t/05-words.t b/t/05-words.t index 6971da6..9fe39ff 100644 --- a/t/05-words.t +++ b/t/05-words.t @@ -5,66 +5,121 @@ use warnings; use Test::More; -plan tests => 23 * ($^P ? 4 : 5) + ($^P ? 1 : 3) + 7 + 15 * 2; +plan tests => 23 * ($^P ? 4 : 5) + 40 + ($^P ? 1 : 3) + 7 + (32 + 7) + 1; use Scope::Upper qw<:words>; # Tests with hardcoded values are for internal use only and doesn't imply any # kind of future compatibility on what the words should actually return. +my $stray_warnings = 0; +local $SIG{__WARN__} = sub { + ++$stray_warnings; + warn(@_); +}; + +our @warns; +my $warn_catcher = sub { + my $what; + if ($_[0] =~ /^Cannot target a scope outside of the current stack at /) { + $what = 'smash'; + } elsif ($_[0] =~ /^No targetable (subroutine|eval) scope in the current stack at /) { + $what = $1; + } + if (defined $what) { + push @warns, $what; + } else { + warn(@_); + } + return; +}; +my $old_sig_warn; + my $top = HERE; -is $top, 0, 'main : here' unless $^P; -is TOP, $top, 'main : top'; -is UP, $top, 'main : up'; -is SUB, undef, 'main : sub'; -is EVAL, undef, 'main : eval'; +is $top, 0, 'main : here' unless $^P; +is TOP, $top, 'main : top'; +$old_sig_warn = $SIG{__WARN__}; +local ($SIG{__WARN__}, @warns) = $warn_catcher; +is UP, $top, 'main : up'; +is "@warns", 'smash', 'main : up warns'; +local @warns; +is SUB, undef, 'main : sub'; +is "@warns", 'subroutine', 'main : sub warns'; +local @warns; +is EVAL, undef, 'main : eval'; +is "@warns", 'eval', 'main : eval warns'; +local $SIG{__WARN__} = $old_sig_warn; { my $desc = '{ 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } do { my $desc = 'do { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; }; eval { my $desc = 'eval { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, HERE, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local $SIG{__WARN__} = $old_sig_warn; + is EVAL, HERE, "$desc : eval"; }; diag $@ if $@; eval q[ my $desc = 'eval "1"'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, HERE, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local $SIG{__WARN__} = $old_sig_warn; + is EVAL, HERE, "$desc : eval"; ]; diag $@ if $@; sub { my $desc = 'sub { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, HERE, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + is SUB, HERE, "$desc : sub"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; }->(); my $true = 1; @@ -72,126 +127,204 @@ my $false = !$true; if ($true) { my $desc = 'if () { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } unless ($false) { my $desc = 'unless () { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } if ($false) { fail "false was true : $_" for 1 .. 5; } else { my $desc = 'if () { } else { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } for (1) { my $desc = 'for (list) { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } for (1 .. 1) { my $desc = 'for (num range) { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } for (1 .. 1) { my $desc = 'for (pv range) { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } for (my $i = 0; $i < 1; ++$i) { my $desc = 'for (;;) { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } my $flag = 1; while ($flag) { $flag = 0; my $desc = 'while () { 1 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } my @list = (1); while (my $thing = shift @list) { my $desc = 'while (my $thing = ...) { 2 }'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } do { my $desc = 'do { 1 } while (0)'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } while (0); map { my $desc = 'map { 1 } 1'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } 1; grep { my $desc = 'grep { 1 } 1'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; } 1; my $var = 'a'; -$var =~ s{.}{ +$var =~ s[.][ my $desc = 'subst'; - is HERE, 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $top, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, undef, "$desc : eval"; -}e; + is HERE, 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $top, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local @warns; + is EVAL, undef, "$desc : eval"; + is "@warns", 'eval', "$desc : eval warns"; + local $SIG{__WARN__} = $old_sig_warn; +]e; $var = 'a'; $var =~ s{.}{UP}e; @@ -206,7 +339,7 @@ $var =~ s{.}{do { my $x; UP }}e; is $var, 1, 'subst : do block preserved' unless $^P; SKIP: { - skip 'Perl 5.10 required to test given/when' => 4 * ($^P ? 4 : 5) + skip 'Perl 5.10 required to test given/when' => 4 * ($^P ? 4 : 5) + 4 if "$]" < 5.010; eval <<'TEST_GIVEN'; @@ -220,11 +353,15 @@ SKIP: { my $desc = 'given'; my $base = HERE; given (1) { - is HERE, $base + 1, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $base, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, $base, "$desc : eval"; + is HERE, $base + 1, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $base, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local $SIG{__WARN__} = $old_sig_warn; + is EVAL, $base, "$desc : eval"; } TEST_GIVEN diag $@ if $@; @@ -242,11 +379,15 @@ TEST_GIVEN given (1) { my $given = HERE; when (1) { - is HERE, $base + 3, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $given, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, $base, "$desc : eval"; + is HERE, $base + 3, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $given, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local $SIG{__WARN__} = $old_sig_warn; + is EVAL, $base, "$desc : eval"; } } TEST_GIVEN_WHEN @@ -265,11 +406,15 @@ TEST_GIVEN_WHEN given (1) { my $given = HERE; default { - is HERE, $base + 3, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $given, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, $base, "$desc : eval"; + is HERE, $base + 3, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $given, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local $SIG{__WARN__} = $old_sig_warn; + is EVAL, $base, "$desc : eval"; } } TEST_GIVEN_DEFAULT @@ -288,11 +433,15 @@ TEST_GIVEN_DEFAULT for (1) { my $loop = HERE; when (1) { - is HERE, $base + 2, "$desc : here" unless $^P; - is TOP, $top, "$desc : top"; - is UP, $loop, "$desc : up"; - is SUB, undef, "$desc : sub"; - is EVAL, $base, "$desc : eval"; + is HERE, $base + 2, "$desc : here" unless $^P; + is TOP, $top, "$desc : top"; + is UP, $loop, "$desc : up"; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SUB, undef, "$desc : sub"; + is "@warns", 'subroutine', "$desc : sub warns"; + local $SIG{__WARN__} = $old_sig_warn; + is EVAL, $base, "$desc : eval"; } } TEST_FOR_WHEN @@ -327,43 +476,69 @@ SKIP: { { my $block = HERE; - is SCOPE, $block, 'block : scope'; - is SCOPE(0), $block, 'block : scope 0'; - is SCOPE(1), $top, 'block : scope 1'; - is CALLER, $top, 'block : caller'; - is CALLER(0), $top, 'block : caller 0'; - is CALLER(1), $top, 'block : caller 1'; + is SCOPE, $block, 'block : scope'; + is SCOPE(0), $block, 'block : scope 0'; + is SCOPE(1), $top, 'block : scope 1'; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is SCOPE(2), $top, 'block : scope 2'; + is "@warns", 'smash', 'block : scope 2 warns'; + local @warns; + is CALLER, $top, 'block : caller'; + is "@warns", 'smash', 'block : caller warns'; + local @warns; + is CALLER(0), $top, 'block : caller 0'; + is "@warns", 'smash', 'block : caller 0 warns'; + local @warns; + is CALLER(1), $top, 'block : caller 1'; + is "@warns", 'smash', 'block : caller 1 warns'; + local $SIG{__WARN__} = $old_sig_warn; sub { my $sub = HERE; - is SCOPE, $sub, 'block sub : scope'; - is SCOPE(0), $sub, 'block sub : scope 0'; - is SCOPE(1), $block, 'block sub : scope 1'; - is CALLER, $sub, 'block sub : caller'; - is CALLER(0), $sub, 'block sub : caller 0'; - is CALLER(1), $top, 'block sub : caller 1'; + is SCOPE, $sub, 'block sub : scope'; + is SCOPE(0), $sub, 'block sub : scope 0'; + is SCOPE(1), $block, 'block sub : scope 1'; + is SCOPE(2), $top, 'block sub : scope 2'; + is CALLER, $sub, 'block sub : caller'; + is CALLER(0), $sub, 'block sub : caller 0'; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is CALLER(1), $top, 'block sub : caller 1'; + is "@warns", 'smash', 'block sub : caller 1 warns'; + local $SIG{__WARN__} = $old_sig_warn; for (1) { my $loop = HERE; - is SCOPE, $loop, 'block sub for : scope'; - is SCOPE(0), $loop, 'block sub for : scope 0'; - is SCOPE(1), $sub, 'block sub for : scope 1'; - is SCOPE(2), $block, 'block sub for : scope 2'; - is CALLER, $sub, 'block sub for : caller'; - is CALLER(0), $sub, 'block sub for : caller 0'; - is CALLER(1), $top, 'block sub for : caller 1'; - is CALLER(2), $top, 'block sub for : caller 2'; + is SCOPE, $loop, 'block sub for : scope'; + is SCOPE(0), $loop, 'block sub for : scope 0'; + is SCOPE(1), $sub, 'block sub for : scope 1'; + is SCOPE(2), $block, 'block sub for : scope 2'; + is SCOPE(3), $top, 'block sub for : scope 3'; + is CALLER, $sub, 'block sub for : caller'; + is CALLER(0), $sub, 'block sub for : caller 0'; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is CALLER(1), $top, 'block sub for : caller 1'; + is "@warns", 'smash', 'block sub for : caller 1 warns'; + local $SIG{__WARN__} = $old_sig_warn; eval { my $eval = HERE; - is SCOPE, $eval, 'block sub for eval : scope'; - is SCOPE(0), $eval, 'block sub for eval : scope 0'; - is SCOPE(1), $loop, 'block sub for eval : scope 1'; - is SCOPE(2), $sub, 'block sub for eval : scope 2'; - is SCOPE(3), $block, 'block sub for eval : scope 3'; - is CALLER, $eval, 'block sub for eval : caller'; - is CALLER(0), $eval, 'block sub for eval : caller 0'; - is CALLER(1), $sub, 'block sub for eval : caller 1'; - is CALLER(2), $top, 'block sub for eval : caller 2'; - is CALLER(3), $top, 'block sub for eval : caller 3'; + is SCOPE, $eval, 'block sub for eval : scope'; + is SCOPE(0), $eval, 'block sub for eval : scope 0'; + is SCOPE(1), $loop, 'block sub for eval : scope 1'; + is SCOPE(2), $sub, 'block sub for eval : scope 2'; + is SCOPE(3), $block, 'block sub for eval : scope 3'; + is SCOPE(4), $top, 'block sub for eval : scope 4'; + is CALLER, $eval, 'block sub for eval : caller'; + is CALLER(0), $eval, 'block sub for eval : caller 0'; + is CALLER(1), $sub, 'block sub for eval : caller 1'; + $old_sig_warn = $SIG{__WARN__}; + local ($SIG{__WARN__}, @warns) = $warn_catcher; + is CALLER(2), $top, 'block sub for eval : caller 2'; + is "@warns", 'smash', 'block sub for eval : caller 2 warns'; + local $SIG{__WARN__} = $old_sig_warn; } } }->(); } + +is $stray_warnings, 0, 'no stray warnings';