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