xref: /openbsd-src/gnu/usr.bin/perl/t/porting/diag.t (revision 50b7afb2c2c0993b0894d4e34bf857cb13ed9c80)
1#!/usr/bin/perl
2use warnings;
3use strict;
4
5BEGIN {
6  chdir 't';
7  require './test.pl';
8}
9
10plan('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.
20my $make_exceptions_list = ($ARGV[0]||'') eq '--make-exceptions-list';
21
22chdir '..' or die "Can't chdir ..: $!";
23BEGIN { defined $ENV{PERL_UNICODE} and push @INC, "lib"; }
24
25my @functions;
26
27open 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.
30while (<$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
52close $func_fh;
53
54my $regcomp_re = "(?<routine>(?:ckWARN(?:\\d+)?reg\\w*|vWARN\\d+))";
55my $function_re = join '|', @functions;
56my $regcomp_fail_re = '\b(?:(?:Simple_)?v)?FAIL[2-4]?\b';
57my $source_msg_re =
58   "(?<routine>\\bDIE\\b|$function_re|$regcomp_fail_re)";
59my $text_re = '"(?<text>(?:\\\\"|[^"]|"\s*[A-Z_]+\s*")*)"';
60my $source_msg_call_re = qr/$source_msg_re(?:_nocontext)? \s*
61    \(aTHX_ \s*
62    (?:packWARN\d*\((?<category>.*?)\),)? \s*
63    $text_re /x;
64my $bad_version_re = qr{BADVERSION\([^"]*$text_re};
65   $regcomp_fail_re = qr/$regcomp_fail_re\([^"]*$text_re/;
66my $regcomp_call_re = qr/$regcomp_re.*?$text_re/;
67
68my %entries;
69
70# Get the ignores that are compiled into this file
71my $reading_categorical_exceptions;
72while (<DATA>) {
73  chomp;
74  $entries{$_}{$reading_categorical_exceptions ? 'cattodo' : 'todo'}=1;
75  /__CATEGORIES__/ and ++$reading_categorical_exceptions;
76}
77
78my $pod = "pod/perldiag.pod";
79my $cur_entry;
80open my $diagfh, "<", $pod
81  or die "Can't open $pod: $!";
82
83my $category_re = qr/ [a-z0-9_:]+?/;    # Note: requires an initial space
84my $severity_re = qr/ . (?: \| . )* /x; # A severity is a single char, but can
85                                        # be of the form 'S|P|W'
86my @same_descr;
87while (<$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
147foreach 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
171my %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');
184my $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
190my $specialformats =
191 join '|', sort { length $b cmp length $a } keys %specialformats;
192my $specialformats_re = qr/%$format_modifiers"\s*($specialformats)(\s*")?/;
193
194open my $fh, '<', 'MANIFEST' or die "Can't open MANIFEST: $!";
195while (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}
204close $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
208sub 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
224sub 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    next if $name=~/\[TESTING\]/; # ignore these as they are works in progress
363
364    check_message(standardize($name),$codefn,$severity,$categories);
365  }
366}
367
368sub check_message {
369    my($name,$codefn,$severity,$categories,$partial) = @_;
370    my $key = $name =~ y/\n/ /r;
371    my $ret;
372
373    # Try to reduce printf() formats to simplest forms
374    # Really this should be matching %s, etc like diagnostics.pm does
375
376    # Kill flags
377    $key =~ s/%[#0\-+]/%/g;
378
379    # Kill width
380    $key =~ s/\%(\d+|\*)/%/g;
381
382    # Kill precision
383    $key =~ s/\%\.(\d+|\*)/%/g;
384
385    if (exists $entries{$key}) {
386      $ret = 1;
387      if ( $entries{$key}{seen}++ ) {
388        # no need to repeat entries we've tested
389      } elsif ($entries{$key}{todo}) {
390        TODO: {
391          no warnings 'once';
392          local $::TODO = 'in DATA';
393          # There is no listing, but it is in the list of exceptions.  TODO FAIL.
394          fail($key);
395          diag(
396            "    Message '$name'\n    from $codefn line $. is not listed in $pod\n".
397            "    (but it wasn't documented in 5.10 either, so marking it TODO)."
398          );
399        }
400      } else {
401        # We found an actual valid entry in perldiag.pod for this error.
402        pass($key);
403
404        # Now check the category and severity
405
406        # Cache our severity qr thingies
407        use 5.01;
408        state %qrs;
409        my $qr = $qrs{$severity} ||= qr/$severity/;
410
411        return $ret
412          if $entries{$key}{cattodo};
413
414        like $entries{$key}{severity}, $qr,
415          $severity =~ /\[/
416            ? "severity is one of $severity for $key"
417            : "severity is $severity for $key";
418
419        is $entries{$key}{category}, $categories,
420           ($categories ? "categories are [$categories]" : "no category")
421             . " for $key";
422      }
423      # Later, should start checking that the severity is correct, too.
424    } elsif ($partial) {
425      # noop
426    } else {
427      my $ok;
428      if ($name =~ /\n/) {
429        $ok = 1;
430        check_message($_,$codefn,$severity,$categories,1) or $ok = 0, last
431          for split /\n/, $name;
432      }
433      if ($ok) {
434        # noop
435      } elsif ($make_exceptions_list) {
436        # We're making an updated version of the exception list, to
437        # stick in the __DATA__ section.  I honestly can't think of
438        # a situation where this is the right thing to do, but I'm
439        # leaving it here, just in case one of my descendents thinks
440        # it's a good idea.
441        print STDERR "$key\n";
442      } else {
443        # No listing found, and no excuse either.
444        # Find the correct place in perldiag.pod, and add a stanza beginning =item $name.
445        fail($name);
446        diag("    Message '$name'\n    from $codefn line $. is not listed in $pod");
447      }
448      # seen it, so only fail once for this message
449      $entries{$name}{seen}++;
450    }
451
452    die if $name =~ /%$/;
453    return $ret;
454}
455
456# Lists all missing things as of the inauguration of this script, so we
457# don't have to go from "meh" to perfect all at once.
458#
459# PLEASE DO NOT ADD TO THIS LIST.  Instead, write an entry in
460# pod/perldiag.pod for your new (warning|error).
461
462# Entries after __CATEGORIES__ are those that are in perldiag but fail the
463# severity/category test.
464
465# Also FIXME this test, as the first entry in TODO *is* covered by the
466# description: Malformed UTF-8 character (%s)
467__DATA__
468Malformed UTF-8 character (unexpected non-continuation byte 0x%x, immediately after start byte 0x%x)
469
470'%c' allowed only after types %s in %s
471bad top format reference
472Cannot apply "%s" in non-PerlIO perl
473Can't %s big-endian %ss on this
474Can't call mro_isa_changed_in() on anonymous symbol table
475Can't call mro_method_changed_in() on anonymous symbol table
476Can't coerce readonly %s to string
477Can't coerce readonly %s to string in %s
478Can't find string terminator %c%s%c anywhere before EOF
479Can't fix broken locale name "%s"
480Can't get short module name from a handle
481Can't locate object method "%s" via package "%s" (perhaps you forgot to load "%s"?)
482Can't pipe "%s": %s
483Can't spawn: %s
484Can't spawn "%s": %s
485Can't %s script `%s' with ARGV[0] being `%s'
486Can't %s "%s": %s
487Can't %s `%s' with ARGV[0] being `%s' (looking for executables only, not found)
488Can't use string ("%s"%s) as a subroutine ref while "strict refs" in use
489\%c better written as $%c
490Character(s) in '%c' format wrapped in %s
491chown not implemented!
492clear %s
493Code missing after '/' in pack
494Code missing after '/' in unpack
495'%c' outside of string in pack
496Debug leaking scalars child failed%s with errno %d: %s
497'/' does not take a repeat count in %s
498Don't know how to get file name
499Don't know how to handle magic of type \%o
500-Dp not implemented on this platform
501Error reading "%s": %s
502execl not implemented!
503EVAL without pos change exceeded limit in regex
504Filehandle opened only for %sput
505Filehandle %s opened only for %sput
506Filehandle STD%s reopened as %s only for input
507filter_del can only delete in reverse order (currently)
508YOU 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!
509fork() not implemented!
510free %s
511Free to wrong pool %p not %p
512get %s %p %p %p
513gethostent not implemented!
514getpwnam returned invalid UIC %o for user "%s"
515glob failed (can't start child: %s)
516glob failed (child exited with status %d%s)
517Goto undefined subroutine
518Goto undefined subroutine &%s
519Got signal %d
520()-group starts with a count in %s
521Illegal binary digit '%c' ignored
522Illegal character %sin prototype for %s : %s
523Illegal hexadecimal digit '%c' ignored
524Illegal octal digit '%c' ignored
525Infinite recursion in regex
526internal %<num>p might conflict with future printf extensions
527Invalid argument to sv_cat_decode
528Invalid range "%c-%c" in transliteration operator
529Invalid separator character %c%c%c in PerlIO layer specification %s
530Invalid TOKEN object ignored
531Invalid type '%c' in pack
532Invalid type '%c' in %s
533Invalid type '%c' in unpack
534Invalid type ',' in %s
535ioctlsocket not implemented!
536'j' not supported on this platform
537'J' not supported on this platform
538killpg not implemented!
539length() used on %s (did you mean "scalar(%s)"?)
540length() used on %hash (did you mean "scalar(keys %hash)"?)
541length() used on @array (did you mean "scalar(@array)"?)
542List form of pipe open not implemented
543Malformed integer in [] in %s
544Malformed UTF-8 character (fatal)
545Missing (suid) fd script name
546More than one argument to open
547More than one argument to open(,':%s')
548mprotect for %p %u failed with %d
549mprotect RW for %p %u failed with %d
550No %s allowed while running setgid
551No %s allowed with (suid) fdscript
552No such class field "%s"
553Not an XSUB reference
554Operator or semicolon missing before %c%s
555Pattern subroutine nesting without pos change exceeded limit in regex
556Perl %s required--this is only %s, stopped
557PerlApp::TextQuery: no arguments, please
558POSIX syntax [%c %c] is reserved for future extensions in regex; marked by <-- HERE in m/%s/
559ptr wrong %p != %p fl=%x nl=%p e=%p for %d
560Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)
561Regexp modifier "%c" may appear a maximum of twice in regex; marked by <-- HERE in m/%s/
562Regexp modifier "%c" may not appear twice in regex; marked by <-- HERE in m/%s/
563Regexp modifiers "%c" and "%c" are mutually exclusive in regex; marked by <-- HERE in m/%s/
564Regexp *+ operand could be empty in regex; marked by <-- HERE in m/%s/
565Repeated format line will never terminate (~~ and @#)
566Reversed %c= operator
567%s(%f) failed
568%sCompilation failed in require
569Sequence (?%c...) not implemented in regex; marked by <-- HERE in m/%s/
570Sequence (%s...) not recognized in regex; marked by <-- HERE in m/%s/
571Sequence %s... not terminated in regex; marked by <-- HERE in m/%s/
572Sequence (?%c... not terminated in regex; marked by <-- HERE in m/%s/
573Sequence (?(%c... not terminated in regex; marked by <-- HERE in m/%s/
574Sequence (?R) not terminated in regex m/%s/
575set %s %p %p %p
576%s free() ignored (RMAGIC, PERL_CORE)
577%s has too many errors.
578SIG%s handler "%s" not defined.
579%s in %s
580Size magic not implemented
581%s number > %s non-portable
582%srealloc() %signored
583%s in regex m/%s/
584%s on %s %s
585socketpair not implemented!
586Starting Full Screen process with flag=%d, mytype=%d
587Starting PM process with flag=%d, mytype=%d
588sv_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
589SWASHNEW didn't return an HV ref
590switching effective gid is not implemented
591switching effective uid is not implemented
592System V IPC is not implemented on this machine
593-T and -B not implemented on filehandles
594Terminating on signal SIG%s(%d)
595The crypt() function is not implemented on NetWare
596The flock() function is not implemented on NetWare
597The rewinddir() function is not implemented on NetWare
598The seekdir() function is not implemented on NetWare
599The telldir() function is not implemented on NetWare
600Too deeply nested ()-groups in %s
601Too many args on %s line of "%s"
602U0 mode on a byte string
603unable to find VMSPIPE.COM for i/o piping
604Unknown Unicode option value %d
605Unrecognized character %s; marked by <-- HERE after %s<-- HERE near column %d
606Unstable directory path, current directory changed unexpectedly
607Unterminated compressed integer in unpack
608Unterminated \g... pattern in regex; marked by <-- HERE in m/%s/
609Usage: CODE(0x%x)(%s)
610Usage: %s(%s)
611Usage: %s::%s(%s)
612Usage: File::Copy::rmscopy(from,to[,date_flag])
613Usage: VMS::Filespec::candelete(spec)
614Usage: VMS::Filespec::fileify(spec)
615Usage: VMS::Filespec::pathify(spec)
616Usage: VMS::Filespec::rmsexpand(spec[,defspec])
617Usage: VMS::Filespec::unixify(spec)
618Usage: VMS::Filespec::unixpath(spec)
619Usage: VMS::Filespec::unixrealpath(spec)
620Usage: VMS::Filespec::vmsify(spec)
621Usage: VMS::Filespec::vmspath(spec)
622Usage: VMS::Filespec::vmsrealpath(spec)
623Use of inherited AUTOLOAD for non-method %s::%s() is deprecated
624utf8 "\x%X" does not map to Unicode
625Value of logical "%s" too long. Truncating to %i bytes
626waitpid: process %x is not a child of process %x
627Wide character
628Wide character in $/
629Within []-length '*' not allowed in %s
630Within []-length '%c' not allowed in %s
631Wrong syntax (suid) fd script name "%s"
632'X' outside of string in %s
633'X' outside of string in unpack
634
635__CATEGORIES__
636Code point 0x%X is not Unicode, all \p{} matches fail; all \P{} matches succeed
637Code point 0x%X is not Unicode, may not be portable
638Illegal character \%o (carriage return)
639Missing argument in %s
640Unicode non-character U+%X is illegal for open interchange
641Operation "%s" returns its argument for non-Unicode code point 0x%X
642Operation "%s" returns its argument for UTF-16 surrogate U+%X
643Unicode surrogate U+%X is illegal in UTF-8
644UTF-16 surrogate U+%X
645False [] range "%s" in regex; marked by <-- HERE in m/%s/
646\N{} in character class restricted to one character in regex; marked by <-- HERE in m/%s/
647Zero length \N{} in regex; marked by <-- HERE in m/%s/
648Expecting '(?flags:(?[...' in regex; marked by <-- HERE in m/%s/
649