summaryrefslogtreecommitdiff
path: root/t
diff options
context:
space:
mode:
authorDave Mitchell <davem@fdisolutions.com>2008-01-19 20:41:03 +0000
committerDave Mitchell <davem@fdisolutions.com>2008-01-19 20:41:03 +0000
commitd11865445af8750ad2c09674e81b7941117e83b5 (patch)
tree474c35749910dfc3c197dde2206dca35a12dfa7a /t
parent47031da69d9704a7f7f2f86084deec4a32cbaf6e (diff)
downloadperl-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.t46
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;