Move the require './test.pl' to the end of t/comp/hints.t
[p5sagit/p5-mst-13.2.git] / t / porting / diag.t
CommitLineData
fe13d51d 1#!/usr/bin/perl
2use warnings;
3use strict;
f7b649f0 4
5require './test.pl';
6
7plan('no_plan');
8
fe13d51d 9$|=1;
10
f7223e8e 11my $make_exceptions_list = ($ARGV[0]||'') eq '--make-exceptions-list';
87a63fff 12
38ec24b4 13open my $diagfh, "<", "../pod/perldiag.pod"
87a63fff 14 or die "Can't open ../pod/perldiag.pod: $!";
fe13d51d 15
16my %entries;
87a63fff 17while (<DATA>) {
18 chomp;
19 $entries{$_}{todo}=1;
20}
21
fe13d51d 22my $cur_entry;
23while (<$diagfh>) {
24 if (m/^=item (.*)/) {
25 $cur_entry = $1;
26 } elsif (m/^\((.)(?: ([a-z]+?))?\)/ and !$entries{$cur_entry}{severity}) {
87a63fff 27 # Make sure to init this here, so an actual entry in perldiag overwrites
28 # one in DATA.
29 $entries{$cur_entry}{todo} = 0;
fe13d51d 30 $entries{$cur_entry}{severity} = $1;
31 $entries{$cur_entry}{category} = $2;
32 }
33}
34
87a63fff 35my @todo = ('..');
fe13d51d 36while (@todo) {
37 my $todo = shift @todo;
a193a2db 38 next if $todo ~~ ['../t', '../lib', '../ext', '../dist', '../cpan'];
fe13d51d 39 # opmini.c is just a copy of op.c, so there's no need to check again.
87a63fff 40 next if $todo eq '../opmini.c';
fe13d51d 41 if (-d $todo) {
42 push @todo, glob "$todo/*";
87a63fff 43 } elsif ($todo =~ m/\.[ch]$/) {
fe13d51d 44 check_file($todo);
45 }
46}
47
48sub check_file {
49 my ($codefn) = @_;
50
f7223e8e 51 print "# $codefn\n";
fe13d51d 52
38ec24b4 53 open my $codefh, "<", $codefn
fe13d51d 54 or die "Can't open $codefn: $!";
55
56 my $listed_as;
57 my $listed_as_line;
58 my $sub = 'top of file';
59 while (<$codefh>) {
60 chomp;
61 # Getting too much here isn't a problem; we only use this to skip
62 # errors inside of XS modules, which should get documented in the
63 # docs for the module.
64 if (m<^([^#\s].*)> and $1 !~ m/^[{}]*$/) {
65 $sub = $1;
66 }
67 next if $sub =~ m/^XS/;
68 if (m</\* diag_listed_as: (.*) \*/>) {
69 $listed_as = $1;
70 $listed_as_line = $.+1;
71 }
72 next if /^#/;
73 next if /^ * /;
74 while (m/\bDIE\b|Perl_(croak|die|warn(er)?)/ and not m/\);$/) {
75 my $nextline = <$codefh>;
76 # Means we fell off the end of the file. Not terribly surprising;
77 # this code tries to merge a lot of things that aren't regular C
78 # code (preprocessor stuff, long comments). That's OK; we don't
79 # need those anyway.
80 last if not defined $nextline;
81 chomp $nextline;
82 $nextline =~ s/^\s+//;
83 # Note that we only want to do this where *both* are true.
84 $_ =~ s/\\$//;
85 if ($_ =~ m/"$/ and $nextline =~ m/^"/) {
86 $_ =~ s/"$//;
87 $nextline =~ s/^"//;
88 }
89 $_ = "$_$nextline";
90 }
91 # This should happen *after* unwrapping, or we don't reformat the things
92 # in later lines.
93 # List from perlguts.pod "Formatted Printing of IVs, UVs, and NVs"
94 my %specialformats = (IVdf => 'd',
95 UVuf => 'd',
96 UVof => 'o',
97 UVxf => 'x',
98 UVXf => 'X',
99 NVef => 'f',
100 NVff => 'f',
101 NVgf => 'f',
102 SVf => 's');
103 for my $from (keys %specialformats) {
104 s/%"\s*$from\s*"/\%$specialformats{$from}/g;
105 s/%"\s*$from/\%$specialformats{$from}"/g;
106 }
107 # The %"foo" thing needs to happen *before* this regex.
108 if (m/(?:DIE|Perl_(croak|die|warn|warner))(?:_nocontext)? \s*
109 \(aTHX_ \s*
110 (?:packWARN\d*\((.*?)\),)? \s*
111 "((?:\\"|[^"])*?)"/x) {
112 # diag($_);
113 # DIE is just return Perl_die
114 my $severity = {croak => [qw/P F/],
115 die => [qw/P F/],
116 warn => [qw/W D S/],
117 }->{$1||'die'};
118 my @categories;
119 if ($2) {
120 @categories = map {s/^WARN_//; lc $_} split /\s*[|,]\s*/, $2;
121 }
122 my $name;
123 if ($listed_as and $listed_as_line == $.) {
124 $name = $listed_as;
125 } else {
126 $name = $3;
127 # The form listed in perldiag ignores most sorts of fancy printf formatting,
128 # or makes it more perlish.
129 $name =~ s/%%/\\%/g;
130 $name =~ s/%l[ud]/%d/g;
131 $name =~ s/%\.(\d+|\*)s/\%s/g;
132 $name =~ s/\\"/"/g;
133 $name =~ s/\\t/\t/g;
87a63fff 134 $name =~ s/\\n/ /g;
135 $name =~ s/\s+$//;
fe13d51d 136 }
137
87a63fff 138 # Extra explanatory info on an already-listed error, doesn't
139 # need it's own listing.
fe13d51d 140 next if $name =~ m/^\t/;
141
142 # Happens fairly often with PL_no_modify.
143 next if $name eq '%s';
144
87a63fff 145 # Special syntax for magic comment, allows ignoring the fact
146 # that it isn't listed. Only use in very special circumstances,
147 # like this script failing to notice that the Perl_croak call is
148 # inside an #if 0 block.
fe13d51d 149 next if $name eq 'SKIPME';
150
87a63fff 151 if (exists $entries{$name}) {
152 if ($entries{$name}{todo}) {
153 TODO: {
f7b649f0 154 no warnings 'once';
155 local $::TODO = 'in DATA';
87a63fff 156 fail("Presence of '$name' from $codefn line $.");
157 }
fe13d51d 158 } else {
87a63fff 159 ok("Presence of '$name' from $codefn line $.");
fe13d51d 160 }
87a63fff 161 # Later, should start checking that the severity is correct, too.
162 } elsif ($name =~ m/^panic: /) {
163 # Just too many panic:s, they are hard to diagnose, and there
164 # is a generic "panic: %s" entry. Leave these for another
165 # pass.
166 ok("Presence of '$name' from $codefn line $., covered by panic: %s entry");
fe13d51d 167 } else {
87a63fff 168 if ($make_exceptions_list) {
169 print STDERR "$name\n";
170 } else {
171 fail("Presence of '$name' from $codefn line $.");
172 }
fe13d51d 173 }
174
175 die if $name =~ /%$/;
176 }
177 }
178}
f7223e8e 179# Lists all missing things as of the inaguration of this script, so we
87a63fff 180# don't have to go from "meh" to perfect all at once.
181__DATA__
182Ambiguous call resolved as CORE::%s(), %s
183Ambiguous use of %c resolved as operator %c
184Ambiguous use of %c{%s} resolved to %c%s
185Ambiguous use of %c{%s%s} resolved to %c%s%s
186Ambiguous use of -%s resolved as -&%s()
187Argument "%s" isn't numeric
188Argument "%s" isn't numeric in %s
189Assertion: marks beyond string end
190Assertion: string is shorter than advertised
191Attempt to clear deleted array
192Attempt to free non-arena SV: 0x%x
193Attempt to free non-existent shared string '%s'%s
194Attempt to free temp prematurely: SV 0x%x
195Attempt to free unreferenced scalar: SV 0x%x
196Attempt to reload %s aborted. Compilation failed in require
197av_reify called on tied array
198Bad name after %s%s
d5713896 199Bad symbol for %s
87a63fff 200bad top format reference
201Bizarre copy of %s
202Bizarre SvTYPE [%d]
203Cannot copy to %s
204Can't call method "%s" %s
205Can't coerce readonly %s to string
206Can't coerce readonly %s to string in %s
207Can't fix broken locale name "%s"
208Can't get short module name from a handle
209Can't goto subroutine from an eval-block
210Can't goto subroutine from an eval-string
211Can't locate object method "%s" via package "%s" (perhaps you forgot to load "%s"?)
212Can't modify non-existent substring
213Can't open
214Can't open perl script "%s": %s
215Can't open %s
216Can't reset \%ENV on this system
217Can't return array to lvalue scalar context
218Can't return a %s from lvalue subroutine
219Can't return hash to lvalue scalar context
220Can't spawn "%s": %s
221Can't %s script `%s' with ARGV[0] being `%s'
222Can't %s "%s": %s
223Can't %s %s%s%s
224Can't %s `%s' with ARGV[0] being `%s' (looking for executables only, not found)
225Can't take %s of %f
226Can't use '%c' after -mname
227Can't use \\%c to mean $%c in expression
228Can't use when() outside a topicalizer
229\\%c better written as $%c
230Character(s) in '%c' format wrapped in %s
231$%c is no longer supported
232Cloning substitution context is unimplemented
233Code missing after '/' in pack
234Code missing after '/' in unpack
235Compilation failed in require
236Corrupted regexp opcode %d > %d
237'%c' outside of string in pack
238Debug leaking scalars child failed%s%s with errno %d: %s
239Deep recursion on anonymous subroutine
240defined(\%hash) is deprecated
241Don't know how to handle magic of type \\%o
242-Dp not implemented on this platform
243entering effective gid failed
244entering effective uid failed
245Error reading "%s": %s
246Exiting %s via %s
247Filehandle opened only for %sput
248Filehandle %s opened only for %sput
249Filehandle STD%s reopened as %s only for input
250YOU HAVEN'T DISABLED SET-ID SCRIPTS IN THE KERNEL YET! FIX YOUR KERNEL, PUT A C WRAPPER AROUND THIS SCRIPT, OR USE -u AND UNDUMP!
251Format STDOUT redefined
252Free to wrong pool %p not %p
253get %s %p %p %p
254glob failed (can't start child: %s)
255glob failed (child exited with status %d%s)
256Goto undefined subroutine
257Goto undefined subroutine &%s
258Hash \%%s missing the \% in argument %d of %s()
259Illegal character \\%03o (carriage return)
260Illegal character %sin prototype for %s : %s
261Integer overflow in decimal number
262Integer overflow in version %d
263internal \%<num>p might conflict with future printf extensions
264invalid control request: '\\%03o'
265Invalid module name %s with -%c option: contains single ':'
266invalid option -D%c, use -D'' to see choices
267Invalid range "%c-%c" in transliteration operator
268Invalid separator character %c%c%c in PerlIO layer specification %s
269Invalid TOKEN object ignored
270Invalid type '%c' in pack
271Invalid type '%c' in %s
272Invalid type '%c' in unpack
273Invalid type ',' in %s
274Invalid version format (alpha without decimal)
275Invalid version format (misplaced _ in number)
276Invalid version object
277'j' not supported on this platform
278'J' not supported on this platform
279Layer does not match this perl
280leaving effective gid failed
281leaving effective uid failed
282List form of piped open not implemented
283Lost precision when decrementing %f by 1
284Lost precision when incrementing %f by 1
285%lx
286Malformed UTF-16 surrogate
287Malformed UTF-8 character (fatal)
288'\%' may not be used in pack
289Missing (suid) fd script name
290More than one argument to open
291More than one argument to open(,':%s')
292mprotect for %p %d failed with %d
293mprotect RW for %p %d failed with %d
294No code specified for -%c
295No directory specified for -I
296No such class field "%s"
297Not an XSUB reference
298Not %s reference
299Offset outside string
300Opening dirhandle %s also as a file
301Opening filehandle %s also as a directory
302Operator or semicolon missing before %c%s
303Overloaded dereference did not return a reference
304Perl bug: predicted utf8 length not available
305PERL_SIGNALS illegal: "%s"
306Perl %s required (did you mean %s?)--this is only %s, stopped
307Perl %s required--this is only %s, stopped
308Perls since %s too modern--this is %s, stopped
309Possible unintended interpolation of $\\ in regex
310ptr wrong %p != %p fl=%08
311Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)
312Recursive call to Perl_load_module in PerlIO_find_layer
313refcnt_dec: fd %d < 0
314refcnt_dec: fd %d: %d <= 0
315refcnt_dec: fd %d >= refcnt_size %d
316refcnt_inc: fd %d < 0
317refcnt_inc: fd %d: %d <= 0
318Reversed %c= operator
319Runaway prototype
320%s(%.0f) failed
321%s(%.0f) too large
322Scalar value %s better written as $%s
323%sCompilation failed in regexp
324%sCompilation failed in require
325set %s %p %p %p
326%s free() ignored (RMAGIC, PERL_CORE)
327%s has too many errors.
328SIG%s handler "%s" not defined.
329%s: illegal mapping '%s'
330%s in %s
331Size magic not implemented
332%s limit (%d) exceeded
333%s method "%s" overloading "%s" in package "%s"
334%s number > %s non-portable
335%s object version %s does not match %s%s%s%s %s
336%srealloc() %signored
337%s returned from lvalue subroutine in scalar context
338%s%s has too many errors.
339%s%s on %s %s
340%s%s on %s %s %s
341Starting Full Screen process with flag=%d, mytype=%d
342Starting PM process with flag=%d, mytype=%d
343strxfrm() gets absurd
344SWASHNEW didn't return an HV ref
345-T and -B not implemented on filehandles
346The flock() function is not implemented on NetWare
347The rewinddir() function is not implemented on NetWare
348The seekdir() function is not implemented on NetWare
349The stat preceding lstat() wasn't an lstat
350The telldir() function is not implemented on NetWare
351Too deeply nested ()-groups in %s
352Too late to run CHECK block
353Too late to run INIT block
354Too many args on %s line of "%s"
355U0 mode on a byte string
356Unbalanced string table refcount: (%d) for "%s"
357Undefined top format called
358Unexpected constant lvalue entersub entry via type/targ %d:%d
6f6ac1de 359Unicode non-character 0x%04
87a63fff 360Unknown PerlIO layer "scalar"
361Unknown Unicode option letter '%c'
362unrecognised control character '%c'
363Unstable directory path, current directory changed unexpectedly
364Unsupported script encoding UTF16-BE
365Unsupported script encoding UTF16-LE
366Unsupported script encoding UTF32-BE
367Unsupported script encoding UTF32-LE
368Unterminated compressed integer in unpack
369Usage: CODE(0x%x)(%s)
370Usage: %s(%s)
371Usage: %s::%s(%s)
372Usage: VMS::Filespec::unixrealpath(spec)
373Usage: VMS::Filespec::vmsrealpath(spec)
374Use of inherited AUTOLOAD for non-method %s::%s() is deprecated
375UTF-16 surrogate 0x%04
376utf8 "\\x%02X" does not map to Unicode
377Value of logical "%s" too long. Truncating to %i bytes
378value of node is %d in Offset macro
379Value of %s%s can be "0"; test with defined()
380Variable "%c%s" is not imported
381vector argument not supported with alpha versions
382Wide character
383Wide character in $/
384Wide character in print
385Wide character in %s
386Within []-length '%c' not allowed in %s
387Wrong syntax (suid) fd script name "%s"
388'X' outside of string in unpack