Commit | Line | Data |
---|---|---|
fe13d51d JM |
1 | #!/usr/bin/perl |
2 | use warnings; | |
3 | use strict; | |
f7b649f0 | 4 | |
99a4af00 FC |
5 | BEGIN { |
6 | chdir 't'; | |
7 | require './test.pl'; | |
8 | } | |
f7b649f0 NC |
9 | |
10 | plan('no_plan'); | |
11 | ||
fe13d51d JM |
12 | $|=1; |
13 | ||
1eb3f3ad JM |
14 | # --make-exceptions-list outputs the list of strings that don't have |
15 | # perldiag.pod entries to STDERR without TAP formatting, so they can | |
16 | # easily be put in the __DATA__ section of this file. This was done | |
17 | # initially so as to not create new test failures upon the initial | |
18 | # creation of this test file. You probably shouldn't do it again. | |
19 | # Just add the documentation instead. | |
f7223e8e | 20 | my $make_exceptions_list = ($ARGV[0]||'') eq '--make-exceptions-list'; |
87a63fff | 21 | |
45f1c7ba | 22 | chdir '..' or die "Can't chdir ..: $!"; |
47f6eaac | 23 | BEGIN { defined $ENV{PERL_UNICODE} and push @INC, "lib"; } |
45f1c7ba | 24 | |
1b1ee2ef KW |
25 | my @functions; |
26 | ||
27 | open my $func_fh, "<", "embed.fnc" or die "Can't open embed.fnc: $!"; | |
28 | ||
29 | # Look for functions in embed.fnc that look like they could be diagnostic ones. | |
30 | while (<$func_fh>) { | |
31 | chomp; | |
32 | s/^\s+//; | |
33 | while (s/\s*\\$//) { # Grab up all continuation lines, these end in \ | |
34 | my $next = <$func_fh>; | |
35 | $next =~ s/^\s+//; | |
36 | chomp $next; | |
37 | $_ .= $next; | |
38 | } | |
39 | next if /^:/; # Lines beginning with colon are comments. | |
40 | next unless /\|/; # Lines without a vertical bar are something we can't deal | |
41 | # with | |
42 | my @fields = split /\s*\|\s*/; | |
43 | next unless $fields[2] =~ /warn|err|(\b|_)die|croak/i; | |
44 | push @functions, $fields[2]; | |
45 | ||
46 | # The flag p means that this function may have a 'Perl_' prefix | |
47 | # The flag s means that this function may have a 'S_' prefix | |
48 | push @functions, "Perl_$fields[2]", if $fields[0] =~ /p/; | |
49 | push @functions, "S_$fields[2]", if $fields[0] =~ /s/; | |
50 | } | |
51 | ||
52 | close $func_fh; | |
53 | ||
54 | my $function_re = join '|', @functions; | |
b26f9440 FC |
55 | my $regcomp_fail_re = '\b(?:(?:Simple_)?v)?FAIL[2-4]?\b'; |
56 | my $source_msg_re = | |
57 | "(?<routine>\\bDIE\\b|$function_re|$regcomp_fail_re)"; | |
de53a0ea | 58 | my $text_re = '"(?<text>(?:\\\\"|[^"]|"\s*[A-Z_]+\s*")*)"'; |
78cd53af DM |
59 | my $source_msg_call_re = qr/$source_msg_re(?:_nocontext)? \s* |
60 | \(aTHX_ \s* | |
61 | (?:packWARN\d*\((?<category>.*?)\),)? \s* | |
62 | $text_re /x; | |
63 | my $bad_version_re = qr{BADVERSION\([^"]*$text_re}; | |
b26f9440 | 64 | $regcomp_fail_re = qr/$regcomp_fail_re\([^"]*$text_re/; |
fe13d51d JM |
65 | |
66 | my %entries; | |
1b1ee2ef KW |
67 | |
68 | # Get the ignores that are compiled into this file | |
87a63fff JM |
69 | while (<DATA>) { |
70 | chomp; | |
71 | $entries{$_}{todo}=1; | |
72 | } | |
73 | ||
808910a9 | 74 | my $pod = "pod/perldiag.pod"; |
fe13d51d | 75 | my $cur_entry; |
808910a9 KW |
76 | open my $diagfh, "<", $pod |
77 | or die "Can't open $pod: $!"; | |
1b1ee2ef | 78 | |
aef36ea3 | 79 | my $category_re = qr/ [a-z0-9_]+?/; # Note: requires an initial space |
4cf67031 KW |
80 | my $severity_re = qr/ . (?: \| . )* /x; # A severity is a single char, but can |
81 | # be of the form 'S|P|W' | |
fe13d51d JM |
82 | while (<$diagfh>) { |
83 | if (m/^=item (.*)/) { | |
97e35f92 | 84 | $cur_entry = $1 =~ s/\s+\z//r; |
4cf67031 | 85 | |
9c3e8e01 | 86 | if (exists $entries{$cur_entry}) { |
b61b433c KW |
87 | TODO: { |
88 | local $::TODO = "Remove the TODO entry \"$cur_entry\" from DATA as it is already in $pod near line $."; | |
89 | ok($cur_entry); | |
90 | } | |
9c3e8e01 | 91 | } |
4cf67031 KW |
92 | # Make sure to init this here, so an actual entry in perldiag |
93 | # overwrites one in DATA. | |
87a63fff | 94 | $entries{$cur_entry}{todo} = 0; |
4cf67031 KW |
95 | $entries{$cur_entry}{line_number} = $.; |
96 | next; | |
97 | } | |
98 | ||
99 | next if ! defined $cur_entry; | |
100 | ||
101 | if (! $entries{$cur_entry}{severity}) { | |
102 | if (/^ \( ( $severity_re ) | |
103 | ||
104 | # Can have multiple categories separated by commas | |
105 | (?: ( $category_re ) (?: , $category_re)* )? \) /x) | |
106 | { | |
107 | $entries{$cur_entry}{severity} = $1; | |
108 | $entries{$cur_entry}{category} = $2; | |
109 | } | |
110 | elsif (! $entries{$cur_entry}{first_line} && $_ =~ /\S/) { | |
111 | ||
112 | # Keep track of first line of text if doesn't contain a severity, so | |
113 | # that can later examine it to determine if that is ok or not | |
114 | $entries{$cur_entry}{first_line} = $_; | |
115 | } | |
fe13d51d JM |
116 | } |
117 | } | |
118 | ||
4cf67031 KW |
119 | foreach my $cur_entry ( keys %entries) { |
120 | next if $entries{$cur_entry}{todo}; # If in this file, won't have a severity | |
121 | if (! exists $entries{$cur_entry}{severity} | |
122 | ||
123 | # If there is no first line, it was two =items in a row, so the | |
124 | # second one is the one with with text, not this one. | |
125 | && exists $entries{$cur_entry}{first_line} | |
126 | ||
127 | # If the first line refers to another message, no need for severity | |
128 | && $entries{$cur_entry}{first_line} !~ /^See/) | |
129 | { | |
130 | fail($cur_entry); | |
131 | diag( | |
132 | " $pod entry at line $entries{$cur_entry}{line_number}\n" | |
133 | . " \"$cur_entry\"\n" | |
134 | . " is missing a severity and/or category" | |
135 | ); | |
136 | } | |
137 | } | |
138 | ||
78cd53af DM |
139 | # List from perlguts.pod "Formatted Printing of IVs, UVs, and NVs" |
140 | # Convert from internal formats to ones that the readers will be familiar | |
141 | # with, while removing any format modifiers, such as precision, the | |
142 | # presence of which would just confuse the pod's explanation | |
143 | my %specialformats = (IVdf => 'd', | |
144 | UVuf => 'd', | |
145 | UVof => 'o', | |
146 | UVxf => 'x', | |
147 | UVXf => 'X', | |
148 | NVef => 'f', | |
149 | NVff => 'f', | |
150 | NVgf => 'f', | |
b8fa5213 | 151 | HEKf256=>'s', |
fa871b03 | 152 | HEKf => 's', |
f0eec8b8 FC |
153 | SVf256=>'s', |
154 | SVf32=> 's', | |
78cd53af DM |
155 | SVf => 's'); |
156 | my $format_modifiers = qr/ [#0\ +-]* # optional flags | |
157 | (?: [1-9][0-9]* | \* )? # optional field width | |
158 | (?: \. \d* )? # optional precision | |
159 | (?: h|l )? # optional length modifier | |
160 | /x; | |
161 | ||
f0eec8b8 FC |
162 | my $specialformats = |
163 | join '|', sort { length $b cmp length $a } keys %specialformats; | |
78cd53af DM |
164 | my $specialformats_re = qr/%$format_modifiers"\s*($specialformats)(\s*")?/; |
165 | ||
1b1ee2ef | 166 | # Recursively descend looking for source files. |
abd65dc0 | 167 | my @todo = sort <*>; |
fe13d51d JM |
168 | while (@todo) { |
169 | my $todo = shift @todo; | |
45f1c7ba | 170 | next if $todo ~~ ['t', 'lib', 'ext', 'dist', 'cpan']; |
fe13d51d | 171 | # opmini.c is just a copy of op.c, so there's no need to check again. |
45f1c7ba | 172 | next if $todo eq 'opmini.c'; |
fe13d51d | 173 | if (-d $todo) { |
abd65dc0 | 174 | unshift @todo, sort glob "$todo/*"; |
87a63fff | 175 | } elsif ($todo =~ m/\.[ch]$/) { |
fe13d51d JM |
176 | check_file($todo); |
177 | } | |
178 | } | |
179 | ||
abd65dc0 DG |
180 | # Standardize messages with variants into the form that appears |
181 | # in perldiag.pod -- useful for things without a diag_listed_as annotation | |
182 | sub standardize { | |
183 | my ($name) = @_; | |
184 | ||
185 | if ( $name =~ m/^(Invalid strict version format) \([^\)]*\)/ ) { | |
186 | $name = "$1 (\%s)"; | |
187 | } | |
188 | elsif ( $name =~ m/^(Invalid version format) \([^\)]*\)/ ) { | |
189 | $name = "$1 (\%s)"; | |
190 | } | |
191 | elsif ($name =~ m/^panic: /) { | |
192 | $name = "panic: \%s"; | |
193 | } | |
194 | ||
195 | return $name; | |
196 | } | |
197 | ||
fe13d51d JM |
198 | sub check_file { |
199 | my ($codefn) = @_; | |
200 | ||
abd65dc0 | 201 | print "# Checking $codefn\n"; |
fe13d51d | 202 | |
38ec24b4 | 203 | open my $codefh, "<", $codefn |
fe13d51d JM |
204 | or die "Can't open $codefn: $!"; |
205 | ||
206 | my $listed_as; | |
207 | my $listed_as_line; | |
208 | my $sub = 'top of file'; | |
209 | while (<$codefh>) { | |
210 | chomp; | |
211 | # Getting too much here isn't a problem; we only use this to skip | |
212 | # errors inside of XS modules, which should get documented in the | |
213 | # docs for the module. | |
78cd53af DM |
214 | if (m<^[^#\s]> and $_ !~ m/^[{}]*$/) { |
215 | $sub = $_; | |
fe13d51d JM |
216 | } |
217 | next if $sub =~ m/^XS/; | |
218 | if (m</\* diag_listed_as: (.*) \*/>) { | |
219 | $listed_as = $1; | |
220 | $listed_as_line = $.+1; | |
221 | } | |
222 | next if /^#/; | |
1b1ee2ef | 223 | |
c4ea5f2e | 224 | my $multiline = 0; |
1b1ee2ef | 225 | # Loop to accumulate the message text all on one line. |
6ad282c7 | 226 | if (m/$source_msg_re(?:_nocontext)?\s*\(/) { |
78cd53af DM |
227 | while (not m/\);$/) { |
228 | my $nextline = <$codefh>; | |
229 | # Means we fell off the end of the file. Not terribly surprising; | |
230 | # this code tries to merge a lot of things that aren't regular C | |
231 | # code (preprocessor stuff, long comments). That's OK; we don't | |
232 | # need those anyway. | |
233 | last if not defined $nextline; | |
234 | chomp $nextline; | |
235 | $nextline =~ s/^\s+//; | |
236 | $_ =~ s/\\$//; | |
237 | # Note that we only want to do this where *both* are true. | |
238 | if ($_ =~ m/"$/ and $nextline =~ m/^"/) { | |
239 | $_ =~ s/"$//; | |
240 | $nextline =~ s/^"//; | |
241 | } | |
242 | $_ .= $nextline; | |
243 | ++$multiline; | |
fe13d51d | 244 | } |
fe13d51d JM |
245 | } |
246 | # This should happen *after* unwrapping, or we don't reformat the things | |
247 | # in later lines. | |
78cd53af DM |
248 | |
249 | s/$specialformats_re/"%$specialformats{$1}" . (defined $2 ? '' : '"')/ge; | |
78d0fecf KW |
250 | |
251 | # Remove any remaining format modifiers, but not in %% | |
252 | s/ (?<!%) % $format_modifiers ( [dioxXucsfeEgGp] ) /%$1/xg; | |
253 | ||
fe13d51d | 254 | # The %"foo" thing needs to happen *before* this regex. |
1b1ee2ef KW |
255 | # diag($_); |
256 | # DIE is just return Perl_die | |
78cd53af DM |
257 | my ($name, $category); |
258 | if (/$source_msg_call_re/) { | |
259 | ($name, $category) = ($+{'text'}, $+{'category'}); | |
260 | } | |
261 | elsif (/$bad_version_re/) { | |
262 | ($name, $category) = ($+{'text'}, undef); | |
263 | } | |
b26f9440 FC |
264 | elsif (/$regcomp_fail_re/) { |
265 | # FAIL("foo") -> "foo in regex m/%s/" | |
266 | # vFAIL("foo") -> "foo in regex; marked by <-- HERE in m/%s/" | |
267 | ($name, $category) = ($+{'text'}, undef); | |
268 | $name .= | |
269 | " in regex" . ("; marked by <-- HERE in" x /vFAIL/) . " m/%s/"; | |
270 | } | |
78cd53af DM |
271 | else { |
272 | next; | |
273 | } | |
274 | ||
1b1ee2ef | 275 | my $severity = {croak => [qw/P F/], |
fe13d51d JM |
276 | die => [qw/P F/], |
277 | warn => [qw/W D S/], | |
1b1ee2ef KW |
278 | }->{$+{'routine'}||'die'}; |
279 | my @categories; | |
49a5993e | 280 | if (defined $category) { |
c0a76f06 | 281 | @categories = map {s/^WARN_//; lc $_} split /\s*[|,]\s*/, $category; |
1b1ee2ef | 282 | } |
c4ea5f2e | 283 | if ($listed_as and $listed_as_line == $. - $multiline) { |
c0a76f06 | 284 | $name = $listed_as; |
1b1ee2ef | 285 | } else { |
c0a76f06 DM |
286 | # The form listed in perldiag ignores most sorts of fancy printf |
287 | # formatting, or makes it more perlish. | |
4111bb7b | 288 | $name =~ s/%%/%/g; |
c0a76f06 DM |
289 | $name =~ s/%l[ud]/%d/g; |
290 | $name =~ s/%\.(\d+|\*)s/\%s/g; | |
ca53083a | 291 | $name =~ s/(?:%s){2,}/%s/g; |
de78ba8e | 292 | $name =~ s/(\\")|("\s*[A-Z_]+\s*")/$1 ? '"' : '%s'/egg; |
c0a76f06 | 293 | $name =~ s/\\t/\t/g; |
366fc280 | 294 | $name =~ s/\\n/\n/g; |
c0a76f06 DM |
295 | $name =~ s/\s+$//; |
296 | $name =~ s/(\\)\\/$1/g; | |
297 | } | |
fe13d51d | 298 | |
c0a76f06 DM |
299 | # Extra explanatory info on an already-listed error, doesn't |
300 | # need it's own listing. | |
301 | next if $name =~ m/^\t/; | |
fe13d51d | 302 | |
c0a76f06 DM |
303 | # Happens fairly often with PL_no_modify. |
304 | next if $name eq '%s'; | |
fe13d51d | 305 | |
c0a76f06 DM |
306 | # Special syntax for magic comment, allows ignoring the fact |
307 | # that it isn't listed. Only use in very special circumstances, | |
308 | # like this script failing to notice that the Perl_croak call is | |
309 | # inside an #if 0 block. | |
310 | next if $name eq 'SKIPME'; | |
fe13d51d | 311 | |
366fc280 FC |
312 | check_message(standardize($name),$codefn); |
313 | } | |
314 | } | |
315 | ||
316 | sub check_message { | |
317 | my($name,$codefn,$partial) = @_; | |
318 | my $key = $name =~ y/\n/ /r; | |
319 | my $ret; | |
2c86d456 | 320 | |
366fc280 FC |
321 | if (exists $entries{$key}) { |
322 | $ret = 1; | |
323 | if ( $entries{$key}{seen}++ ) { | |
c0a76f06 | 324 | # no need to repeat entries we've tested |
207e3571 | 325 | } elsif ($entries{$key}{todo}) { |
87a63fff | 326 | TODO: { |
c0a76f06 DM |
327 | no warnings 'once'; |
328 | local $::TODO = 'in DATA'; | |
329 | # There is no listing, but it is in the list of exceptions. TODO FAIL. | |
207e3571 | 330 | fail($key); |
c0a76f06 DM |
331 | diag( |
332 | " Message '$name'\n from $codefn line $. is not listed in $pod\n". | |
333 | " (but it wasn't documented in 5.10 either, so marking it TODO)." | |
334 | ); | |
87a63fff | 335 | } |
c0a76f06 DM |
336 | } else { |
337 | # We found an actual valid entry in perldiag.pod for this error. | |
b8d24c3d | 338 | pass($key); |
fe13d51d | 339 | } |
c0a76f06 | 340 | # Later, should start checking that the severity is correct, too. |
366fc280 FC |
341 | } elsif ($partial) { |
342 | # noop | |
c0a76f06 | 343 | } else { |
366fc280 FC |
344 | my $ok; |
345 | if ($name =~ /\n/) { | |
346 | $ok = 1; | |
347 | check_message($_,$codefn,1) or $ok = 0, last for split /\n/, $name; | |
348 | } | |
349 | if ($ok) { | |
350 | # noop | |
351 | } elsif ($make_exceptions_list) { | |
c0a76f06 DM |
352 | # We're making an updated version of the exception list, to |
353 | # stick in the __DATA__ section. I honestly can't think of | |
354 | # a situation where this is the right thing to do, but I'm | |
355 | # leaving it here, just in case one of my descendents thinks | |
356 | # it's a good idea. | |
366fc280 | 357 | print STDERR "$key\n"; |
c0a76f06 DM |
358 | } else { |
359 | # No listing found, and no excuse either. | |
360 | # Find the correct place in perldiag.pod, and add a stanza beginning =item $name. | |
361 | fail($name); | |
362 | diag(" Message '$name'\n from $codefn line $. is not listed in $pod"); | |
363 | } | |
364 | # seen it, so only fail once for this message | |
365 | $entries{$name}{seen}++; | |
366 | } | |
fe13d51d | 367 | |
c0a76f06 | 368 | die if $name =~ /%$/; |
366fc280 | 369 | return $ret; |
fe13d51d | 370 | } |
c0a76f06 | 371 | |
93f09d7b | 372 | # Lists all missing things as of the inauguration of this script, so we |
87a63fff | 373 | # don't have to go from "meh" to perfect all at once. |
b0227916 JM |
374 | # |
375 | # PLEASE DO NOT ADD TO THIS LIST. Instead, write an entry in | |
376 | # pod/perldiag.pod for your new (warning|error). | |
fed3ba5d NC |
377 | |
378 | # Also FIXME this test, as the first entry in TODO *is* covered by the | |
379 | # description: Malformed UTF-8 character (%s) | |
87a63fff | 380 | __DATA__ |
78d0fecf | 381 | Malformed UTF-8 character (unexpected non-continuation byte 0x%x, immediately after start byte 0x%x) |
fed3ba5d | 382 | |
5f2c6f7e | 383 | '%c' allowed only after types %s in %s |
87a63fff | 384 | bad top format reference |
5f2c6f7e FC |
385 | Cannot apply "%s" in non-PerlIO perl |
386 | Can't %s big-endian %ss on this | |
387 | Can't call mro_isa_changed_in() on anonymous symbol table | |
388 | Can't call mro_method_changed_in() on anonymous symbol table | |
87a63fff JM |
389 | Can't coerce readonly %s to string |
390 | Can't coerce readonly %s to string in %s | |
5f2c6f7e | 391 | Can't find string terminator %c%s%c anywhere before EOF |
87a63fff JM |
392 | Can't fix broken locale name "%s" |
393 | Can't get short module name from a handle | |
87a63fff | 394 | Can't locate object method "%s" via package "%s" (perhaps you forgot to load "%s"?) |
5f2c6f7e FC |
395 | Can't pipe "%s": %s |
396 | Can't spawn: %s | |
87a63fff JM |
397 | Can't spawn "%s": %s |
398 | Can't %s script `%s' with ARGV[0] being `%s' | |
399 | Can't %s "%s": %s | |
87a63fff | 400 | Can't %s `%s' with ARGV[0] being `%s' (looking for executables only, not found) |
973a7615 | 401 | Can't use string ("%s"%s) as a subroutine ref while "strict refs" in use |
4a68bf9d | 402 | \%c better written as $%c |
87a63fff | 403 | Character(s) in '%c' format wrapped in %s |
5f2c6f7e FC |
404 | chown not implemented! |
405 | clear %s | |
87a63fff JM |
406 | Code missing after '/' in pack |
407 | Code missing after '/' in unpack | |
87a63fff JM |
408 | Corrupted regexp opcode %d > %d |
409 | '%c' outside of string in pack | |
ca53083a | 410 | Debug leaking scalars child failed%s with errno %d: %s |
5f2c6f7e FC |
411 | '/' does not take a repeat count in %s |
412 | Don't know how to get file name | |
4a68bf9d | 413 | Don't know how to handle magic of type \%o |
87a63fff | 414 | -Dp not implemented on this platform |
b26f9440 | 415 | Empty \%c{} in regex; marked by <-- HERE in m/%s/ |
87a63fff | 416 | Error reading "%s": %s |
5f2c6f7e FC |
417 | execl not implemented! |
418 | EVAL without pos change exceeded limit in regex | |
b26f9440 | 419 | Expecting close bracket in regex; marked by <-- HERE in m/%s/ |
87a63fff JM |
420 | Filehandle opened only for %sput |
421 | Filehandle %s opened only for %sput | |
422 | Filehandle STD%s reopened as %s only for input | |
5f2c6f7e | 423 | filter_del can only delete in reverse order (currently) |
87a63fff | 424 | YOU 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! |
5f2c6f7e FC |
425 | fork() not implemented! |
426 | free %s | |
87a63fff JM |
427 | Free to wrong pool %p not %p |
428 | get %s %p %p %p | |
5f2c6f7e FC |
429 | gethostent not implemented! |
430 | getpwnam returned invalid UIC %o for user "%s" | |
87a63fff JM |
431 | glob failed (can't start child: %s) |
432 | glob failed (child exited with status %d%s) | |
433 | Goto undefined subroutine | |
434 | Goto undefined subroutine &%s | |
5f2c6f7e FC |
435 | Got signal %d |
436 | ()-group starts with a count in %s | |
437 | Illegal binary digit '%c' ignored | |
87a63fff | 438 | Illegal character %sin prototype for %s : %s |
5f2c6f7e FC |
439 | Illegal hexadecimal digit '%c' ignored |
440 | Illegal octal digit '%c' ignored | |
b26f9440 | 441 | Illegal pattern in regex; marked by <-- HERE in m/%s/ |
5f2c6f7e | 442 | Infinite recursion in regex |
4111bb7b | 443 | internal %<num>p might conflict with future printf extensions |
5f2c6f7e | 444 | Invalid argument to sv_cat_decode |
b26f9440 | 445 | Invalid [::] class in regex; marked by <-- HERE in m/%s/ |
b26f9440 | 446 | Invalid [] range "%*.*s" in regex; marked by <-- HERE in m/%s/ |
87a63fff JM |
447 | Invalid range "%c-%c" in transliteration operator |
448 | Invalid separator character %c%c%c in PerlIO layer specification %s | |
449 | Invalid TOKEN object ignored | |
450 | Invalid type '%c' in pack | |
451 | Invalid type '%c' in %s | |
452 | Invalid type '%c' in unpack | |
453 | Invalid type ',' in %s | |
5f2c6f7e | 454 | ioctlsocket not implemented! |
87a63fff JM |
455 | 'j' not supported on this platform |
456 | 'J' not supported on this platform | |
5f2c6f7e FC |
457 | killpg not implemented! |
458 | length() used on %s (did you mean "scalar(%s)"?) | |
459 | length() used on %hash (did you mean "scalar(keys %hash)"?) | |
460 | length() used on @array (did you mean "scalar(@array)"?) | |
461 | List form of pipe open not implemented | |
462 | Malformed integer in [] in %s | |
87a63fff | 463 | Malformed UTF-8 character (fatal) |
87a63fff JM |
464 | Missing (suid) fd script name |
465 | More than one argument to open | |
466 | More than one argument to open(,':%s') | |
de42a5a9 KW |
467 | mprotect for %p %u failed with %d |
468 | mprotect RW for %p %u failed with %d | |
5f2c6f7e FC |
469 | No %s allowed while running setgid |
470 | No %s allowed with (suid) fdscript | |
47b03dba | 471 | No such class field "%s" |
87a63fff | 472 | Not an XSUB reference |
87a63fff | 473 | Operator or semicolon missing before %c%s |
5f2c6f7e | 474 | Pattern subroutine nesting without pos change exceeded limit in regex |
87a63fff | 475 | Perl %s required--this is only %s, stopped |
b26f9440 | 476 | POSIX syntax [%c %c] is reserved for future extensions in regex; marked by <-- HERE in m/%s/ |
78d0fecf | 477 | ptr wrong %p != %p fl=%x nl=%p e=%p for %d |
87a63fff | 478 | Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?) |
b26f9440 | 479 | Regexp modifier "%c" may appear a maximum of twice in regex; marked by <-- HERE in m/%s/ |
b26f9440 FC |
480 | Regexp modifier "%c" may not appear twice in regex; marked by <-- HERE in m/%s/ |
481 | Regexp modifiers "%c" and "%c" are mutually exclusive in regex; marked by <-- HERE in m/%s/ | |
482 | Regexp *+ operand could be empty in regex; marked by <-- HERE in m/%s/ | |
5f2c6f7e | 483 | Repeated format line will never terminate (~~ and @#) |
87a63fff | 484 | Reversed %c= operator |
78d0fecf | 485 | %s(%f) failed |
87a63fff | 486 | %sCompilation failed in require |
b26f9440 FC |
487 | Sequence (?%c...) not implemented in regex; marked by <-- HERE in m/%s/ |
488 | Sequence (%s...) not recognized in regex; marked by <-- HERE in m/%s/ | |
b26f9440 FC |
489 | Sequence %s... not terminated in regex; marked by <-- HERE in m/%s/ |
490 | Sequence (?%c... not terminated in regex; marked by <-- HERE in m/%s/ | |
491 | Sequence (?(%c... not terminated in regex; marked by <-- HERE in m/%s/ | |
492 | Sequence (?R) not terminated in regex m/%s/ | |
87a63fff JM |
493 | set %s %p %p %p |
494 | %s free() ignored (RMAGIC, PERL_CORE) | |
495 | %s has too many errors. | |
496 | SIG%s handler "%s" not defined. | |
87a63fff JM |
497 | %s in %s |
498 | Size magic not implemented | |
87a63fff | 499 | %s number > %s non-portable |
87a63fff | 500 | %srealloc() %signored |
5f2c6f7e | 501 | %s in regex m/%s/ |
ca53083a | 502 | %s on %s %s |
5f2c6f7e | 503 | socketpair not implemented! |
87a63fff JM |
504 | Starting Full Screen process with flag=%d, mytype=%d |
505 | Starting PM process with flag=%d, mytype=%d | |
5f2c6f7e | 506 | sv_2iv assumed (U_V(fabs((double)SvNVX(sv))) < (UV)IV_MAX) but SvNVX(sv)=%f U_V is 0x%x, IV_MAX is 0x%x |
87a63fff | 507 | SWASHNEW didn't return an HV ref |
5f2c6f7e FC |
508 | switching effective gid is not implemented |
509 | switching effective uid is not implemented | |
510 | System V IPC is not implemented on this machine | |
87a63fff | 511 | -T and -B not implemented on filehandles |
5f2c6f7e FC |
512 | Terminating on signal SIG%s(%d) |
513 | The crypt() function is unimplemented due to excessive paranoia. | |
514 | The crypt() function is not implemented on NetWare | |
87a63fff JM |
515 | The flock() function is not implemented on NetWare |
516 | The rewinddir() function is not implemented on NetWare | |
517 | The seekdir() function is not implemented on NetWare | |
87a63fff JM |
518 | The telldir() function is not implemented on NetWare |
519 | Too deeply nested ()-groups in %s | |
87a63fff JM |
520 | Too many args on %s line of "%s" |
521 | U0 mode on a byte string | |
5f2c6f7e FC |
522 | unable to find VMSPIPE.COM for i/o piping |
523 | Unknown Unicode option value %d | |
524 | Unrecognized character %s; marked by <-- HERE after %s<-- HERE near column %d | |
87a63fff | 525 | Unstable directory path, current directory changed unexpectedly |
87a63fff | 526 | Unterminated compressed integer in unpack |
b26f9440 | 527 | Unterminated \g... pattern in regex; marked by <-- HERE in m/%s/ |
87a63fff JM |
528 | Usage: CODE(0x%x)(%s) |
529 | Usage: %s(%s) | |
530 | Usage: %s::%s(%s) | |
5f2c6f7e FC |
531 | Usage: File::Copy::rmscopy(from,to[,date_flag]) |
532 | Usage: VMS::Filespec::candelete(spec) | |
533 | Usage: VMS::Filespec::fileify(spec) | |
534 | Usage: VMS::Filespec::pathify(spec) | |
535 | Usage: VMS::Filespec::rmsexpand(spec[,defspec]) | |
536 | Usage: VMS::Filespec::unixify(spec) | |
537 | Usage: VMS::Filespec::unixpath(spec) | |
87a63fff | 538 | Usage: VMS::Filespec::unixrealpath(spec) |
5f2c6f7e FC |
539 | Usage: VMS::Filespec::vmsify(spec) |
540 | Usage: VMS::Filespec::vmspath(spec) | |
87a63fff JM |
541 | Usage: VMS::Filespec::vmsrealpath(spec) |
542 | Use of inherited AUTOLOAD for non-method %s::%s() is deprecated | |
78d0fecf | 543 | utf8 "\x%X" does not map to Unicode |
87a63fff | 544 | Value of logical "%s" too long. Truncating to %i bytes |
5f2c6f7e | 545 | waitpid: process %x is not a child of process %x |
87a63fff JM |
546 | Wide character |
547 | Wide character in $/ | |
5f2c6f7e | 548 | Within []-length '*' not allowed in %s |
87a63fff JM |
549 | Within []-length '%c' not allowed in %s |
550 | Wrong syntax (suid) fd script name "%s" | |
5f2c6f7e | 551 | 'X' outside of string in %s |
87a63fff | 552 | 'X' outside of string in unpack |