xref: /openbsd-src/gnu/usr.bin/perl/t/op/warn.t (revision eac174f2741a08d8deb8aae59a7f778ef9b5d770)
1898184e3Ssthen#!./perl
2898184e3Ssthen#line 3 warn.t
3898184e3Ssthen
4898184e3SsthenBEGIN {
5898184e3Ssthen    chdir 't' if -d 't';
6*eac174f2Safresh1    require './test.pl';
7b8851fccSafresh1    set_up_inc('../lib');
8*eac174f2Safresh1    require './charset_tools.pl';
9898184e3Ssthen}
10898184e3Ssthen
119f11ffb7Safresh1plan 33;
12898184e3Ssthen
13898184e3Ssthenmy @warnings;
14898184e3Ssthenmy $wa = []; my $ea = [];
15898184e3Ssthen$SIG{__WARN__} = sub { push @warnings, $_[0] };
16898184e3Ssthen
17898184e3Ssthen@warnings = ();
18898184e3Ssthen$@ = "";
19898184e3Ssthenwarn "foo\n";
20898184e3Ssthenok @warnings==1 && $warnings[0] eq "foo\n";
21898184e3Ssthen
22898184e3Ssthen@warnings = ();
23898184e3Ssthen$@ = "";
24898184e3Ssthenwarn "foo", "bar\n";
25898184e3Ssthenok @warnings==1 && $warnings[0] eq "foobar\n";
26898184e3Ssthen
27898184e3Ssthen@warnings = ();
28898184e3Ssthen$@ = "";
29898184e3Ssthenwarn "foo";
30*eac174f2Safresh1ok @warnings==1 && $warnings[0] eq "foo at warn.t line 29.\n";
31898184e3Ssthen
32898184e3Ssthen@warnings = ();
33898184e3Ssthen$@ = "";
34898184e3Ssthenwarn $wa;
35898184e3Ssthenok @warnings==1 && ref($warnings[0]) eq "ARRAY" && $warnings[0] == $wa;
36898184e3Ssthen
37898184e3Ssthen@warnings = ();
38898184e3Ssthen$@ = "";
39898184e3Ssthenwarn "";
40898184e3Ssthenok @warnings==1 &&
41*eac174f2Safresh1    $warnings[0] eq "Warning: something's wrong at warn.t line 39.\n";
42898184e3Ssthen
43898184e3Ssthen@warnings = ();
44898184e3Ssthen$@ = "";
45898184e3Ssthenwarn;
46898184e3Ssthenok @warnings==1 &&
47*eac174f2Safresh1    $warnings[0] eq "Warning: something's wrong at warn.t line 45.\n";
48898184e3Ssthen
49898184e3Ssthen@warnings = ();
50898184e3Ssthen$@ = "ERR\n";
51898184e3Ssthenwarn "foo\n";
52898184e3Ssthenok @warnings==1 && $warnings[0] eq "foo\n";
53898184e3Ssthen
54898184e3Ssthen@warnings = ();
55898184e3Ssthen$@ = "ERR\n";
56898184e3Ssthenwarn "foo", "bar\n";
57898184e3Ssthenok @warnings==1 && $warnings[0] eq "foobar\n";
58898184e3Ssthen
59898184e3Ssthen@warnings = ();
60898184e3Ssthen$@ = "ERR\n";
61898184e3Ssthenwarn "foo";
62*eac174f2Safresh1ok @warnings==1 && $warnings[0] eq "foo at warn.t line 61.\n";
63898184e3Ssthen
64898184e3Ssthen@warnings = ();
65898184e3Ssthen$@ = "ERR\n";
66898184e3Ssthenwarn $wa;
67898184e3Ssthenok @warnings==1 && ref($warnings[0]) eq "ARRAY" && $warnings[0] == $wa;
68898184e3Ssthen
69898184e3Ssthen@warnings = ();
70898184e3Ssthen$@ = "ERR\n";
71898184e3Ssthenwarn "";
72898184e3Ssthenok @warnings==1 &&
73*eac174f2Safresh1    $warnings[0] eq "ERR\n\t...caught at warn.t line 71.\n";
74898184e3Ssthen
75898184e3Ssthen@warnings = ();
76898184e3Ssthen$@ = "ERR\n";
77898184e3Ssthenwarn;
78898184e3Ssthenok @warnings==1 &&
79*eac174f2Safresh1    $warnings[0] eq "ERR\n\t...caught at warn.t line 77.\n";
80898184e3Ssthen
81898184e3Ssthen@warnings = ();
82898184e3Ssthen$@ = $ea;
83898184e3Ssthenwarn "foo\n";
84898184e3Ssthenok @warnings==1 && $warnings[0] eq "foo\n";
85898184e3Ssthen
86898184e3Ssthen@warnings = ();
87898184e3Ssthen$@ = $ea;
88898184e3Ssthenwarn "foo", "bar\n";
89898184e3Ssthenok @warnings==1 && $warnings[0] eq "foobar\n";
90898184e3Ssthen
91898184e3Ssthen@warnings = ();
92898184e3Ssthen$@ = $ea;
93898184e3Ssthenwarn "foo";
94*eac174f2Safresh1ok @warnings==1 && $warnings[0] eq "foo at warn.t line 93.\n";
95898184e3Ssthen
96898184e3Ssthen@warnings = ();
97898184e3Ssthen$@ = $ea;
98898184e3Ssthenwarn $wa;
99898184e3Ssthenok @warnings==1 && ref($warnings[0]) eq "ARRAY" && $warnings[0] == $wa;
100898184e3Ssthen
101898184e3Ssthen@warnings = ();
102898184e3Ssthen$@ = $ea;
103898184e3Ssthenwarn "";
104898184e3Ssthenok @warnings==1 && ref($warnings[0]) eq "ARRAY" && $warnings[0] == $ea;
105898184e3Ssthen
106898184e3Ssthen@warnings = ();
107898184e3Ssthen$@ = $ea;
108898184e3Ssthenwarn;
109898184e3Ssthenok @warnings==1 && ref($warnings[0]) eq "ARRAY" && $warnings[0] == $ea;
110898184e3Ssthen
111898184e3Ssthenfresh_perl_like(
112898184e3Ssthen '
113898184e3Ssthen   $a = "\xee\n";
114898184e3Ssthen   print STDERR $a; warn $a;
115898184e3Ssthen   utf8::upgrade($a);
116898184e3Ssthen   print STDERR $a; warn $a;
117898184e3Ssthen ',
118898184e3Ssthen  qr/^\xee(?:\r?\n\xee){3}/,
119898184e3Ssthen  { switches => [ "-C0" ] },
120898184e3Ssthen 'warn emits logical characters, not internal bytes [perl #45549]'
121898184e3Ssthen);
122898184e3Ssthen
123898184e3SsthenSKIP: {
124898184e3Ssthen    skip_if_miniperl('miniperl ignores -C', 1);
125b8851fccSafresh1   $ee = uni_to_native("\xee");
126b8851fccSafresh1   $bytes = byte_utf8a_to_utf8n("\xc3\xae");
127898184e3Ssthenfresh_perl_like(
128b8851fccSafresh1 "
129b8851fccSafresh1   \$a = \"$ee\n\";
130b8851fccSafresh1   print STDERR \$a; warn \$a;
131b8851fccSafresh1   utf8::upgrade(\$a);
132b8851fccSafresh1   print STDERR \$a; warn \$a;
133b8851fccSafresh1 ",
134b8851fccSafresh1  qr/^$bytes(?:\r?\n$bytes){3}/,
135898184e3Ssthen  { switches => ['-CE'] },
136898184e3Ssthen 'warn respects :utf8 layer'
137898184e3Ssthen);
138898184e3Ssthen}
139898184e3Ssthen
140b8851fccSafresh1$bytes = byte_utf8a_to_utf8n("\xc4\xac");
141898184e3Ssthenfresh_perl_like(
142898184e3Ssthen 'warn chr 300',
143b8851fccSafresh1  qr/^Wide character in warn .*\n$bytes at /,
144898184e3Ssthen  { switches => [ "-C0" ] },
145898184e3Ssthen 'Wide character in warn (not print)'
146898184e3Ssthen);
147898184e3Ssthen
148898184e3Ssthenfresh_perl_like(
149898184e3Ssthen 'warn []',
150898184e3Ssthen  qr/^ARRAY\(0x[\da-f]+\) at /a,
151898184e3Ssthen  { },
152898184e3Ssthen 'warn stringifies in the absence of $SIG{__WARN__}'
153898184e3Ssthen);
154898184e3Ssthen
15591f110e0Safresh1use Tie::Scalar;
15691f110e0Safresh1tie $@, "Tie::StdScalar";
15791f110e0Safresh1
15891f110e0Safresh1$@ = "foo\n";
15991f110e0Safresh1@warnings = ();
16091f110e0Safresh1warn;
16191f110e0Safresh1is @warnings, 1;
16291f110e0Safresh1like $warnings[0], qr/^foo\n\t\.\.\.caught at warn\.t /,
16391f110e0Safresh1    '...caught is appended to tied $@';
16491f110e0Safresh1
16591f110e0Safresh1$@ = \$_;
16691f110e0Safresh1@warnings = ();
16791f110e0Safresh1{
16891f110e0Safresh1  local *{ref(tied $@) . "::STORE"} = sub {};
16991f110e0Safresh1  undef $@;
17091f110e0Safresh1}
17191f110e0Safresh1warn;
17291f110e0Safresh1is @warnings, 1;
17391f110e0Safresh1is $warnings[0], \$_, '!SvOK tied $@ that returns ref is used';
17491f110e0Safresh1
17591f110e0Safresh1untie $@;
17691f110e0Safresh1
17791f110e0Safresh1@warnings = ();
17891f110e0Safresh1{
17991f110e0Safresh1  package o;
18091f110e0Safresh1  use overload '""' => sub { "" };
18191f110e0Safresh1}
18291f110e0Safresh1tie $t, Tie::StdScalar;
18391f110e0Safresh1$t = bless [], o;
18491f110e0Safresh1{
18591f110e0Safresh1  local *{ref(tied $t) . "::STORE"} = sub {};
18691f110e0Safresh1  undef $t;
18791f110e0Safresh1}
18891f110e0Safresh1warn $t;
18991f110e0Safresh1is @warnings, 1;
19091f110e0Safresh1object_ok $warnings[0], 'o',
19191f110e0Safresh1  'warn $tie_returning_object_that_stringifes_emptily';
19291f110e0Safresh1
19391f110e0Safresh1@warnings = ();
19491f110e0Safresh1eval "#line 42 Cholmondeley\n \$\@ = '3'; warn";
19591f110e0Safresh1eval "#line 42 Cholmondeley\n \$\@ = 3; warn";
19691f110e0Safresh1is @warnings, 2;
19791f110e0Safresh1is $warnings[1], $warnings[0], 'warn treats $@=3 and $@="3" the same way';
19891f110e0Safresh1
1996fb12b70Safresh1fresh_perl_is(<<'EOF', "should be line 4 at - line 4.\n", {stderr => 1}, "");
2006fb12b70Safresh1${
2016fb12b70Safresh1    foo
2026fb12b70Safresh1} = "should be line 4";
2036fb12b70Safresh1warn $foo;
2046fb12b70Safresh1EOF
2056fb12b70Safresh1
2066fb12b70Safresh1TODO: {
2076fb12b70Safresh1    local $::TODO = "Line numbers don't yet match up for \${ EXPR }";
2086fb12b70Safresh1    my $expected = <<'EOF';
2096fb12b70Safresh1line 1 at - line 1.
2106fb12b70Safresh1line 4 at - line 3.
2116fb12b70Safresh1also line 4 at - line 4.
2126fb12b70Safresh1line 5 at - line 5.
2136fb12b70Safresh1EOF
2146fb12b70Safresh1    fresh_perl_is(<<'EOF', $expected, {stderr => 1}, "");
2156fb12b70Safresh1warn "line 1";
2166fb12b70Safresh1(${
2176fb12b70Safresh1    foo
2186fb12b70Safresh1} = "line 5") && warn("line 4"); warn("also line 4");
2196fb12b70Safresh1warn $foo;
2206fb12b70Safresh1EOF
2216fb12b70Safresh1}
2226fb12b70Safresh1
223898184e3Ssthen1;
2249f11ffb7Safresh1# RT #132602 pp_warn in scalar context was extending the stack then
2259f11ffb7Safresh1# setting SP back to the old, freed stack frame
2269f11ffb7Safresh1
2279f11ffb7Safresh1fresh_perl_is(<<'EOF', "OK\n", {stderr => 1}, "RT #132602");
2289f11ffb7Safresh1$SIG{__WARN__} = sub {};
2299f11ffb7Safresh1
2309f11ffb7Safresh1my (@a, @b);
2319f11ffb7Safresh1for my $i (1..300) {
2329f11ffb7Safresh1    push @a, $i;
2339f11ffb7Safresh1    () = (@a, warn);
2349f11ffb7Safresh1}
2359f11ffb7Safresh1
2369f11ffb7Safresh1# mess with the stack some more for ASan's benefit
2379f11ffb7Safresh1for my $i (1..100) {
2389f11ffb7Safresh1    push @a, $i;
2399f11ffb7Safresh1    @b = @a;
2409f11ffb7Safresh1}
2419f11ffb7Safresh1print "OK\n";
2429f11ffb7Safresh1EOF
243