1#!./perl -w
2
3chdir 't' if -d 't';
4require './test.pl';
5set_up_inc('../lib');
6
7use strict;
8
9$|=1;
10
11run_multiple_progs('', \*DATA);
12
13foreach my $code ('sub;', 'sub ($) ;', '{ $x = sub }', 'sub ($) && 1') {
14    eval $code;
15    like($@, qr/^Illegal declaration of anonymous subroutine at/,
16	 "'$code' is illegal");
17}
18
19{
20    local $::TODO;
21    $::TODO = 'RT #17589 not completely resolved';
22    # Here's a patch. It makes "sub;" and similar report an error immediately
23    # from the lexer. However the solution is not complete, it doesn't
24    # handle the case "sub ($) : lvalue;" (marked as a TODO test), because
25    # it's handled by the lexer in separate tokens, hence more difficult to
26    # work out.
27    my $code = 'sub ($) : lvalue;';
28    eval $code;
29    like($@, qr/^Illegal declaration of anonymous subroutine at/,
30	 "'$code' is illegal");
31}
32
33eval "sub #foo\n{print 1}";
34is($@, '');
35
36done_testing();
37
38__END__
39sub X {
40    my $n = "ok 1\n";
41    sub { print $n };
42}
43my $x = X();
44undef &X;
45$x->();
46EXPECT
47ok 1
48########
49sub X {
50    my $n = "ok 1\n";
51    sub {
52        my $dummy = $n;	# eval can't close on $n without internal reference
53	eval 'print $n';
54	die $@ if $@;
55    };
56}
57my $x = X();
58undef &X;
59$x->();
60EXPECT
61ok 1
62########
63sub X {
64    my $n = "ok 1\n";
65    eval 'sub { print $n }';
66}
67my $x = X();
68die $@ if $@;
69undef &X;
70$x->();
71EXPECT
72ok 1
73########
74sub X;
75sub X {
76    my $n = "ok 1\n";
77    eval 'sub Y { my $p = shift; $p->() }';
78    die $@ if $@;
79    Y(sub { print $n });
80}
81X();
82EXPECT
83ok 1
84########
85print sub { return "ok 1\n" } -> ();
86EXPECT
87ok 1
88########
89# [perl #71154] undef &$code makes $code->() die with: Not a CODE reference
90sub __ANON__ { print "42\n" }
91undef &{$x=sub{}};
92$x->();
93EXPECT
94Undefined subroutine called at - line 4.
95########
96# NAME anon constant clobbering __ANON__
97sub __ANON__ { "42\n" }
98print __ANON__;
99sub(){3};
100EXPECT
10142
102########
103# NAME undef &anon giving it a freed GV
104$_ = sub{};
105delete $::{__ANON__};
106undef &$_; # SvREFCNT_dec + inc on a GV with a refcnt of 1
107           # so now SvTYPE(CvGV(anon)) is 0xff == freed
108if (!eval { require B }) { # miniperl, presumably
109    print "__ANON__\n";
110} else {
111    print B::svref_2object($_)->GV->NAME, "\n";
112}
113EXPECT
114__ANON__
115