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