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