This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
047bf8f56c2103bf7746d6e500b745480fa07e5c
[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 # Recursively descend looking for source files.
195 my @todo = sort <*>;
196 while (@todo) {
197   my $todo = shift @todo;
198   next if $todo ~~ ['t', 'lib', 'ext', 'dist', 'cpan'];
199   # opmini.c is just a copy of op.c, so there's no need to check again.
200   next if $todo eq 'opmini.c';
201   if (-d $todo) {
202     unshift @todo, sort glob "$todo/*";
203   } elsif ($todo =~ m/\.[ch]$/) {
204     check_file($todo);
205   }
206 }
207
208 # Standardize messages with variants into the form that appears
209 # in perldiag.pod -- useful for things without a diag_listed_as annotation
210 sub standardize {
211   my ($name) = @_;
212
213   if    ( $name =~ m/^(Invalid strict version format) \([^\)]*\)/ ) {
214     $name = "$1 (\%s)";
215   }
216   elsif ( $name =~ m/^(Invalid version format) \([^\)]*\)/ ) {
217     $name = "$1 (\%s)";
218   }
219   elsif ($name =~ m/^panic: /) {
220     $name = "panic: \%s";
221   }
222
223   return $name;
224 }
225
226 sub check_file {
227   my ($codefn) = @_;
228
229   print "# Checking $codefn\n";
230
231   open my $codefh, "<", $codefn
232     or die "Can't open $codefn: $!";
233
234   my $listed_as;
235   my $listed_as_line;
236   my $sub = 'top of file';
237   while (<$codefh>) {
238     chomp;
239     # Getting too much here isn't a problem; we only use this to skip
240     # errors inside of XS modules, which should get documented in the
241     # docs for the module.
242     if (m<^[^#\s]> and $_ !~ m/^[{}]*$/) {
243       $sub = $_;
244     }
245     next if $sub =~ m/^XS/;
246     if (m</\*\s*diag_listed_as: (.*?)\s*\*/>) {
247       $listed_as = $1;
248       $listed_as_line = $.+1;
249     }
250     next if /^#/;
251
252     my $multiline = 0;
253     # Loop to accumulate the message text all on one line.
254     if (m/(?:$source_msg_re(?:_nocontext)?|$regcomp_re)\s*\(/) {
255       while (not m/\);$/) {
256         my $nextline = <$codefh>;
257         # Means we fell off the end of the file.  Not terribly surprising;
258         # this code tries to merge a lot of things that aren't regular C
259         # code (preprocessor stuff, long comments).  That's OK; we don't
260         # need those anyway.
261         last if not defined $nextline;
262         chomp $nextline;
263         $nextline =~ s/^\s+//;
264         $_ =~ s/\\$//;
265         # Note that we only want to do this where *both* are true.
266         if ($_ =~ m/"$/ and $nextline =~ m/^"/) {
267           $_ =~ s/"$//;
268           $nextline =~ s/^"//;
269         }
270         $_ .= $nextline;
271         ++$multiline;
272       }
273     }
274     # This should happen *after* unwrapping, or we don't reformat the things
275     # in later lines.
276
277     s/$specialformats_re/"%$specialformats{$1}" .  (defined $2 ? '' : '"')/ge;
278
279     # Remove any remaining format modifiers, but not in %%
280     s/ (?<!%) % $format_modifiers ( [dioxXucsfeEgGp] ) /%$1/xg;
281
282     # The %"foo" thing needs to happen *before* this regex.
283     # diag($_);
284     # DIE is just return Perl_die
285     my ($name, $category, $routine);
286     if (/$source_msg_call_re/) {
287       ($name, $category, $routine) = ($+{'text'}, $+{'category'}, $+{'routine'});
288       # Sometimes the regexp will pick up too much for the category
289       # e.g., WARN_UNINITIALIZED), PL_warn_uninit_sv ... up to the next )
290       $category && $category =~ s/\).*//s;
291     }
292     elsif (/$bad_version_re/) {
293       ($name, $category) = ($+{'text'}, undef);
294     }
295     elsif (/$regcomp_fail_re/) {
296       #  FAIL("foo") -> "foo in regex m/%s/"
297       # vFAIL("foo") -> "foo in regex; marked by <-- HERE in m/%s/"
298       ($name, $category) = ($+{'text'}, undef);
299       $name .=
300         " in regex" . ("; marked by <-- HERE in" x /vFAIL/) . " m/%s/";
301     }
302     elsif (/$regcomp_call_re/) {
303       # vWARN/ckWARNreg("foo") -> "foo in regex; marked by <-- HERE in m/%s/
304       ($name, $category, $routine) = ($+{'text'}, undef, $+{'routine'});
305       $name .= " in regex; marked by <-- HERE in m/%s/";
306       $category = 'WARN_REGEXP';
307       if ($routine =~ /dep/) {
308         $category .= ',WARN_DEPRECATED';
309       }
310     }
311     else {
312       next;
313     }
314
315     my $severity = !$routine                   ? '[PFX]'
316                  :  $routine =~ /warn.*_d\z/   ? '[DS]'
317                  :  $routine =~ /warn/         ? '[WDS]'
318                  :  $routine =~ /ckWARN\d*reg/ ? '[WDS]'
319                  :  $routine =~ /vWARN\d/      ? '[WDS]'
320                  :                             '[PFX]';
321     my $categories;
322     if (defined $category) {
323       $category =~ s/__/::/g;
324       $categories =
325         join ", ",
326               sort map {s/^WARN_//; lc $_} split /\s*[|,]\s*/, $category;
327     }
328     if ($listed_as and $listed_as_line == $. - $multiline) {
329       $name = $listed_as;
330     } else {
331       # The form listed in perldiag ignores most sorts of fancy printf
332       # formatting, or makes it more perlish.
333       $name =~ s/%%/%/g;
334       $name =~ s/%l[ud]/%d/g;
335       $name =~ s/%\.(\d+|\*)s/\%s/g;
336       $name =~ s/(?:%s){2,}/%s/g;
337       $name =~ s/(\\")|("\s*[A-Z_]+\s*")/$1 ? '"' : '%s'/egg;
338       $name =~ s/\\t/\t/g;
339       $name =~ s/\\n/\n/g;
340       $name =~ s/\s+$//;
341       $name =~ s/(\\)\\/$1/g;
342     }
343
344     # Extra explanatory info on an already-listed error, doesn't
345     # need it's own listing.
346     next if $name =~ m/^\t/;
347
348     # Happens fairly often with PL_no_modify.
349     next if $name eq '%s';
350
351     # Special syntax for magic comment, allows ignoring the fact
352     # that it isn't listed.  Only use in very special circumstances,
353     # like this script failing to notice that the Perl_croak call is
354     # inside an #if 0 block.
355     next if $name eq 'SKIPME';
356
357     check_message(standardize($name),$codefn,$severity,$categories);
358   }
359 }
360
361 sub check_message {
362     my($name,$codefn,$severity,$categories,$partial) = @_;
363     my $key = $name =~ y/\n/ /r;
364     my $ret;
365
366     # Try to reduce printf() formats to simplest forms
367     # Really this should be matching %s, etc like diagnostics.pm does
368
369     # Kill flags
370     $key =~ s/%[#0\-+]/%/g;
371
372     # Kill width
373     $key =~ s/\%(\d+|\*)/%/g;
374
375     # Kill precision
376     $key =~ s/\%\.(\d+|\*)/%/g;
377
378     if (exists $entries{$key}) {
379       $ret = 1;
380       if ( $entries{$key}{seen}++ ) {
381         # no need to repeat entries we've tested
382       } elsif ($entries{$key}{todo}) {
383         TODO: {
384           no warnings 'once';
385           local $::TODO = 'in DATA';
386           # There is no listing, but it is in the list of exceptions.  TODO FAIL.
387           fail($key);
388           diag(
389             "    Message '$name'\n    from $codefn line $. is not listed in $pod\n".
390             "    (but it wasn't documented in 5.10 either, so marking it TODO)."
391           );
392         }
393       } else {
394         # We found an actual valid entry in perldiag.pod for this error.
395         pass($key);
396
397         # Now check the category and severity
398
399         # Cache our severity qr thingies
400         use 5.01;
401         state %qrs;
402         my $qr = $qrs{$severity} ||= qr/$severity/;
403
404         return $ret
405           if $entries{$key}{cattodo};
406
407         like $entries{$key}{severity}, $qr,
408           "severity is one of $severity for $key";
409
410         is $entries{$key}{category}, $categories,
411            ($categories ? "categories are [$categories]" : "no category")
412              . " for $key";
413       }
414       # Later, should start checking that the severity is correct, too.
415     } elsif ($partial) {
416       # noop
417     } else {
418       my $ok;
419       if ($name =~ /\n/) {
420         $ok = 1;
421         check_message($_,$codefn,$severity,$categories,1) or $ok = 0, last
422           for split /\n/, $name;
423       }
424       if ($ok) {
425         # noop
426       } elsif ($make_exceptions_list) {
427         # We're making an updated version of the exception list, to
428         # stick in the __DATA__ section.  I honestly can't think of
429         # a situation where this is the right thing to do, but I'm
430         # leaving it here, just in case one of my descendents thinks
431         # it's a good idea.
432         print STDERR "$key\n";
433       } else {
434         # No listing found, and no excuse either.
435         # Find the correct place in perldiag.pod, and add a stanza beginning =item $name.
436         fail($name);
437         diag("    Message '$name'\n    from $codefn line $. is not listed in $pod");
438       }
439       # seen it, so only fail once for this message
440       $entries{$name}{seen}++;
441     }
442
443     die if $name =~ /%$/;
444     return $ret;
445 }
446
447 # Lists all missing things as of the inauguration of this script, so we
448 # don't have to go from "meh" to perfect all at once.
449
450 # PLEASE DO NOT ADD TO THIS LIST.  Instead, write an entry in
451 # pod/perldiag.pod for your new (warning|error).
452
453 # Entries after __CATEGORIES__ are those that are in perldiag but fail the
454 # severity/category test.
455
456 # Also FIXME this test, as the first entry in TODO *is* covered by the
457 # description: Malformed UTF-8 character (%s)
458 __DATA__
459 Malformed UTF-8 character (unexpected non-continuation byte 0x%x, immediately after start byte 0x%x)
460
461 '%c' allowed only after types %s in %s
462 bad top format reference
463 Cannot apply "%s" in non-PerlIO perl
464 Can't %s big-endian %ss on this
465 Can't call mro_isa_changed_in() on anonymous symbol table
466 Can't call mro_method_changed_in() on anonymous symbol table
467 Can't coerce readonly %s to string
468 Can't coerce readonly %s to string in %s
469 Can't find string terminator %c%s%c anywhere before EOF
470 Can't fix broken locale name "%s"
471 Can't get short module name from a handle
472 Can't locate object method "%s" via package "%s" (perhaps you forgot to load "%s"?)
473 Can't pipe "%s": %s
474 Can't spawn: %s
475 Can't spawn "%s": %s
476 Can't %s script `%s' with ARGV[0] being `%s'
477 Can't %s "%s": %s
478 Can't %s `%s' with ARGV[0] being `%s' (looking for executables only, not found)
479 Can't use string ("%s"%s) as a subroutine ref while "strict refs" in use
480 \%c better written as $%c
481 Character(s) in '%c' format wrapped in %s
482 chown not implemented!
483 clear %s
484 Code missing after '/' in pack
485 Code missing after '/' in unpack
486 Corrupted regexp opcode %d > %d
487 '%c' outside of string in pack
488 Debug leaking scalars child failed%s with errno %d: %s
489 '/' does not take a repeat count in %s
490 Don't know how to get file name
491 Don't know how to handle magic of type \%o
492 -Dp not implemented on this platform
493 Empty \%c{} in regex; marked by <-- HERE in m/%s/
494 Error reading "%s": %s
495 execl not implemented!
496 EVAL without pos change exceeded limit in regex
497 Expecting close bracket in regex; marked by <-- HERE in m/%s/
498 Filehandle opened only for %sput
499 Filehandle %s opened only for %sput
500 Filehandle STD%s reopened as %s only for input
501 filter_del can only delete in reverse order (currently)
502 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!
503 fork() not implemented!
504 free %s
505 Free to wrong pool %p not %p
506 get %s %p %p %p
507 gethostent not implemented!
508 getpwnam returned invalid UIC %o for user "%s"
509 glob failed (can't start child: %s)
510 glob failed (child exited with status %d%s)
511 Goto undefined subroutine
512 Goto undefined subroutine &%s
513 Got signal %d
514 ()-group starts with a count in %s
515 Illegal binary digit '%c' ignored
516 Illegal character %sin prototype for %s : %s
517 Illegal hexadecimal digit '%c' ignored
518 Illegal octal digit '%c' ignored
519 Illegal pattern in regex; marked by <-- HERE in m/%s/
520 Infinite recursion in regex
521 internal %<num>p might conflict with future printf extensions
522 Invalid argument to sv_cat_decode
523 Invalid [::] class in regex; marked by <-- HERE in m/%s/
524 Invalid [] range "%*.*s" in regex; marked by <-- HERE in m/%s/
525 Invalid range "%c-%c" in transliteration operator
526 Invalid separator character %c%c%c in PerlIO layer specification %s
527 Invalid TOKEN object ignored
528 Invalid type '%c' in pack
529 Invalid type '%c' in %s
530 Invalid type '%c' in unpack
531 Invalid type ',' in %s
532 ioctlsocket not implemented!
533 'j' not supported on this platform
534 'J' not supported on this platform
535 killpg not implemented!
536 length() used on %s (did you mean "scalar(%s)"?)
537 length() used on %hash (did you mean "scalar(keys %hash)"?)
538 length() used on @array (did you mean "scalar(@array)"?)
539 List form of pipe open not implemented
540 Malformed integer in [] in %s
541 Malformed UTF-8 character (fatal)
542 Missing (suid) fd script name
543 More than one argument to open
544 More than one argument to open(,':%s')
545 mprotect for %p %u failed with %d
546 mprotect RW for %p %u failed with %d
547 No %s allowed while running setgid
548 No %s allowed with (suid) fdscript
549 No such class field "%s"
550 Not an XSUB reference
551 Operator or semicolon missing before %c%s
552 Pattern subroutine nesting without pos change exceeded limit in regex
553 Perl %s required--this is only %s, stopped
554 POSIX syntax [%c %c] is reserved for future extensions in regex; marked by <-- HERE in m/%s/
555 ptr wrong %p != %p fl=%x nl=%p e=%p for %d
556 Recompile perl with -DDEBUGGING to use -D switch (did you mean -d ?)
557 Regexp modifier "%c" may appear a maximum of twice in regex; marked by <-- HERE in m/%s/
558 Regexp modifier "%c" may not appear twice in regex; marked by <-- HERE in m/%s/
559 Regexp modifiers "%c" and "%c" are mutually exclusive in regex; marked by <-- HERE in m/%s/
560 Regexp *+ operand could be empty in regex; marked by <-- HERE in m/%s/
561 Repeated format line will never terminate (~~ and @#)
562 Reversed %c= operator
563 %s(%f) failed
564 %sCompilation failed in require
565 Sequence (?%c...) not implemented in regex; marked by <-- HERE in m/%s/
566 Sequence (%s...) not recognized in regex; marked by <-- HERE in m/%s/
567 Sequence %s... not terminated in regex; marked by <-- HERE in m/%s/
568 Sequence (?%c... not terminated in regex; marked by <-- HERE in m/%s/
569 Sequence (?(%c... not terminated in regex; marked by <-- HERE in m/%s/
570 Sequence (?R) not terminated in regex m/%s/
571 set %s %p %p %p
572 %s free() ignored (RMAGIC, PERL_CORE)
573 %s has too many errors.
574 SIG%s handler "%s" not defined.
575 %s in %s
576 Size magic not implemented
577 %s number > %s non-portable
578 %srealloc() %signored
579 %s in regex m/%s/
580 %s on %s %s
581 socketpair not implemented!
582 Starting Full Screen process with flag=%d, mytype=%d
583 Starting PM process with flag=%d, mytype=%d
584 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
585 SWASHNEW didn't return an HV ref
586 switching effective gid is not implemented
587 switching effective uid is not implemented
588 System V IPC is not implemented on this machine
589 -T and -B not implemented on filehandles
590 Terminating on signal SIG%s(%d)
591 The crypt() function is unimplemented due to excessive paranoia.
592 The crypt() function is not implemented on NetWare
593 The flock() function is not implemented on NetWare
594 The rewinddir() function is not implemented on NetWare
595 The seekdir() function is not implemented on NetWare
596 The telldir() function is not implemented on NetWare
597 Too deeply nested ()-groups in %s
598 Too many args on %s line of "%s"
599 U0 mode on a byte string
600 unable to find VMSPIPE.COM for i/o piping
601 Unknown Unicode option value %d
602 Unrecognized character %s; marked by <-- HERE after %s<-- HERE near column %d
603 Unstable directory path, current directory changed unexpectedly
604 Unterminated compressed integer in unpack
605 Unterminated \g... pattern in regex; marked by <-- HERE in m/%s/
606 Usage: CODE(0x%x)(%s)
607 Usage: %s(%s)
608 Usage: %s::%s(%s)
609 Usage: File::Copy::rmscopy(from,to[,date_flag])
610 Usage: VMS::Filespec::candelete(spec)
611 Usage: VMS::Filespec::fileify(spec)
612 Usage: VMS::Filespec::pathify(spec)
613 Usage: VMS::Filespec::rmsexpand(spec[,defspec])
614 Usage: VMS::Filespec::unixify(spec)
615 Usage: VMS::Filespec::unixpath(spec)
616 Usage: VMS::Filespec::unixrealpath(spec)
617 Usage: VMS::Filespec::vmsify(spec)
618 Usage: VMS::Filespec::vmspath(spec)
619 Usage: VMS::Filespec::vmsrealpath(spec)
620 Use of inherited AUTOLOAD for non-method %s::%s() is deprecated
621 utf8 "\x%X" does not map to Unicode
622 Value of logical "%s" too long. Truncating to %i bytes
623 waitpid: process %x is not a child of process %x
624 Wide character
625 Wide character in $/
626 Within []-length '*' not allowed in %s
627 Within []-length '%c' not allowed in %s
628 Wrong syntax (suid) fd script name "%s"
629 'X' outside of string in %s
630 'X' outside of string in unpack
631 Useless (%s%c) - %suse /%c modifier in regex; marked by <-- HERE in m/%s/
632 Useless (%sc) - %suse /gc modifier in regex; marked by <-- HERE in m/%s/
633 Useless use of (?-p) in regex; marked by <-- HERE in m/%s/
634
635 __CATEGORIES__
636 Code point 0x%X is not Unicode, all \p{} matches fail; all \P{} matches succeed
637 Code point 0x%X is not Unicode, may not be portable
638 Illegal character \%o (carriage return)
639 Missing argument in %s
640 Unicode non-character U+%X is illegal for open interchange
641 Operation "%s" returns its argument for non-Unicode code point 0x%X
642 Operation "%s" returns its argument for UTF-16 surrogate U+%X
643 Unicode surrogate U+%X is illegal in UTF-8
644 UTF-16 surrogate U+%X