diff options
author | Dave Mitchell <davem@fdisolutions.com> | 2008-01-19 20:41:03 +0000 |
---|---|---|
committer | Dave Mitchell <davem@fdisolutions.com> | 2008-01-19 20:41:03 +0000 |
commit | d11865445af8750ad2c09674e81b7941117e83b5 (patch) | |
tree | 474c35749910dfc3c197dde2206dca35a12dfa7a /t | |
parent | 47031da69d9704a7f7f2f86084deec4a32cbaf6e (diff) | |
download | perl-d11865445af8750ad2c09674e81b7941117e83b5.tar.gz |
[perl #49522] state variable not available
Svf_PADSTALE means something different for state vars. Make sure
we always handle it correctly
p4raw-id: //depot/perl@33009
Diffstat (limited to 't')
-rw-r--r-- | t/op/state.t | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/t/op/state.t b/t/op/state.t index 411ffaa30e..953cd260c0 100644 --- a/t/op/state.t +++ b/t/op/state.t @@ -10,7 +10,7 @@ BEGIN { use strict; use feature ":5.10"; -plan tests => 123; +plan tests => 130; ok( ! defined state $uninit, q(state vars are undef by default) ); @@ -354,6 +354,50 @@ foreach my $forbidden (<DATA>) { eval $forbidden; like $@, qr/Initialization of state variables in list context currently forbidden/, "Currently forbidden: $forbidden"; } + +# [perl #49522] state variable not available + +{ + my @warnings; + local $SIG{__WARN__} = sub { push @warnings, $_[0] }; + + eval q{ + use warnings; + + sub f_49522 { + state $s = 88; + sub g_49522 { $s } + sub { $s }; + } + + sub h_49522 { + state $t = 99; + sub i_49522 { + sub { $t }; + } + } + }; + is $@, '', "eval f_49522"; + # shouldn't be any 'not available' or 'not stay shared' warnings + ok !@warnings, "suppress warnings part 1 [@warnings]"; + + @warnings = (); + my $f = f_49522(); + is $f->(), 88, "state var closure 1"; + is g_49522(), 88, "state var closure 2"; + ok !@warnings, "suppress warnings part 2 [@warnings]"; + + + @warnings = (); + $f = i_49522(); + h_49522(); # initialise $t + is $f->(), 99, "state var closure 3"; + ok !@warnings, "suppress warnings part 3 [@warnings]"; + + +} + + __DATA__ state ($a) = 1; (state $a) = 1; |