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