summaryrefslogtreecommitdiff
path: root/t/cmd
diff options
context:
space:
mode:
Diffstat (limited to 't/cmd')
-rw-r--r--t/cmd/lexsub.t52
1 files changed, 51 insertions, 1 deletions
diff --git a/t/cmd/lexsub.t b/t/cmd/lexsub.t
index 348facf933..f17eee0b7d 100644
--- a/t/cmd/lexsub.t
+++ b/t/cmd/lexsub.t
@@ -8,7 +8,7 @@ BEGIN {
*bar::like = *like;
}
no warnings 'deprecated';
-plan 107;
+plan 111;
# -------------------- our -------------------- #
@@ -453,6 +453,19 @@ sub make_anon_with_my_sub{
is eval{s2},eval{\&s1}, 'my sub in anon closure closing over sibling my sub';
}
}
+
+# Test my subs inside predeclared my subs
+{
+ my sub s2;
+ sub s2 {
+ my $x = 3;
+ my sub s3 { eval '$x' }
+ s3;
+ }
+ local $::TODO = 'closure problem?';
+ is s2, 3, 'my sub inside predeclared my sub';
+}
+
{
my $s = make_anon_with_my_sub;
&$s;
@@ -488,3 +501,40 @@ is sub {
s1
}->()(), 3, 'state sub inside my sub closing over my sub uncle';
+{
+ my sub s2 { 3 };
+ sub not_lexical { state sub foo { \&s2 } foo }
+ is not_lexical->(), 3, 'state subs that reference my sub from outside';
+}
+
+# Test my subs inside predeclared package subs
+# This test also checks that CvOUTSIDE pointers are not mangled when the
+# inner sub’s CvOUTSIDE points to another sub.
+sub not_lexical2;
+sub not_lexical2 {
+ my $x = 23;
+ my sub bar;
+ sub not_lexical3 {
+ not_lexical2();
+ sub bar { $x }
+ };
+ bar
+}
+$::TODO = 'closing over wrong sub';
+is not_lexical3, 23, 'my subs inside predeclared package subs';
+
+# Test my subs inside predeclared package sub, where the lexical sub is
+# declared outside the package sub.
+# This checks that CvOUTSIDE pointers are fixed up even when the sub is
+# not declared inside the sub that its CvOUTSIDE points to.
+{
+ my sub foo;
+ sub not_lexical4;
+ sub not_lexical4 {
+ my $x = 234;
+ sub foo { $x }
+ foo
+ }
+ is not_lexical4, 234,
+ 'my sub defined in predeclared pkg sub but declared outside';
+}