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