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