This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
ebf9b486ba021adeef7fbd4e70d2757c628dda45
[perl5.git] / t / porting / diag.t
1 #!/usr/bin/perl
2
3 BEGIN {
4   @INC = '..' if -f '../TestInit.pm';
5 }
6 use TestInit qw(T); # T is chdir to the top level
7
8 use warnings;
9 use strict;
10
11 require 't/test.pl';
12 plan('no_plan');
13
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.
20 my $make_exceptions_list = ($ARGV[0]||'') eq '--make-exceptions-list';
21
22 require 'regen/embed_lib.pl';
23
24 # Look for functions that look like they could be diagnostic ones.
25 my @functions;
26 foreach (@{(setup_embed())[0]}) {
27   next if @$_ < 2;
28   next unless $_->[2]  =~ /warn|err|(\b|_)die|croak/i;
29   # The flag p means that this function may have a 'Perl_' prefix
30   # The flag s means that this function may have a 'S_' prefix
31   push @functions, $_->[2];
32   push @functions, 'Perl_' . $_->[2] if $_->[0] =~ /p/;
33   push @functions, 'S_' . $_->[2] if $_->[0] =~ /s/;
34 };
35
36 my $regcomp_re = "(?<routine>(?:ckWARN(?:\\d+)?reg\\w*|vWARN\\d+))";
37 my $function_re = join '|', @functions;
38 my $regcomp_fail_re = '\b(?:(?:Simple_)?v)?FAIL[2-4]?\b';
39 my $source_msg_re =
40    "(?<routine>\\bDIE\\b|$function_re|$regcomp_fail_re)";
41 my $text_re = '"(?<text>(?:\\\\"|[^"]|"\s*[A-Z_]+\s*")*)"';
42 my $source_msg_call_re = qr/$source_msg_re(?:_nocontext)? \s*
43     \(aTHX_ \s*
44     (?:packWARN\d*\((?<category>.*?)\),)? \s*
45     $text_re /x;
46 my $bad_version_re = qr{BADVERSION\([^"]*$text_re};
47    $regcomp_fail_re = qr/$regcomp_fail_re\([^"]*$text_re/;
48 my $regcomp_call_re = qr/$regcomp_re.*?$text_re/;
49
50 my %entries;
51
52 # Get the ignores that are compiled into this file
53 my $reading_categorical_exceptions;
54 while (<DATA>) {
55   chomp;
56   $entries{$_}{todo} = 1;
57   $reading_categorical_exceptions and $entries{$_}{cattodo}=1;
58   /__CATEGORIES__/ and ++$reading_categorical_exceptions;
59 }
60
61 my $pod = "pod/perldiag.pod";
62 my $cur_entry;
63 open my $diagfh, "<", $pod
64   or die "Can't open $pod: $!";
65
66 my $category_re = qr/ [a-z0-9_:]+?/;    # Note: requires an initial space
67 my $severity_re = qr/ . (?: \| . )* /x; # A severity is a single char, but can
68                                         # be of the form 'S|P|W'
69 my @same_descr;
70 while (<$diagfh>) {
71   if (m/^=item (.*)/) {
72     $cur_entry = $1;
73
74     # Allow multi-line headers
75     while (<$diagfh>) {
76       if (/^\s*$/) {
77         last;
78       }
79
80       $cur_entry .= $_;
81     }
82
83     $cur_entry =~ s/\n/ /gs; # Fix multi-line headers if they have \n's
84     $cur_entry =~ s/\s+\z//;
85
86     if (exists $entries{$cur_entry} &&  $entries{$cur_entry}{todo}
87                                     && !$entries{$cur_entry}{cattodo}) {
88         TODO: {
89             local $::TODO = "Remove the TODO entry \"$cur_entry\" from DATA as it is already in $pod near line $.";
90             ok($cur_entry);
91         }
92     }
93     # Make sure to init this here, so an actual entry in perldiag
94     # overwrites one in DATA.
95     $entries{$cur_entry}{todo} = 0;
96     $entries{$cur_entry}{line_number} = $.;
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} =
109         $2 && join ", ", sort split " ", $2 =~ y/,//dr;
110
111       # Record it also for other messages sharing the same description
112       @$_{qw<severity category>} =
113         @{$entries{$cur_entry}}{qw<severity category>}
114        for @same_descr;
115     }
116     elsif (! $entries{$cur_entry}{first_line} && $_ =~ /\S/) {
117
118       # Keep track of first line of text if doesn't contain a severity, so
119       # that can later examine it to determine if that is ok or not
120       $entries{$cur_entry}{first_line} = $_;
121     }
122     if (/\S/) {
123       @same_descr = ();
124     }
125     else {
126       push @same_descr, $entries{$cur_entry};
127     }
128   }
129 }
130
131 foreach my $cur_entry ( keys %entries) {
132     next if $entries{$cur_entry}{todo}; # If in this file, won't have a severity
133     if (! exists $entries{$cur_entry}{severity}
134
135             # If there is no first line, it was two =items in a row, so the
136             # second one is the one with with text, not this one.
137         && exists $entries{$cur_entry}{first_line}
138
139             # If the first line refers to another message, no need for severity
140         && $entries{$cur_entry}{first_line} !~ /^See/)
141     {
142         fail($cur_entry);
143         diag(
144             "   $pod entry at line $entries{$cur_entry}{line_number}\n"
145           . "       \"$cur_entry\"\n"
146           . "   is missing a severity and/or category"
147         );
148     }
149 }
150
151 # List from perlguts.pod "Formatted Printing of IVs, UVs, and NVs"
152 # Convert from internal formats to ones that the readers will be familiar
153 # with, while removing any format modifiers, such as precision, the
154 # presence of which would just confuse the pod's explanation
155 my %specialformats = (IVdf => 'd',
156                       UVuf => 'd',
157                       UVof => 'o',
158                       UVxf => 'x',
159                       UVXf => 'X',
160                       NVef => 'f',
161                       NVff => 'f',
162                       NVgf => 'f',
163                       HEKf256=>'s',
164                       HEKf => 's',
165                       SVf256=>'s',
166                       SVf32=> 's',
167                       SVf  => 's');
168 my $format_modifiers = qr/ [#0\ +-]*              # optional flags
169                           (?: [1-9][0-9]* | \* )? # optional field width
170                           (?: \. \d* )?           # optional precision
171                           (?: h|l )?              # optional length modifier
172                         /x;
173
174 my $specialformats =
175  join '|', sort { length $b cmp length $a } keys %specialformats;
176 my $specialformats_re = qr/%$format_modifiers"\s*($specialformats)(\s*")?/;
177
178 open my $fh, '<', 'MANIFEST' or die "Can't open MANIFEST: $!";
179 while (my $file = <$fh>) {
180     chomp $file;
181     $file =~ s/\s+.*//;
182     next unless $file =~ /\.(?:c|cpp|h|xs|y)\z/ or $file =~ /^perly\./;
183     # OS/2 extensions have never been migrated to ext/, hence the special case:
184     next if $file =~ m!\A(?:ext|dist|cpan|lib|t|os2/OS2)/!
185             && $file !~ m!\Aext/DynaLoader/!;
186     check_file($file);
187 }
188 close $fh or die $!;
189
190 # Standardize messages with variants into the form that appears
191 # in perldiag.pod -- useful for things without a diag_listed_as annotation
192 sub standardize {
193   my ($name) = @_;
194
195   if    ( $name =~ m/^(Invalid strict version format) \([^\)]*\)/ ) {
196     $name = "$1 (\%s)";
197   }
198   elsif ( $name =~ m/^(Invalid version format) \([^\)]*\)/ ) {
199     $name = "$1 (\%s)";
200   }
201   elsif ($name =~ m/^panic: /) {
202     $name = "panic: \%s";
203   }
204
205   return $name;
206 }
207
208 sub check_file {
209   my ($codefn) = @_;
210
211   print "# Checking $codefn\n";
212
213   open my $codefh, "<", $codefn
214     or die "Can't open $codefn: $!";
215
216   my $listed_as;
217   my $listed_as_line;
218   my $sub = 'top of file';
219   while (<$codefh>) {
220     chomp;
221     # Getting too much here isn't a problem; we only use this to skip
222     # errors inside of XS modules, which should get documented in the
223     # docs for the module.
224     if (m<^[^#\s]> and $_ !~ m/^[{}]*$/) {
225       $sub = $_;
226     }
227     next if $sub =~ m/^XS/;
228     if (m</\*\s*diag_listed_as: (.*?)\s*\*/>) {
229       $listed_as = $1;
230       $listed_as_line = $.+1;
231     }
232     next if /^#/;
233
234     my $multiline = 0;
235     # Loop to accumulate the message text all on one line.
236     if (m/(?:$source_msg_re(?:_nocontext)?|$regcomp_re)\s*\(/) {
237       while (not m/\);$/) {
238         my $nextline = <$codefh>;
239         # Means we fell off the end of the file.  Not terribly surprising;
240         # this code tries to merge a lot of things that aren't regular C
241         # code (preprocessor stuff, long comments).  That's OK; we don't
242         # need those anyway.
243         last if not defined $nextline;
244         chomp $nextline;
245         $nextline =~ s/^\s+//;
246         $_ =~ s/\\$//;
247         # Note that we only want to do this where *both* are true.
248         if ($_ =~ m/"$/ and $nextline =~ m/^"/) {
249           $_ =~ s/"$//;
250           $nextline =~ s/^"//;
251         }
252         $_ .= $nextline;
253         ++$multiline;
254       }
255     }
256     # This should happen *after* unwrapping, or we don't reformat the things
257     # in later lines.
258
259     s/$specialformats_re/"%$specialformats{$1}" .  (defined $2 ? '' : '"')/ge;
260
261     # Remove any remaining format modifiers, but not in %%
262     s/ (?<!%) % $format_modifiers ( [dioxXucsfeEgGp] ) /%$1/xg;
263
264     # The %"foo" thing needs to happen *before* this regex.
265     # diag($_);
266     # DIE is just return Perl_die
267     my ($name, $category, $routine);
268     if (/$source_msg_call_re/) {
269       ($name, $category, $routine) = ($+{'text'}, $+{'category'}, $+{'routine'});
270       # Sometimes the regexp will pick up too much for the category
271       # e.g., WARN_UNINITIALIZED), PL_warn_uninit_sv ... up to the next )
272       $category && $category =~ s/\).*//s;
273     }
274     elsif (/$bad_version_re/) {
275       ($name, $category) = ($+{'text'}, undef);
276     }
277     elsif (/$regcomp_fail_re/) {
278       #  FAIL("foo") -> "foo in regex m/%s/"
279       # vFAIL("foo") -> "foo in regex; marked by <-- HERE in m/%s/"
280       ($name, $category) = ($+{'text'}, undef);
281       $name .=
282         " in regex" . ("; marked by <-- HERE in" x /vFAIL/) . " m/%s/";
283     }
284     elsif (/$regcomp_call_re/) {
285       # vWARN/ckWARNreg("foo") -> "foo in regex; marked by <-- HERE in m/%s/
286       ($name, $category, $routine) = ($+{'text'}, undef, $+{'routine'});
287       $name .= " in regex; marked by <-- HERE in m/%s/";
288       $category = 'WARN_REGEXP';
289       if ($routine =~ /dep/) {
290         $category .= ',WARN_DEPRECATED';
291       }
292     }
293     else {
294       next;
295     }
296
297     # Try to guess what the severity should be.  In the case of
298     # Perl_ck_warner and other _ck_ functions, we can tell whether it is
299     # a severe/default warning or no by the _d suffix.  In the case of
300     # other warn functions we cannot tell, because Perl_warner may be pre-
301     # ceded by if(ckWARN) or if(ckWARN_d).
302     my $severity = !$routine                   ? '[PFX]'
303                  :  $routine =~ /warn.*_d\z/   ? '[DS]'
304                  :  $routine =~ /ck_warn/      ?  'W'
305                  :  $routine =~ /warner/       ? '[WDS]'
306                  :  $routine =~ /warn/         ?  'S'
307                  :  $routine =~ /ckWARN.*dep/  ?  'D'
308                  :  $routine =~ /ckWARN\d*reg/ ?  'W'
309                  :  $routine =~ /vWARN\d/      ? '[WDS]'
310                  :                             '[PFX]';
311     my $categories;
312     if (defined $category) {
313       $category =~ s/__/::/g;
314       $categories =
315         join ", ",
316               sort map {s/^WARN_//; lc $_} split /\s*[|,]\s*/, $category;
317     }
318     if ($listed_as and $listed_as_line == $. - $multiline) {
319       $name = $listed_as;
320     } else {
321       # The form listed in perldiag ignores most sorts of fancy printf
322       # formatting, or makes it more perlish.
323       $name =~ s/%%/%/g;
324       $name =~ s/%l[ud]/%d/g;
325       $name =~ s/%\.(\d+|\*)s/\%s/g;
326       $name =~ s/(?:%s){2,}/%s/g;
327       $name =~ s/(\\")|("\s*[A-Z_]+\s*")/$1 ? '"' : '%s'/egg;
328       $name =~ s/\\t/\t/g;
329       $name =~ s/\\n/\n/g;
330       $name =~ s/\s+$//;
331       $name =~ s/(\\)\\/$1/g;
332     }
333
334     # Extra explanatory info on an already-listed error, doesn't
335     # need it's own listing.
336     next if $name =~ m/^\t/;
337
338     # Happens fairly often with PL_no_modify.
339     next if $name eq '%s';
340
341     # Special syntax for magic comment, allows ignoring the fact
342     # that it isn't listed.  Only use in very special circumstances,
343     # like this script failing to notice that the Perl_croak call is
344     # inside an #if 0 block.
345     next if $name eq 'SKIPME';
346
347     next if $name=~/\[TESTING\]/; # ignore these as they are works in progress
348
349     check_message(standardize($name),$codefn,$severity,$categories);
350   }
351 }
352
353 sub check_message {
354     my($name,$codefn,$severity,$categories,$partial) = @_;
355     my $key = $name =~ y/\n/ /r;
356     my $ret;
357
358     # Try to reduce printf() formats to simplest forms
359     # Really this should be matching %s, etc like diagnostics.pm does
360
361     # Kill flags
362     $key =~ s/%[#0\-+]/%/g;
363
364     # Kill width
365     $key =~ s/\%(\d+|\*)/%/g;
366
367     # Kill precision
368     $key =~ s/\%\.(\d+|\*)/%/g;
369
370     if (exists $entries{$key} and
371           # todo + cattodo means it is not found and it is not in the
372           # regular todo list, either
373           !$entries{$key}{todo} || !$entries{$key}{cattodo}) {
374       $ret = 1;
375       if ( $entries{$key}{seen}++ ) {
376         # no need to repeat entries we've tested
377       } elsif ($entries{$key}{todo}) {
378         TODO: {
379           no warnings 'once';
380           local $::TODO = 'in DATA';
381           # There is no listing, but it is in the list of exceptions.  TODO FAIL.
382           fail($key);
383           diag(
384             "    Message '$name'\n    from $codefn line $. is not listed in $pod\n".
385             "    (but it wasn't documented in 5.10 either, so marking it TODO)."
386           );
387         }
388       } else {
389         # We found an actual valid entry in perldiag.pod for this error.
390         pass($key);
391
392         return $ret
393           if $entries{$key}{cattodo};
394
395         # Now check the category and severity
396
397         # Cache our severity qr thingies
398         use feature 'state';
399         state %qrs;
400         my $qr = $qrs{$severity} ||= qr/$severity/;
401
402         like($entries{$key}{severity}, $qr,
403           $severity =~ /\[/
404             ? "severity is one of $severity for $key"
405             : "severity is $severity for $key");
406
407         is($entries{$key}{category}, $categories,
408            ($categories ? "categories are [$categories]" : "no category")
409              . " for $key");
410       }
411     } elsif ($partial) {
412       # noop
413     } else {
414       my $ok;
415       if ($name =~ /\n/) {
416         $ok = 1;
417         check_message($_,$codefn,$severity,$categories,1) or $ok = 0, last
418           for split /\n/, $name;
419       }
420       if ($ok) {
421         # noop
422       } elsif ($make_exceptions_list) {
423         # We're making an updated version of the exception list, to
424         # stick in the __DATA__ section.  I honestly can't think of
425         # a situation where this is the right thing to do, but I'm
426         # leaving it here, just in case one of my descendents thinks
427         # it's a good idea.
428         print STDERR "$key\n";
429       } else {
430         # No listing found, and no excuse either.
431         # Find the correct place in perldiag.pod, and add a stanza beginning =item $name.
432         fail($name);
433         diag("    Message '$name'\n    from $codefn line $. is not listed in $pod");
434       }
435       # seen it, so only fail once for this message
436       $entries{$name}{seen}++;
437     }
438
439     die if $name =~ /%$/;
440     return $ret;
441 }
442
443 # Lists all missing things as of the inauguration of this script, so we
444 # don't have to go from "meh" to perfect all at once.
445
446 # PLEASE DO NOT ADD TO THIS LIST.  Instead, write an entry in
447 # pod/perldiag.pod for your new (warning|error).  Nevertheless,
448 # listing exceptions here when this script is not smart enough
449 # to recognize the messages is not so bad, as long as there are
450 # entries in perldiag.
451
452 # Entries after __CATEGORIES__ are those that are in perldiag but fail the
453 # severity/category test.
454
455 # Also FIXME this test, as the first entry in TODO *is* covered by the
456 # description: Malformed UTF-8 character (%s)
457 __DATA__
458 Malformed UTF-8 character (unexpected non-continuation byte 0x%x, immediately after start byte 0x%x)
459
460 bad top format reference
461 Cannot apply "%s" in non-PerlIO perl
462 Can't %s big-endian %ss on this
463 Can't call mro_isa_changed_in() on anonymous symbol table
464 Can't call mro_method_changed_in() on anonymous symbol table
465 Can't coerce readonly %s to string
466 Can't coerce readonly %s to string in %s
467 Can't find string terminator %c%s%c anywhere before EOF
468 Can't fix broken locale name "%s"
469 Can't get short module name from a handle
470 Can't locate object method "%s" via package "%s" (perhaps you forgot to load "%s"?)
471 Can't pipe "%s": %s
472 Can't spawn: %s
473 Can't spawn "%s": %s
474 Can't %s script `%s' with ARGV[0] being `%s'
475 Can't %s "%s": %s
476 Can't %s `%s' with ARGV[0] being `%s' (looking for executables only, not found)
477 Can't use string ("%s"%s) as a subroutine ref while "strict refs" in use
478 \%c better written as $%c
479 Character(s) in '%c' format wrapped in %s
480 chown not implemented!
481 clear %s
482 Code missing after '/' in pack
483 Code missing after '/' in unpack
484 '%c' outside of string in pack
485 Debug leaking scalars child failed%s with errno %d: %s
486 '/' does not take a repeat count in %s
487 Don't know how to get file name
488 Don't know how to handle magic of type \%o
489 -Dp not implemented on this platform
490 Error reading "%s": %s
491 execl not implemented!
492 EVAL without pos change exceeded limit in regex
493 Filehandle opened only for %sput
494 Filehandle %s opened only for %sput
495 Filehandle STD%s reopened as %s only for input
496 filter_del can only delete in reverse order (currently)
497 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!
498 fork() not implemented!
499 free %s
500 Free to wrong pool %p not %p
501 get %s %p %p %p
502 gethostent not implemented!
503 getpwnam returned invalid UIC %o for user "%s"
504 glob failed (can't start child: %s)
505 glob failed (child exited with status %d%s)
506 Goto undefined subroutine
507 Goto undefined subroutine &%s
508 Got signal %d
509 ()-group starts with a count in %s
510 Illegal binary digit '%c' ignored
511 Illegal character %sin prototype for %s : %s
512 Illegal hexadecimal digit '%c' ignored
513 Illegal octal digit '%c' ignored
514 Infinite recursion in regex
515 internal %<num>p might conflict with future printf extensions
516 Invalid argument to sv_cat_decode
517 Invalid range "%c-%c" in transliteration operator
518 Invalid separator character %c%c%c in PerlIO layer specification %s
519 Invalid TOKEN object ignored
520 Invalid type '%c' in pack
521 Invalid type '%c' in %s
522 Invalid type '%c' in unpack
523 Invalid type ',' in %s
524 ioctlsocket not implemented!
525 killpg not implemented!
526 length() used on %s (did you mean "scalar(%s)"?)
527 length() used on %hash (did you mean "scalar(keys %hash)"?)
528 length() used on @array (did you mean "scalar(@array)"?)
529 List form of pipe open not implemented
530 Malformed integer in [] in %s
531 Malformed UTF-8 character (fatal)
532 Missing (suid) fd script name
533 More than one argument to open
534 More than one argument to open(,':%s')
535 mprotect for %p %u failed with %d
536 mprotect RW for %p %u failed with %d
537 \N{} in character class restricted to one character in regex; marked by <-- HERE in m/%s/
538 No %s allowed while running setgid
539 No %s allowed with (suid) fdscript
540 No such class field "%s"
541 Not an XSUB reference
542 Operator or semicolon missing before %c%s
543 Pattern subroutine nesting without pos change exceeded limit in regex
544 Perl %s required--this is only %s, stopped
545 PerlApp::TextQuery: no arguments, please
546 POSIX syntax [%c %c] is reserved for future extensions in regex; marked by <-- HERE in m/%s/
547 ptr wrong %p != %p fl=%x nl=%p e=%p for %d
548 Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)
549 Regexp modifier "%c" may appear a maximum of twice in regex; marked by <-- HERE in m/%s/
550 Regexp modifier "%c" may not appear twice in regex; marked by <-- HERE in m/%s/
551 Regexp modifiers "%c" and "%c" are mutually exclusive in regex; marked by <-- HERE in m/%s/
552 Regexp *+ operand could be empty in regex; marked by <-- HERE in m/%s/
553 Repeated format line will never terminate (~~ and @#)
554 Reversed %c= operator
555 %s(%f) failed
556 %sCompilation failed in require
557 Sequence (?%c...) not implemented in regex; marked by <-- HERE in m/%s/
558 Sequence (%s...) not recognized in regex; marked by <-- HERE in m/%s/
559 Sequence %s... not terminated in regex; marked by <-- HERE in m/%s/
560 Sequence (?%c... not terminated in regex; marked by <-- HERE in m/%s/
561 Sequence (?(%c... not terminated in regex; marked by <-- HERE in m/%s/
562 Sequence (?R) not terminated in regex m/%s/
563 set %s %p %p %p
564 %s free() ignored (RMAGIC, PERL_CORE)
565 %s has too many errors.
566 SIG%s handler "%s" not defined.
567 %s in %s
568 Size magic not implemented
569 %s number > %s non-portable
570 %srealloc() %signored
571 %s in regex m/%s/
572 %s on %s %s
573 socketpair not implemented!
574 Starting Full Screen process with flag=%d, mytype=%d
575 Starting PM process with flag=%d, mytype=%d
576 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
577 SWASHNEW didn't return an HV ref
578 switching effective gid is not implemented
579 switching effective uid is not implemented
580 System V IPC is not implemented on this machine
581 -T and -B not implemented on filehandles
582 Terminating on signal SIG%s(%d)
583 The crypt() function is not implemented on NetWare
584 The flock() function is not implemented on NetWare
585 The rewinddir() function is not implemented on NetWare
586 The seekdir() function is not implemented on NetWare
587 The telldir() function is not implemented on NetWare
588 Too deeply nested ()-groups in %s
589 Too many args on %s line of "%s"
590 U0 mode on a byte string
591 unable to find VMSPIPE.COM for i/o piping
592 Unknown Unicode option value %d
593 Unrecognized character %s; marked by <-- HERE after %s<-- HERE near column %d
594 Unstable directory path, current directory changed unexpectedly
595 Unterminated compressed integer in unpack
596 Usage: CODE(0x%x)(%s)
597 Usage: %s(%s)
598 Usage: %s::%s(%s)
599 Usage: File::Copy::rmscopy(from,to[,date_flag])
600 Usage: VMS::Filespec::candelete(spec)
601 Usage: VMS::Filespec::fileify(spec)
602 Usage: VMS::Filespec::pathify(spec)
603 Usage: VMS::Filespec::rmsexpand(spec[,defspec])
604 Usage: VMS::Filespec::unixify(spec)
605 Usage: VMS::Filespec::unixpath(spec)
606 Usage: VMS::Filespec::unixrealpath(spec)
607 Usage: VMS::Filespec::vmsify(spec)
608 Usage: VMS::Filespec::vmspath(spec)
609 Usage: VMS::Filespec::vmsrealpath(spec)
610 Use of inherited AUTOLOAD for non-method %s::%s() is deprecated
611 utf8 "\x%X" does not map to Unicode
612 Value of logical "%s" too long. Truncating to %i bytes
613 waitpid: process %x is not a child of process %x
614 Wide character
615 Wide character in $/
616 Within []-length '*' not allowed in %s
617 Within []-length '%c' not allowed in %s
618 Wrong syntax (suid) fd script name "%s"
619 'X' outside of string in %s
620 'X' outside of string in unpack
621 Zero length \N{} in regex; marked by <-- HERE in m/%s/
622
623 __CATEGORIES__
624 Code point 0x%X is not Unicode, all \p{} matches fail; all \P{} matches succeed
625 Code point 0x%X is not Unicode, may not be portable
626 Illegal character \%o (carriage return)
627 Missing argument in %s
628 Unicode non-character U+%X is illegal for open interchange
629 Operation "%s" returns its argument for non-Unicode code point 0x%X
630 Operation "%s" returns its argument for UTF-16 surrogate U+%X
631 Unicode surrogate U+%X is illegal in UTF-8
632 UTF-16 surrogate U+%X
633 False [] range "%s" in regex; marked by <-- HERE in m/%s/