From 17b50ffebc725e853410693652a3512bdfa81ea5 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 08:57:36 +0100 Subject: [PATCH 01/18] regcomp_internal.h - make unused macros for deprecation warnings take category as parameter we should have a deprecation category per type of deprecation --- regcomp_internal.h | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/regcomp_internal.h b/regcomp_internal.h index c273d2f70f0e..6ea42640edfe 100644 --- a/regcomp_internal.h +++ b/regcomp_internal.h @@ -1060,21 +1060,21 @@ static const scan_data_t zero_scan_data = { m REPORT_LOCATION, \ REPORT_LOCATION_ARGS(loc))) \ -#define vWARN_dep(loc, m) \ - _WARN_HELPER(loc, packWARN(WARN_DEPRECATED), \ - Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), \ - m REPORT_LOCATION, \ +#define vWARN_dep(loc,category,m) \ + _WARN_HELPER(loc, packWARN(category), \ + Perl_warner(aTHX_ packWARN(category), \ + m REPORT_LOCATION, \ REPORT_LOCATION_ARGS(loc))) -#define ckWARNdep(loc,m) \ - _WARN_HELPER(loc, packWARN(WARN_DEPRECATED), \ - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ - m REPORT_LOCATION, \ +#define ckWARNdep(loc,category,m) \ + _WARN_HELPER(loc, packWARN(category), \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ + m REPORT_LOCATION, \ REPORT_LOCATION_ARGS(loc))) -#define ckWARNregdep(loc,m) \ - _WARN_HELPER(loc, packWARN2(WARN_DEPRECATED, WARN_REGEXP), \ - Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, \ +#define ckWARNregdep(loc,category,m) \ + _WARN_HELPER(loc, packWARN2(category, WARN_REGEXP), \ + Perl_ck_warner_d(aTHX_ packWARN2(category, \ WARN_REGEXP), \ m REPORT_LOCATION, \ REPORT_LOCATION_ARGS(loc))) From 58736b9bdaa6e226673072bd42289ec0f8cc46d1 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 09:11:58 +0100 Subject: [PATCH 02/18] utf8.c - add category parameter to unused warn_on_first_deprecated_use function --- embed.fnc | 1 + embed.h | 2 +- proto.h | 2 +- utf8.c | 9 +++++---- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/embed.fnc b/embed.fnc index 630fe7a6c844..8ec175f92e24 100644 --- a/embed.fnc +++ b/embed.fnc @@ -5852,6 +5852,7 @@ RS |char * |unexpected_non_continuation_text \ |const STRLEN expect_len # if 0 S |void |warn_on_first_deprecated_use \ + |U32 category \ |NN const char * const name \ |NN const char * const alternative \ |const bool use_locale \ diff --git a/embed.h b/embed.h index df6b6708484e..1a5d9fedf5d5 100644 --- a/embed.h +++ b/embed.h @@ -1621,7 +1621,7 @@ # define turkic_uc(a,b,c,d) S_turkic_uc(aTHX_ a,b,c,d) # define unexpected_non_continuation_text(a,b,c,d) S_unexpected_non_continuation_text(aTHX_ a,b,c,d) # if 0 -# define warn_on_first_deprecated_use(a,b,c,d,e) S_warn_on_first_deprecated_use(aTHX_ a,b,c,d,e) +# define warn_on_first_deprecated_use(a,b,c,d,e,f) S_warn_on_first_deprecated_use(aTHX_ a,b,c,d,e,f) # endif /* 0 */ # endif /* defined(PERL_IN_UTF8_C) */ # if defined(PERL_IN_UTIL_C) diff --git a/proto.h b/proto.h index 10d96484b950..161b7e9bb7ea 100644 --- a/proto.h +++ b/proto.h @@ -9476,7 +9476,7 @@ S_unexpected_non_continuation_text(pTHX_ const U8 * const s, STRLEN print_len, c # if 0 STATIC void -S_warn_on_first_deprecated_use(pTHX_ const char * const name, const char * const alternative, const bool use_locale, const char * const file, const unsigned line); +S_warn_on_first_deprecated_use(pTHX_ U32 category, const char * const name, const char * const alternative, const bool use_locale, const char * const file, const unsigned line); # define PERL_ARGS_ASSERT_WARN_ON_FIRST_DEPRECATED_USE \ assert(name); assert(alternative); assert(file) diff --git a/utf8.c b/utf8.c index 14d92d09df31..75e8a4cf8e16 100644 --- a/utf8.c +++ b/utf8.c @@ -3316,7 +3316,8 @@ S_is_utf8_common(pTHX_ const U8 *const p, const U8 * const e, PERLVAR(I, seen_deprecated_macro, HV *) STATIC void -S_warn_on_first_deprecated_use(pTHX_ const char * const name, +S_warn_on_first_deprecated_use(pTHX_ U32 category, + const char * const name, const char * const alternative, const bool use_locale, const char * const file, @@ -3326,7 +3327,7 @@ S_warn_on_first_deprecated_use(pTHX_ const char * const name, PERL_ARGS_ASSERT_WARN_ON_FIRST_DEPRECATED_USE; - if (ckWARN_d(WARN_DEPRECATED)) { + if (ckWARN_d(category)) { key = Perl_form(aTHX_ "%s;%d;%s;%d", name, use_locale, file, line); if (! hv_fetch(PL_seen_deprecated_macro, key, strlen(key), 0)) { @@ -3340,14 +3341,14 @@ S_warn_on_first_deprecated_use(pTHX_ const char * const name, } if (instr(file, "mathoms.c")) { - Perl_warner(aTHX_ WARN_DEPRECATED, + Perl_warner(aTHX_ category, "In %s, line %d, starting in Perl v5.32, %s()" " will be removed. Avoid this message by" " converting to use %s().\n", file, line, name, alternative); } else { - Perl_warner(aTHX_ WARN_DEPRECATED, + Perl_warner(aTHX_ category, "In %s, line %d, starting in Perl v5.32, %s() will" " require an additional parameter. Avoid this" " message by converting to use %s().\n", From d1ba06b56de9cdca69a028b32e7e2e70870f2fff Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Sat, 25 Feb 2023 15:21:14 +0100 Subject: [PATCH 03/18] warnings.pm - support deprecated::smartmatch category Currently we seem to lack a way to have a subcategory under deprecated. It seems reasonable to me that people might want to disable a specific subcategory warning while leaving the rest in place. This patch allows that. Note that both no warnings "deprecated"; and no warnings "deprecated::smartmatch"; work to disable the warning. Deprecated warnings shouldn't be "all or nothing", they should be specific and targetted. --- lib/warnings.pm | 17 ++++++++++++----- pod/perldiag.pod | 8 ++++---- regen/warnings.pl | 28 ++++++++++++++++------------ toke.c | 6 +++--- warnings.h | 5 +++++ 5 files changed, 40 insertions(+), 24 deletions(-) diff --git a/lib/warnings.pm b/lib/warnings.pm index 2dd9eccb513a..083dbb4fca48 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -112,6 +112,9 @@ our %Offsets = ( # Warnings Categories added in Perl 5.037 'experimental::class' => 144, + + # Warnings Categories added in Perl 5.037009 + 'deprecated::smartmatch' => 146, ); our %Bits = ( @@ -121,7 +124,8 @@ our %Bits = ( 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [2,73] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [73] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] @@ -197,7 +201,8 @@ our %DeadBits = ( 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [2,73] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [73] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] @@ -279,8 +284,8 @@ our %NoOp = ( # These are used by various things, including our own tests our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x50\x05\x51\x55\x15\x01"; # [2,4,22,23,25,54..57,60,62..70,72] -our $LAST_BIT = 146 ; +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x50\x05\x51\x55\x15\x05"; # [2,4,22,23,25,54..57,60,62..70,72,73] +our $LAST_BIT = 148 ; our $BYTES = 19 ; sub Croaker @@ -881,7 +886,9 @@ The current hierarchy is: | +- closure | - +- deprecated + +- deprecated ----+ + | | + | +- deprecated::smartmatch | +- exiting | diff --git a/pod/perldiag.pod b/pod/perldiag.pod index d774e3537c8d..e1350581678a 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -2645,8 +2645,8 @@ L. =item given is deprecated -(D deprecated) C depends on smartmatch, which is deprecated. It -will be removed in Perl 5.42. See the explanation under +(D deprecated::smartmatch) C depends on smartmatch, which is +deprecated. It will be removed in Perl 5.42. See the explanation under L. =item Global symbol "%s" requires explicit package name (did you forget to @@ -6039,7 +6039,7 @@ for the smart match. =item Smartmatch is deprecated -(D deprecated) This warning is emitted if you +(D deprecated::smartmatch) This warning is emitted if you use the smartmatch (C<~~>) operator. This is a deprecated feature. Particularly, its behavior is noticed for being unnecessarily complex and unintuitive, and it will be removed @@ -8025,7 +8025,7 @@ So put in parentheses to say what you really mean. =item when is deprecated -(D deprecated) C depends on smartmatch, which is +(D deprecated::smartmatch) C depends on smartmatch, which is deprecated. Additionally, it has several special cases that may not be immediately obvious, and it will be removed in Perl 5.42. See the explanation diff --git a/regen/warnings.pl b/regen/warnings.pl index c2621363ba50..068d42c37fb7 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -74,7 +74,9 @@ BEGIN 'debugging' => [ 5.008, DEFAULT_ON], 'malloc' => [ 5.008, DEFAULT_ON], }], - 'deprecated' => [ 5.008, DEFAULT_ON], + 'deprecated' => [ 5.008, DEFAULT_ON, { + 'deprecated::smartmatch' => [ 5.037009, DEFAULT_ON], + }], 'void' => [ 5.008, DEFAULT_OFF], 'recursion' => [ 5.008, DEFAULT_OFF], 'redefine' => [ 5.008, DEFAULT_OFF], @@ -204,12 +206,12 @@ sub valueWalk die "Value associated with key '$k' is not an ARRAY reference" if !ref $v || ref $v ne 'ARRAY' ; - my ($ver, $rest) = @{ $v } ; + my ($ver, $rest, $rest2) = @{ $v } ; + my $ref = ref $rest ? $rest : $rest2; push @{ $v_list->{$ver} }, $k; - if (ref $rest) - { valueWalk ($rest, $v_list) } - + if (ref $ref) + { valueWalk ($ref, $v_list) } } } @@ -265,11 +267,12 @@ sub walk die "Value associated with key '$k' is not an ARRAY reference" if !ref $v || ref $v ne 'ARRAY' ; - my ($ver, $rest) = @{ $v } ; - if (ref $rest) - { push (@{ $CATEGORIES{$k} }, walk ($rest)) } - elsif ($rest == DEFAULT_ON) + my ($ver, $rest, $rest2) = @{ $v } ; + my $ref = ref $rest ? $rest : $rest2; + if (!ref $rest and $rest == DEFAULT_ON) { push @DEFAULTS, $NAME_TO_VALUE{uc $k} } + if (ref $ref) + { push (@{ $CATEGORIES{$k} }, walk ($ref)) } push @list, @{ $CATEGORIES{$k} } ; } @@ -334,12 +337,13 @@ sub warningsTree $offset = ' ' x ($max + 1) ; } - my ($ver, $rest) = @{ $v } ; - if (ref $rest) + my ($ver, $rest, $rest2) = @{ $v } ; + my $ref = ref $rest ? $rest : $rest2; + if (ref $ref) { my $bar = @keys ? "|" : " "; $rv .= " -" . "-" x ($max - length $k ) . "+\n" ; - $rv .= warningsTree ($rest, $prefix . $bar . $offset ) + $rv .= warningsTree ($ref, $prefix . $bar . $offset ) } else { $rv .= "\n" } diff --git a/toke.c b/toke.c index 0f30ddca70f6..9625f2520bcf 100644 --- a/toke.c +++ b/toke.c @@ -6638,7 +6638,7 @@ yyl_tilde(pTHX_ char *s) TOKEN(0); s += 2; Perl_ck_warner_d(aTHX_ - packWARN(WARN_DEPRECATED), + packWARN(WARN_DEPRECATED__SMARTMATCH), "Smartmatch is deprecated"); NCEop(OP_SMARTMATCH); } @@ -8179,7 +8179,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct case KEY_given: pl_yylval.ival = CopLINE(PL_curcop); - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), + Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__SMARTMATCH), "given is deprecated"); OPERATOR(KW_GIVEN); @@ -8702,7 +8702,7 @@ yyl_word_or_keyword(pTHX_ char *s, STRLEN len, I32 key, I32 orig_keyword, struct return REPORT(0); pl_yylval.ival = CopLINE(PL_curcop); Perl_ck_warner_d(aTHX_ - packWARN(WARN_DEPRECATED), + packWARN(WARN_DEPRECATED__SMARTMATCH), "when is deprecated"); OPERATOR(KW_WHEN); diff --git a/warnings.h b/warnings.h index 613c8fb33f78..ef8984d7e376 100644 --- a/warnings.h +++ b/warnings.h @@ -134,6 +134,10 @@ /* Warnings Categories added in Perl 5.037 */ #define WARN_EXPERIMENTAL__CLASS 72 + +/* Warnings Categories added in Perl 5.037009 */ + +#define WARN_DEPRECATED__SMARTMATCH 73 #define WARNsize 19 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" #define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" @@ -321,6 +325,7 @@ category parameters passed. =for apidoc Amnh||WARN_EXPERIMENTAL__FOR_LIST =for apidoc Amnh||WARN_SCALAR =for apidoc Amnh||WARN_EXPERIMENTAL__CLASS +=for apidoc Amnh||WARN_DEPRECATED__SMARTMATCH =cut */ From e047b2bd802bce7ef8389fd396831e583d2d369d Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 14:46:12 +0100 Subject: [PATCH 04/18] warnings.pm - add deprecated::dot_in_inc warings category Instead of using a generic warnings category switch to fine grained control. --- lib/warnings.pm | 97 +++++++++++++++++++++++++---------------------- pod/perldiag.pod | 10 ++--- pp_ctl.c | 4 +- regen/warnings.pl | 1 + warnings.h | 31 ++++++++------- 5 files changed, 78 insertions(+), 65 deletions(-) diff --git a/lib/warnings.pm b/lib/warnings.pm index 083dbb4fca48..658b13519482 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -91,30 +91,33 @@ our %Offsets = ( # Warnings Categories added in Perl 5.025 'experimental::declared_refs' => 120, + # Warnings Categories added in Perl 5.025011 + 'deprecated::dot_in_inc' => 122, + # Warnings Categories added in Perl 5.027 - 'shadow' => 122, + 'shadow' => 124, # Warnings Categories added in Perl 5.029 - 'experimental::private_use' => 124, - 'experimental::uniprop_wildcards' => 126, - 'experimental::vlb' => 128, + 'experimental::private_use' => 126, + 'experimental::uniprop_wildcards' => 128, + 'experimental::vlb' => 130, # Warnings Categories added in Perl 5.033 - 'experimental::try' => 130, + 'experimental::try' => 132, # Warnings Categories added in Perl 5.035 - 'experimental::args_array_with_signatures'=> 132, - 'experimental::builtin' => 134, - 'experimental::defer' => 136, - 'experimental::extra_paired_delimiters'=> 138, - 'experimental::for_list' => 140, - 'scalar' => 142, + 'experimental::args_array_with_signatures'=> 134, + 'experimental::builtin' => 136, + 'experimental::defer' => 138, + 'experimental::extra_paired_delimiters'=> 140, + 'experimental::for_list' => 142, + 'scalar' => 144, # Warnings Categories added in Perl 5.037 - 'experimental::class' => 144, + 'experimental::class' => 146, # Warnings Categories added in Perl 5.037009 - 'deprecated::smartmatch' => 146, + 'deprecated::smartmatch' => 148, ); our %Bits = ( @@ -124,27 +127,28 @@ our %Bits = ( 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [2,73] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [73] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x10", # [2,61,74] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [61] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [74] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x51\x01\x51\x55\x15\x01", # [51,52,54..56,60,62..70,72] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [66] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [67] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [72] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x51\x01\x41\x55\x55\x04", # [51,52,54..56,60,63..71,73] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [67] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [68] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [73] 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [54] 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [60] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [68] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [69] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [70] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [62] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [69] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [70] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [71] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [63] 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [55] 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [56] 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [52] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [65] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [63] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [64] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [66] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [64] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [65] 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [46] @@ -175,10 +179,10 @@ our %Bits = ( 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [59] 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [71] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [72] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [61] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [62] 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [50] @@ -201,27 +205,28 @@ our %DeadBits = ( 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [2,73] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [73] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x20", # [2,61,74] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [61] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [74] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xa2\x02\xa2\xaa\x2a\x02", # [51,52,54..56,60,62..70,72] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [66] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [67] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [72] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xa2\x02\x82\xaa\xaa\x08", # [51,52,54..56,60,63..71,73] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [67] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [68] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [73] 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [54] 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [60] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [68] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [69] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [70] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [62] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [69] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [70] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [71] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [63] 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [55] 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [56] 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [52] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [65] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [63] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [64] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [66] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [64] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [65] 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [46] @@ -252,10 +257,10 @@ our %DeadBits = ( 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [59] 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [71] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [72] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [61] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [62] 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [50] @@ -284,8 +289,8 @@ our %NoOp = ( # These are used by various things, including our own tests our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x50\x05\x51\x55\x15\x05"; # [2,4,22,23,25,54..57,60,62..70,72,73] -our $LAST_BIT = 148 ; +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x50\x05\x45\x55\x55\x14"; # [2,4,22,23,25,54..57,60,61,63..71,73,74] +our $LAST_BIT = 150 ; our $BYTES = 19 ; sub Croaker @@ -888,6 +893,8 @@ The current hierarchy is: | +- deprecated ----+ | | + | +- deprecated::dot_in_inc + | | | +- deprecated::smartmatch | +- exiting diff --git a/pod/perldiag.pod b/pod/perldiag.pod index e1350581678a..6c6799db110d 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -2160,11 +2160,11 @@ See L. =item do "%s" failed, '.' is no longer in @INC; did you mean do "./%s"? -(D deprecated) Previously C< do "somefile"; > would search the current -directory for the specified file. Since perl v5.26.0, F<.> has been -removed from C<@INC> by default, so this is no longer true. To search the -current directory (and only the current directory) you can write -C< do "./somefile"; >. +(D deprecated::dot_in_inc) Previously C< do "somefile"; > would search +the current directory for the specified file. Since perl v5.26.0, F<.> +has been removed from C<@INC> by default, so this is no longer true. To +search the current directory (and only the current directory) you can +write C< do "./somefile"; >. =item Don't know how to get file name diff --git a/pp_ctl.c b/pp_ctl.c index 7e03d2018baa..dee18a45c3c0 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -4854,7 +4854,7 @@ S_require_file(pTHX_ SV *sv) /* the complication is to match the logic from doopen_pm() so * we don't treat do "sda1" as a previously successful "do". */ - bool do_warn = namesv && ckWARN_d(WARN_DEPRECATED) + bool do_warn = namesv && ckWARN_d(WARN_DEPRECATED__DOT_IN_INC) && PerlLIO_stat(name, &st) == 0 && !S_ISDIR(st.st_mode) && !S_ISBLK(st.st_mode) && (io = PerlIO_openn(aTHX_ ":", PERL_SCRIPT_MODE, -1, 0, 0, NULL, 1, &sv)) != NULL; if (io) @@ -4862,7 +4862,7 @@ S_require_file(pTHX_ SV *sv) RESTORE_ERRNO; if (do_warn) { - Perl_warner(aTHX_ packWARN(WARN_DEPRECATED), + Perl_warner(aTHX_ packWARN(WARN_DEPRECATED__DOT_IN_INC), "do \"%s\" failed, '.' is no longer in @INC; " "did you mean do \"./%s\"?", name, name); diff --git a/regen/warnings.pl b/regen/warnings.pl index 068d42c37fb7..4a664aeee8a0 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -76,6 +76,7 @@ BEGIN }], 'deprecated' => [ 5.008, DEFAULT_ON, { 'deprecated::smartmatch' => [ 5.037009, DEFAULT_ON], + 'deprecated::dot_in_inc' => [ 5.025011, DEFAULT_ON], }], 'void' => [ 5.008, DEFAULT_OFF], 'recursion' => [ 5.008, DEFAULT_OFF], diff --git a/warnings.h b/warnings.h index ef8984d7e376..1a75e153b372 100644 --- a/warnings.h +++ b/warnings.h @@ -108,36 +108,40 @@ #define WARN_EXPERIMENTAL__DECLARED_REFS 60 +/* Warnings Categories added in Perl 5.025011 */ + +#define WARN_DEPRECATED__DOT_IN_INC 61 + /* Warnings Categories added in Perl 5.027 */ -#define WARN_SHADOW 61 +#define WARN_SHADOW 62 /* Warnings Categories added in Perl 5.029 */ -#define WARN_EXPERIMENTAL__PRIVATE_USE 62 -#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 63 -#define WARN_EXPERIMENTAL__VLB 64 +#define WARN_EXPERIMENTAL__PRIVATE_USE 63 +#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 64 +#define WARN_EXPERIMENTAL__VLB 65 /* Warnings Categories added in Perl 5.033 */ -#define WARN_EXPERIMENTAL__TRY 65 +#define WARN_EXPERIMENTAL__TRY 66 /* Warnings Categories added in Perl 5.035 */ -#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 66 -#define WARN_EXPERIMENTAL__BUILTIN 67 -#define WARN_EXPERIMENTAL__DEFER 68 -#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 69 -#define WARN_EXPERIMENTAL__FOR_LIST 70 -#define WARN_SCALAR 71 +#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 67 +#define WARN_EXPERIMENTAL__BUILTIN 68 +#define WARN_EXPERIMENTAL__DEFER 69 +#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 70 +#define WARN_EXPERIMENTAL__FOR_LIST 71 +#define WARN_SCALAR 72 /* Warnings Categories added in Perl 5.037 */ -#define WARN_EXPERIMENTAL__CLASS 72 +#define WARN_EXPERIMENTAL__CLASS 73 /* Warnings Categories added in Perl 5.037009 */ -#define WARN_DEPRECATED__SMARTMATCH 73 +#define WARN_DEPRECATED__SMARTMATCH 74 #define WARNsize 19 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" #define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" @@ -313,6 +317,7 @@ category parameters passed. =for apidoc Amnh||WARN_MISSING =for apidoc Amnh||WARN_REDUNDANT =for apidoc Amnh||WARN_EXPERIMENTAL__DECLARED_REFS +=for apidoc Amnh||WARN_DEPRECATED__DOT_IN_INC =for apidoc Amnh||WARN_SHADOW =for apidoc Amnh||WARN_EXPERIMENTAL__PRIVATE_USE =for apidoc Amnh||WARN_EXPERIMENTAL__UNIPROP_WILDCARDS From 9debfc210a9037da6a95620a09df39511db95cf7 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 14:48:15 +0100 Subject: [PATCH 05/18] warnings.pm - support deprecated::unicode_property_name category This category is only used in the regex engine, we should be able to disable it specifically, as it seems like we will never actually remove demove support for the things it warns about. --- lib/warnings.pm | 185 ++++++++++++++++++++++++---------------------- pod/perldiag.pod | 7 +- regcomp.c | 2 +- regen/warnings.pl | 1 + warnings.h | 59 ++++++++------- 5 files changed, 134 insertions(+), 120 deletions(-) diff --git a/lib/warnings.pm b/lib/warnings.pm index 658b13519482..c732aba4aa43 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -68,56 +68,59 @@ our %Offsets = ( 'imprecision' => 92, 'illegalproto' => 94, + # Warnings Categories added in Perl 5.011003 + 'deprecated::unicode_property_name' => 96, + # Warnings Categories added in Perl 5.013 - 'non_unicode' => 96, - 'nonchar' => 98, - 'surrogate' => 100, + 'non_unicode' => 98, + 'nonchar' => 100, + 'surrogate' => 102, # Warnings Categories added in Perl 5.017 - 'experimental' => 102, - 'experimental::regex_sets' => 104, + 'experimental' => 104, + 'experimental::regex_sets' => 106, # Warnings Categories added in Perl 5.019 - 'syscalls' => 106, + 'syscalls' => 108, # Warnings Categories added in Perl 5.021 - 'experimental::const_attr' => 108, - 'experimental::re_strict' => 110, - 'experimental::refaliasing' => 112, - 'locale' => 114, - 'missing' => 116, - 'redundant' => 118, + 'experimental::const_attr' => 110, + 'experimental::re_strict' => 112, + 'experimental::refaliasing' => 114, + 'locale' => 116, + 'missing' => 118, + 'redundant' => 120, # Warnings Categories added in Perl 5.025 - 'experimental::declared_refs' => 120, + 'experimental::declared_refs' => 122, # Warnings Categories added in Perl 5.025011 - 'deprecated::dot_in_inc' => 122, + 'deprecated::dot_in_inc' => 124, # Warnings Categories added in Perl 5.027 - 'shadow' => 124, + 'shadow' => 126, # Warnings Categories added in Perl 5.029 - 'experimental::private_use' => 126, - 'experimental::uniprop_wildcards' => 128, - 'experimental::vlb' => 130, + 'experimental::private_use' => 128, + 'experimental::uniprop_wildcards' => 130, + 'experimental::vlb' => 132, # Warnings Categories added in Perl 5.033 - 'experimental::try' => 132, + 'experimental::try' => 134, # Warnings Categories added in Perl 5.035 - 'experimental::args_array_with_signatures'=> 134, - 'experimental::builtin' => 136, - 'experimental::defer' => 138, - 'experimental::extra_paired_delimiters'=> 140, - 'experimental::for_list' => 142, - 'scalar' => 144, + 'experimental::args_array_with_signatures'=> 136, + 'experimental::builtin' => 138, + 'experimental::defer' => 140, + 'experimental::extra_paired_delimiters'=> 142, + 'experimental::for_list' => 144, + 'scalar' => 146, # Warnings Categories added in Perl 5.037 - 'experimental::class' => 146, + 'experimental::class' => 148, # Warnings Categories added in Perl 5.037009 - 'deprecated::smartmatch' => 148, + 'deprecated::smartmatch' => 150, ); our %Bits = ( @@ -127,42 +130,43 @@ our %Bits = ( 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x10", # [2,61,74] - 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [61] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [74] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x40", # [2,48,62,75] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [62] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [75] + 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [48] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x51\x01\x41\x55\x55\x04", # [51,52,54..56,60,63..71,73] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [67] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [68] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [73] - 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [54] - 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [60] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [69] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [70] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [71] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [63] - 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [55] - 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [56] - 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [52] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [66] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [64] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [65] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x05\x04\x55\x55\x11", # [52,53,55..57,61,64..72,74] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [68] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [69] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [74] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [55] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [61] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [70] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [71] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [72] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [64] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [56] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [57] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [53] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [67] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [65] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [66] 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [5..11,53] + 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [5..11,54] 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] - 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [57] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [58] 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] - 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [58] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [59] 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] - 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [48] - 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [49] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [49] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [50] 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] @@ -176,25 +180,25 @@ our %Bits = ( 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] - 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [59] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [60] 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [72] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [73] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [62] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [63] 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] - 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [50] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [51] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [53] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [54] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [41] 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [42] 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [43] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x15\x00\x00\x00\x00\x00\x00", # [44,48..50] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x54\x00\x00\x00\x00\x00\x00", # [44,49..51] 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [45] ); @@ -205,42 +209,43 @@ our %DeadBits = ( 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x20", # [2,61,74] - 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [61] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [74] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x20\x00\x00\x80", # [2,48,62,75] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [62] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [75] + 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [48] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xa2\x02\x82\xaa\xaa\x08", # [51,52,54..56,60,63..71,73] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [67] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [68] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [73] - 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [54] - 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [60] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [69] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [70] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [71] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [63] - 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [55] - 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [56] - 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [52] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [66] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [64] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [65] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x0a\x08\xaa\xaa\x22", # [52,53,55..57,61,64..72,74] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [68] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [69] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [74] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [55] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [61] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [70] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [71] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [72] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [64] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [56] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [57] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [53] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [67] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [65] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [66] 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [5..11,53] + 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [5..11,54] 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] - 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [57] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [58] 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] - 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [58] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [59] 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] - 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [48] - 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [49] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [49] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [50] 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] @@ -254,25 +259,25 @@ our %DeadBits = ( 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] - 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [59] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [60] 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [72] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [73] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [62] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [63] 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] - 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [50] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [51] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [53] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [54] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [41] 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [42] 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [43] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x2a\x00\x00\x00\x00\x00\x00", # [44,48..50] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xa8\x00\x00\x00\x00\x00\x00", # [44,49..51] 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [45] ); @@ -289,8 +294,8 @@ our %NoOp = ( # These are used by various things, including our own tests our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x50\x05\x45\x55\x55\x14"; # [2,4,22,23,25,54..57,60,61,63..71,73,74] -our $LAST_BIT = 150 ; +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x01\x40\x15\x14\x55\x55\x51"; # [2,4,22,23,25,48,55..58,61,62,64..72,74,75] +our $LAST_BIT = 152 ; our $BYTES = 19 ; sub Croaker @@ -896,6 +901,8 @@ The current hierarchy is: | +- deprecated::dot_in_inc | | | +- deprecated::smartmatch + | | + | +- deprecated::unicode_property_name | +- exiting | diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 6c6799db110d..b072f28beaef 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -7570,9 +7570,10 @@ This was deprecated in Perl 5.12. =item Use of '%s' in \p{} or \P{} is deprecated because: %s -(D deprecated) Certain properties are deprecated by Unicode, and may -eventually be removed from the Standard, at which time Perl will follow -along. In the meantime, this message is raised to notify you. +(D deprecated::unicode_property_name) Certain properties are deprecated +by Unicode, and may eventually be removed from the Standard, at which +time Perl will follow along. In the meantime, this message is raised to +notify you. =item Use of inherited AUTOLOAD for non-method %s::%s() is no longer allowed diff --git a/regcomp.c b/regcomp.c index 698fac645c38..0f4f7fe7342e 100644 --- a/regcomp.c +++ b/regcomp.c @@ -15604,7 +15604,7 @@ S_parse_uniprop_string(pTHX_ if (table_index > MAX_UNI_KEYWORD_INDEX) { Size_t warning_offset = table_index / MAX_UNI_KEYWORD_INDEX; table_index %= MAX_UNI_KEYWORD_INDEX; - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), + Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__UNICODE_PROPERTY_NAME), "Use of '%.*s' in \\p{} or \\P{} is deprecated because: %s", (int) name_len, name, get_deprecated_property_msg(warning_offset)); diff --git a/regen/warnings.pl b/regen/warnings.pl index 4a664aeee8a0..2f74371e7977 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -77,6 +77,7 @@ BEGIN 'deprecated' => [ 5.008, DEFAULT_ON, { 'deprecated::smartmatch' => [ 5.037009, DEFAULT_ON], 'deprecated::dot_in_inc' => [ 5.025011, DEFAULT_ON], + 'deprecated::unicode_property_name' => [ 5.011003, DEFAULT_ON], }], 'void' => [ 5.008, DEFAULT_OFF], 'recursion' => [ 5.008, DEFAULT_OFF], diff --git a/warnings.h b/warnings.h index 1a75e153b372..0d8e822f780b 100644 --- a/warnings.h +++ b/warnings.h @@ -80,68 +80,72 @@ #define WARN_IMPRECISION 46 #define WARN_ILLEGALPROTO 47 +/* Warnings Categories added in Perl 5.011003 */ + +#define WARN_DEPRECATED__UNICODE_PROPERTY_NAME 48 + /* Warnings Categories added in Perl 5.013 */ -#define WARN_NON_UNICODE 48 -#define WARN_NONCHAR 49 -#define WARN_SURROGATE 50 +#define WARN_NON_UNICODE 49 +#define WARN_NONCHAR 50 +#define WARN_SURROGATE 51 /* Warnings Categories added in Perl 5.017 */ -#define WARN_EXPERIMENTAL 51 -#define WARN_EXPERIMENTAL__REGEX_SETS 52 +#define WARN_EXPERIMENTAL 52 +#define WARN_EXPERIMENTAL__REGEX_SETS 53 /* Warnings Categories added in Perl 5.019 */ -#define WARN_SYSCALLS 53 +#define WARN_SYSCALLS 54 /* Warnings Categories added in Perl 5.021 */ -#define WARN_EXPERIMENTAL__CONST_ATTR 54 -#define WARN_EXPERIMENTAL__RE_STRICT 55 -#define WARN_EXPERIMENTAL__REFALIASING 56 -#define WARN_LOCALE 57 -#define WARN_MISSING 58 -#define WARN_REDUNDANT 59 +#define WARN_EXPERIMENTAL__CONST_ATTR 55 +#define WARN_EXPERIMENTAL__RE_STRICT 56 +#define WARN_EXPERIMENTAL__REFALIASING 57 +#define WARN_LOCALE 58 +#define WARN_MISSING 59 +#define WARN_REDUNDANT 60 /* Warnings Categories added in Perl 5.025 */ -#define WARN_EXPERIMENTAL__DECLARED_REFS 60 +#define WARN_EXPERIMENTAL__DECLARED_REFS 61 /* Warnings Categories added in Perl 5.025011 */ -#define WARN_DEPRECATED__DOT_IN_INC 61 +#define WARN_DEPRECATED__DOT_IN_INC 62 /* Warnings Categories added in Perl 5.027 */ -#define WARN_SHADOW 62 +#define WARN_SHADOW 63 /* Warnings Categories added in Perl 5.029 */ -#define WARN_EXPERIMENTAL__PRIVATE_USE 63 -#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 64 -#define WARN_EXPERIMENTAL__VLB 65 +#define WARN_EXPERIMENTAL__PRIVATE_USE 64 +#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 65 +#define WARN_EXPERIMENTAL__VLB 66 /* Warnings Categories added in Perl 5.033 */ -#define WARN_EXPERIMENTAL__TRY 66 +#define WARN_EXPERIMENTAL__TRY 67 /* Warnings Categories added in Perl 5.035 */ -#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 67 -#define WARN_EXPERIMENTAL__BUILTIN 68 -#define WARN_EXPERIMENTAL__DEFER 69 -#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 70 -#define WARN_EXPERIMENTAL__FOR_LIST 71 -#define WARN_SCALAR 72 +#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 68 +#define WARN_EXPERIMENTAL__BUILTIN 69 +#define WARN_EXPERIMENTAL__DEFER 70 +#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 71 +#define WARN_EXPERIMENTAL__FOR_LIST 72 +#define WARN_SCALAR 73 /* Warnings Categories added in Perl 5.037 */ -#define WARN_EXPERIMENTAL__CLASS 73 +#define WARN_EXPERIMENTAL__CLASS 74 /* Warnings Categories added in Perl 5.037009 */ -#define WARN_DEPRECATED__SMARTMATCH 74 +#define WARN_DEPRECATED__SMARTMATCH 75 #define WARNsize 19 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" #define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" @@ -304,6 +308,7 @@ category parameters passed. =for apidoc Amnh||WARN_VOID =for apidoc Amnh||WARN_IMPRECISION =for apidoc Amnh||WARN_ILLEGALPROTO +=for apidoc Amnh||WARN_DEPRECATED__UNICODE_PROPERTY_NAME =for apidoc Amnh||WARN_NON_UNICODE =for apidoc Amnh||WARN_NONCHAR =for apidoc Amnh||WARN_SURROGATE From e00cfa051744346bc23a7d67b6d64c28fdb612ba Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 09:01:13 +0100 Subject: [PATCH 06/18] warnings.pm - add deprecated::apostrophe_as_package_separator as new deprecation category This category is about use of apostrophe as a package separator, eg for things like "Test::More::isn't()". --- lib/warnings.pm | 321 +++++++++++++++++++++++----------------------- pod/perldiag.pod | 17 +-- regen/warnings.pl | 3 +- toke.c | 6 +- warnings.h | 13 +- 5 files changed, 187 insertions(+), 173 deletions(-) diff --git a/lib/warnings.pm b/lib/warnings.pm index c732aba4aa43..e91a820364be 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -120,165 +120,170 @@ our %Offsets = ( 'experimental::class' => 148, # Warnings Categories added in Perl 5.037009 - 'deprecated::smartmatch' => 150, + 'deprecated::apostrophe_as_package_separator'=> 150, + + # Warnings Categories added in Perl 5.03701 + 'deprecated::smartmatch' => 152, ); our %Bits = ( - 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55", # [0..75] - 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [29] - 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [30] - 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] - 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] - 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x40", # [2,48,62,75] - 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [62] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [75] - 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [48] - 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] - 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] - 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x05\x04\x55\x55\x11", # [52,53,55..57,61,64..72,74] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [68] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [69] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [74] - 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [55] - 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [61] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [70] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [71] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [72] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [64] - 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [56] - 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [57] - 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [53] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [67] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [65] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [66] - 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] - 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [47] - 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [46] - 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] - 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [5..11,54] - 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] - 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [58] - 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] - 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] - 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [59] - 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] - 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [49] - 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [50] - 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] - 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] - 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] - 'pack' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [16] - 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [32] - 'pipe' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] - 'portable' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [17] - 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [33] - 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [34] - 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [35] - 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] - 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] - 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] - 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [60] - 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] - 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [73] - 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] - 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [63] - 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] - 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] - 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [51] - 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [54] - 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] - 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [40] - 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [41] - 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] - 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [42] - 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [43] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x54\x00\x00\x00\x00\x00\x00", # [44,49..51] - 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [45] + 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55", # [0..79] + 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [29] + 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [30] + 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] + 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] + 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x40\x01", # [2,48,62,75,76] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] + 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48] + 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] + 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] + 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x05\x04\x55\x55\x11\x00", # [52,53,55..57,61,64..72,74] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [68] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [55] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [61] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [71] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [72] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [64] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [56] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [57] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [53] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [67] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [65] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [66] + 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] + 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [47] + 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [46] + 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] + 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] + 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [5..11,54] + 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [58] + 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] + 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [59] + 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [49] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [50] + 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] + 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] + 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] + 'pack' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [16] + 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [32] + 'pipe' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] + 'portable' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [17] + 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [33] + 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [34] + 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [35] + 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] + 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] + 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [60] + 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] + 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [73] + 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] + 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [63] + 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] + 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [51] + 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [54] + 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] + 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [40] + 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [41] + 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] + 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [42] + 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [43] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x54\x00\x00\x00\x00\x00\x00\x00", # [44,49..51] + 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [45] ); our %DeadBits = ( - 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", # [0..75] - 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [29] - 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [30] - 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] - 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] - 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x20\x00\x00\x80", # [2,48,62,75] - 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [62] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [75] - 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [48] - 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] - 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] - 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x0a\x08\xaa\xaa\x22", # [52,53,55..57,61,64..72,74] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [68] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [69] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [74] - 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [55] - 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [61] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [70] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [71] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [72] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [64] - 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [56] - 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [57] - 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [53] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [67] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [65] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [66] - 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] - 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [47] - 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [46] - 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] - 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [5..11,54] - 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] - 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [58] - 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] - 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] - 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [59] - 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] - 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [49] - 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [50] - 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] - 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] - 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] - 'pack' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [16] - 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [32] - 'pipe' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] - 'portable' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [17] - 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [33] - 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [34] - 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [35] - 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] - 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] - 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] - 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [60] - 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] - 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [73] - 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] - 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [63] - 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] - 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] - 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [51] - 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [54] - 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] - 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [40] - 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [41] - 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] - 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [42] - 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [43] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xa8\x00\x00\x00\x00\x00\x00", # [44,49..51] - 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [45] + 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", # [0..79] + 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [29] + 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [30] + 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] + 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] + 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x20\x00\x00\x80\x02", # [2,48,62,75,76] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] + 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48] + 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] + 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] + 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x0a\x08\xaa\xaa\x22\x00", # [52,53,55..57,61,64..72,74] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [68] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [55] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [61] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [71] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [72] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [64] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [56] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [57] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [53] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [67] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [65] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [66] + 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] + 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [47] + 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [46] + 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] + 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] + 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [5..11,54] + 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [58] + 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] + 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [59] + 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [49] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [50] + 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] + 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] + 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] + 'pack' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [16] + 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [32] + 'pipe' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] + 'portable' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [17] + 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [33] + 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [34] + 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [35] + 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] + 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] + 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [60] + 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] + 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [73] + 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] + 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [63] + 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] + 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [51] + 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [54] + 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] + 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [40] + 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [41] + 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] + 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [42] + 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [43] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xa8\x00\x00\x00\x00\x00\x00\x00", # [44,49..51] + 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [45] ); our %NoOp = ( @@ -293,10 +298,10 @@ our %NoOp = ( ); # These are used by various things, including our own tests -our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x01\x40\x15\x14\x55\x55\x51"; # [2,4,22,23,25,48,55..58,61,62,64..72,74,75] -our $LAST_BIT = 152 ; -our $BYTES = 19 ; +our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x01\x40\x15\x14\x55\x55\x51\x01"; # [2,4,22,23,25,48,55..58,61,62,64..72,74..76] +our $LAST_BIT = 154 ; +our $BYTES = 20 ; sub Croaker { @@ -898,6 +903,8 @@ The current hierarchy is: | +- deprecated ----+ | | + | +- deprecated::apostrophe_as_package_separator + | | | +- deprecated::dot_in_inc | | | +- deprecated::smartmatch diff --git a/pod/perldiag.pod b/pod/perldiag.pod index b072f28beaef..be8486b950b6 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -4658,18 +4658,19 @@ with real files). =item Old package separator "'" deprecated -(W deprecated, syntax) You used the old package separator "'" in a -variable, subroutine or package name. Support for the old package -separator will be removed in Perl 5.40. +(W deprecated::apostrophe_as_package_separator, syntax) You used the old package +separator "'" in a variable, subroutine or package name. Support for the +old package separator will be removed in Perl 5.42. =item Old package separator used in string -(W deprecated, syntax) You used the old package separator, "'", in a variable -named inside a double-quoted string; e.g., C<"In $name's house">. This -is equivalent to C<"In $name::s house">. If you meant the former, put -a backslash before the apostrophe (C<"In $name\'s house">). +(W deprecated::apostrophe_as_package_separator, syntax) You used the old package +separator, "'", in a variable named inside a double-quoted string; e.g., +C<"In $name's house">. This is equivalent to C<"In $name::s house">. If +you meant the former, put a backslash before the apostrophe +(C<"In $name\'s house">). -Support for the old package separator will be removed in Perl 5.40. +Support for the old package separator will be removed in Perl 5.42. =item Only scalar fields can take a :param attribute diff --git a/regen/warnings.pl b/regen/warnings.pl index 2f74371e7977..4e2507c55620 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -75,9 +75,10 @@ BEGIN 'malloc' => [ 5.008, DEFAULT_ON], }], 'deprecated' => [ 5.008, DEFAULT_ON, { - 'deprecated::smartmatch' => [ 5.037009, DEFAULT_ON], + 'deprecated::smartmatch' => [ 5.037010, DEFAULT_ON], 'deprecated::dot_in_inc' => [ 5.025011, DEFAULT_ON], 'deprecated::unicode_property_name' => [ 5.011003, DEFAULT_ON], + 'deprecated::apostrophe_as_package_separator' => [ 5.037009, DEFAULT_ON], }], 'void' => [ 5.008, DEFAULT_OFF], 'recursion' => [ 5.008, DEFAULT_OFF], diff --git a/toke.c b/toke.c index 9625f2520bcf..33f595992cc9 100644 --- a/toke.c +++ b/toke.c @@ -10212,7 +10212,7 @@ S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, else break; } - if (UNLIKELY(saw_tick && tick_warn && ckWARN2_d(WARN_SYNTAX, WARN_DEPRECATED))) { + if (UNLIKELY(saw_tick && tick_warn && ckWARN2_d(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR))) { if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets) { char *this_d; char *d2; @@ -10220,7 +10220,7 @@ S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, d2 = this_d; SAVEFREEPV(this_d); - Perl_warner(aTHX_ packWARN2(WARN_SYNTAX, WARN_DEPRECATED), + Perl_warner(aTHX_ packWARN2(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR), "Old package separator used in string"); if (olds[-1] == '#') *d2++ = olds[-2]; @@ -10238,7 +10238,7 @@ S_parse_ident(pTHX_ char **s, char **d, char * const e, int allow_package, UTF8fARG(is_utf8, d2-this_d, this_d)); } else { - Perl_warner(aTHX_ packWARN2(WARN_SYNTAX, WARN_DEPRECATED), + Perl_warner(aTHX_ packWARN2(WARN_SYNTAX, WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR), "Old package separator \"'\" deprecated"); } } diff --git a/warnings.h b/warnings.h index 0d8e822f780b..8ce75b1fe325 100644 --- a/warnings.h +++ b/warnings.h @@ -145,10 +145,14 @@ /* Warnings Categories added in Perl 5.037009 */ -#define WARN_DEPRECATED__SMARTMATCH 75 -#define WARNsize 19 -#define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" -#define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" +#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 75 + +/* Warnings Categories added in Perl 5.03701 */ + +#define WARN_DEPRECATED__SMARTMATCH 76 +#define WARNsize 20 +#define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" +#define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" #define isLEXWARN_on \ cBOOL(PL_curcop && PL_curcop->cop_warnings != pWARN_STD) @@ -335,6 +339,7 @@ category parameters passed. =for apidoc Amnh||WARN_EXPERIMENTAL__FOR_LIST =for apidoc Amnh||WARN_SCALAR =for apidoc Amnh||WARN_EXPERIMENTAL__CLASS +=for apidoc Amnh||WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR =for apidoc Amnh||WARN_DEPRECATED__SMARTMATCH =cut From 21e672064eb8c10e6e2305d06b7adf2d129110e4 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 09:08:20 +0100 Subject: [PATCH 07/18] warnings.pm - add deprecated::delimiter_will_be_paired category Some delimiters are considered deprecated because in the future they will be used as part of a paired delimiter. This adds a new category for these cases. --- lib/warnings.pm | 37 ++++++++++++++++++++++--------------- pod/perldiag.pod | 13 +++++++------ regen/warnings.pl | 1 + toke.c | 2 +- warnings.h | 11 ++++++++--- 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/lib/warnings.pm b/lib/warnings.pm index e91a820364be..5ca9a087d8e6 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -116,14 +116,17 @@ our %Offsets = ( 'experimental::for_list' => 144, 'scalar' => 146, + # Warnings Categories added in Perl 5.03501 + 'deprecated::delimiter_will_be_paired'=> 148, + # Warnings Categories added in Perl 5.037 - 'experimental::class' => 148, + 'experimental::class' => 150, # Warnings Categories added in Perl 5.037009 - 'deprecated::apostrophe_as_package_separator'=> 150, + 'deprecated::apostrophe_as_package_separator'=> 152, # Warnings Categories added in Perl 5.03701 - 'deprecated::smartmatch' => 152, + 'deprecated::smartmatch' => 154, ); our %Bits = ( @@ -133,18 +136,19 @@ our %Bits = ( 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x40\x01", # [2,48,62,75,76] - 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x10\x05", # [2,48,62,74,76,77] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] + 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74] 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77] 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x05\x04\x55\x55\x11\x00", # [52,53,55..57,61,64..72,74] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x05\x04\x55\x55\x41\x00", # [52,53,55..57,61,64..72,75] 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [68] 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [55] 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [61] 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70] @@ -213,18 +217,19 @@ our %DeadBits = ( 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x20\x00\x00\x80\x02", # [2,48,62,75,76] - 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x20\x00\x00\x20\x0a", # [2,48,62,74,76,77] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] + 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74] 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77] 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x0a\x08\xaa\xaa\x22\x00", # [52,53,55..57,61,64..72,74] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x0a\x08\xaa\xaa\x82\x00", # [52,53,55..57,61,64..72,75] 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [68] 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [55] 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [61] 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70] @@ -299,8 +304,8 @@ our %NoOp = ( # These are used by various things, including our own tests our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x01\x40\x15\x14\x55\x55\x51\x01"; # [2,4,22,23,25,48,55..58,61,62,64..72,74..76] -our $LAST_BIT = 154 ; +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x01\x40\x15\x14\x55\x55\x51\x05"; # [2,4,22,23,25,48,55..58,61,62,64..72,74..77] +our $LAST_BIT = 156 ; our $BYTES = 20 ; sub Croaker @@ -905,6 +910,8 @@ The current hierarchy is: | | | +- deprecated::apostrophe_as_package_separator | | + | +- deprecated::delimiter_will_be_paired + | | | +- deprecated::dot_in_inc | | | +- deprecated::smartmatch diff --git a/pod/perldiag.pod b/pod/perldiag.pod index be8486b950b6..fad5b672a4dd 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -7592,12 +7592,13 @@ only C. This usually means there's a better way to do it in Perl. =item Use of '%s' is deprecated as a string delimiter -(D deprecated) You used the given character as a starting delimiter of a -string outside the scope of S>. -This character is the mirror image of another Unicode character; within -the scope of that feature, the two are considered a pair for delimitting -strings. It is planned to make that feature the default, at which point -this usage would become illegal; hence this warning. +(D deprecated::delimiter_will_be_paired) You used the given character as +a starting delimiter of a string outside the scope of +S>. This character is the +mirror image of another Unicode character; within the scope of that +feature, the two are considered a pair for delimitting strings. It is +planned to make that feature the default, at which point this usage +would become illegal; hence this warning. For now, you may live with this warning, or turn it off, but this code will no longer compile in a future version of Perl. Or you can turn on diff --git a/regen/warnings.pl b/regen/warnings.pl index 4e2507c55620..45cf34ec6604 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -79,6 +79,7 @@ BEGIN 'deprecated::dot_in_inc' => [ 5.025011, DEFAULT_ON], 'deprecated::unicode_property_name' => [ 5.011003, DEFAULT_ON], 'deprecated::apostrophe_as_package_separator' => [ 5.037009, DEFAULT_ON], + 'deprecated::delimiter_will_be_paired' => [ 5.035010, DEFAULT_ON], }], 'void' => [ 5.008, DEFAULT_OFF], 'recursion' => [ 5.008, DEFAULT_OFF], diff --git a/toke.c b/toke.c index 33f595992cc9..4fc99e884939 100644 --- a/toke.c +++ b/toke.c @@ -11653,7 +11653,7 @@ Perl_scan_str(pTHX_ char *start, int keep_bracketed_quoted, int keep_delims, int if (ninstr(deprecated_opening_delims, deprecated_delims_end, open_delim_str, open_delim_str + delim_byte_len)) { - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), + Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED), "Use of '%" UTF8f "' is deprecated as a string delimiter", UTF8fARG(UTF, delim_byte_len, open_delim_str)); } diff --git a/warnings.h b/warnings.h index 8ce75b1fe325..39639d82f1ed 100644 --- a/warnings.h +++ b/warnings.h @@ -139,17 +139,21 @@ #define WARN_EXPERIMENTAL__FOR_LIST 72 #define WARN_SCALAR 73 +/* Warnings Categories added in Perl 5.03501 */ + +#define WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED 74 + /* Warnings Categories added in Perl 5.037 */ -#define WARN_EXPERIMENTAL__CLASS 74 +#define WARN_EXPERIMENTAL__CLASS 75 /* Warnings Categories added in Perl 5.037009 */ -#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 75 +#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 76 /* Warnings Categories added in Perl 5.03701 */ -#define WARN_DEPRECATED__SMARTMATCH 76 +#define WARN_DEPRECATED__SMARTMATCH 77 #define WARNsize 20 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" #define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" @@ -338,6 +342,7 @@ category parameters passed. =for apidoc Amnh||WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS =for apidoc Amnh||WARN_EXPERIMENTAL__FOR_LIST =for apidoc Amnh||WARN_SCALAR +=for apidoc Amnh||WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED =for apidoc Amnh||WARN_EXPERIMENTAL__CLASS =for apidoc Amnh||WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR =for apidoc Amnh||WARN_DEPRECATED__SMARTMATCH From 9ac796e0a2a8608ad3644a324d7a15993dccb858 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 15:02:15 +0100 Subject: [PATCH 08/18] warnings.pm - add deprecated::goto_construct category This category applies to attempts to goto the internals of a block construct. --- handy.h | 2 +- lib/warnings.pm | 201 ++++++++++++++++++++++++---------------------- pod/perldiag.pod | 2 +- pp_ctl.c | 2 +- regen/warnings.pl | 1 + warnings.h | 62 +++++++------- 6 files changed, 139 insertions(+), 131 deletions(-) diff --git a/handy.h b/handy.h index 3e5e42d12f6e..3f1922728ca5 100644 --- a/handy.h +++ b/handy.h @@ -2959,7 +2959,7 @@ last-inclusive range. shortcut macro defined without -DPERL_CORE. Neither codesearch.google.com nor CPAN::Unpack show any users outside the core. */ #ifdef PERL_CORE -# define deprecate(s) Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ +# define deprecate(category,s) Perl_ck_warner_d(aTHX_ packWARN(category), \ "Use of " s " is deprecated") # define deprecate_disappears_in(when,message) \ Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ diff --git a/lib/warnings.pm b/lib/warnings.pm index 5ca9a087d8e6..5dd848c1e2ec 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -69,64 +69,65 @@ our %Offsets = ( 'illegalproto' => 94, # Warnings Categories added in Perl 5.011003 - 'deprecated::unicode_property_name' => 96, + 'deprecated::goto_construct' => 96, + 'deprecated::unicode_property_name' => 98, # Warnings Categories added in Perl 5.013 - 'non_unicode' => 98, - 'nonchar' => 100, - 'surrogate' => 102, + 'non_unicode' => 100, + 'nonchar' => 102, + 'surrogate' => 104, # Warnings Categories added in Perl 5.017 - 'experimental' => 104, - 'experimental::regex_sets' => 106, + 'experimental' => 106, + 'experimental::regex_sets' => 108, # Warnings Categories added in Perl 5.019 - 'syscalls' => 108, + 'syscalls' => 110, # Warnings Categories added in Perl 5.021 - 'experimental::const_attr' => 110, - 'experimental::re_strict' => 112, - 'experimental::refaliasing' => 114, - 'locale' => 116, - 'missing' => 118, - 'redundant' => 120, + 'experimental::const_attr' => 112, + 'experimental::re_strict' => 114, + 'experimental::refaliasing' => 116, + 'locale' => 118, + 'missing' => 120, + 'redundant' => 122, # Warnings Categories added in Perl 5.025 - 'experimental::declared_refs' => 122, + 'experimental::declared_refs' => 124, # Warnings Categories added in Perl 5.025011 - 'deprecated::dot_in_inc' => 124, + 'deprecated::dot_in_inc' => 126, # Warnings Categories added in Perl 5.027 - 'shadow' => 126, + 'shadow' => 128, # Warnings Categories added in Perl 5.029 - 'experimental::private_use' => 128, - 'experimental::uniprop_wildcards' => 130, - 'experimental::vlb' => 132, + 'experimental::private_use' => 130, + 'experimental::uniprop_wildcards' => 132, + 'experimental::vlb' => 134, # Warnings Categories added in Perl 5.033 - 'experimental::try' => 134, + 'experimental::try' => 136, # Warnings Categories added in Perl 5.035 - 'experimental::args_array_with_signatures'=> 136, - 'experimental::builtin' => 138, - 'experimental::defer' => 140, - 'experimental::extra_paired_delimiters'=> 142, - 'experimental::for_list' => 144, - 'scalar' => 146, + 'experimental::args_array_with_signatures'=> 138, + 'experimental::builtin' => 140, + 'experimental::defer' => 142, + 'experimental::extra_paired_delimiters'=> 144, + 'experimental::for_list' => 146, + 'scalar' => 148, # Warnings Categories added in Perl 5.03501 - 'deprecated::delimiter_will_be_paired'=> 148, + 'deprecated::delimiter_will_be_paired'=> 150, # Warnings Categories added in Perl 5.037 - 'experimental::class' => 150, + 'experimental::class' => 152, # Warnings Categories added in Perl 5.037009 - 'deprecated::apostrophe_as_package_separator'=> 152, + 'deprecated::apostrophe_as_package_separator'=> 154, # Warnings Categories added in Perl 5.03701 - 'deprecated::smartmatch' => 154, + 'deprecated::smartmatch' => 156, ); our %Bits = ( @@ -136,45 +137,46 @@ our %Bits = ( 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x10\x00\x00\x10\x05", # [2,48,62,74,76,77] - 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] - 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74] - 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77] - 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x40\x00\x00\x40\x14", # [2,48,49,63,75,77,78] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77] + 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [63] + 'deprecated::goto_construct' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [78] + 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [49] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x05\x04\x55\x55\x41\x00", # [52,53,55..57,61,64..72,75] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [68] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] - 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [55] - 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [61] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [71] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [72] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [64] - 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [56] - 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [57] - 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [53] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [67] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [65] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [66] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x15\x10\x54\x55\x05\x01", # [53,54,56..58,62,65..73,76] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [56] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [71] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [72] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [73] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [65] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [57] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [58] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [54] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [68] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [66] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [67] 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [5..11,54] + 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [5..11,55] 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] - 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [58] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [59] 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] - 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [59] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [60] 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] - 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [49] - 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [50] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [50] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [51] 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] @@ -188,25 +190,25 @@ our %Bits = ( 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] - 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [60] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [61] 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [73] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [74] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [63] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [64] 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] - 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [51] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [52] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [54] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [55] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [41] 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [42] 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [43] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x54\x00\x00\x00\x00\x00\x00\x00", # [44,49..51] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x50\x01\x00\x00\x00\x00\x00\x00", # [44,50..52] 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [45] ); @@ -217,45 +219,46 @@ our %DeadBits = ( 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x20\x00\x00\x20\x0a", # [2,48,62,74,76,77] - 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] - 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74] - 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77] - 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x80\x00\x00\x80\x28", # [2,48,49,63,75,77,78] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77] + 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] + 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [63] + 'deprecated::goto_construct' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [78] + 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [49] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8a\x0a\x08\xaa\xaa\x82\x00", # [52,53,55..57,61,64..72,75] - 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [68] - 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] - 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [55] - 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [61] - 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70] - 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [71] - 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [72] - 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [64] - 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [56] - 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [57] - 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [53] - 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [67] - 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [65] - 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [66] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x2a\x20\xa8\xaa\x0a\x02", # [53,54,56..58,62,65..73,76] + 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69] + 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [56] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62] + 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [71] + 'experimental::extra_paired_delimiters'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [72] + 'experimental::for_list' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [73] + 'experimental::private_use' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [65] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [57] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [58] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [54] + 'experimental::try' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [68] + 'experimental::uniprop_wildcards' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [66] + 'experimental::vlb' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [67] 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [47] 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] - 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [5..11,54] + 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [5..11,55] 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] - 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [58] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [59] 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] - 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [59] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [60] 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] - 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [49] - 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [50] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [50] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [51] 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] @@ -269,25 +272,25 @@ our %DeadBits = ( 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [36] 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] - 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [60] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [61] 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [37] - 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [73] + 'scalar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [74] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] - 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [63] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [64] 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] - 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [51] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [52] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [54] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [55] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [41] 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [42] 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [43] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xa8\x00\x00\x00\x00\x00\x00\x00", # [44,49..51] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\xa0\x02\x00\x00\x00\x00\x00\x00", # [44,50..52] 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [45] ); @@ -304,8 +307,8 @@ our %NoOp = ( # These are used by various things, including our own tests our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x01\x40\x15\x14\x55\x55\x51\x05"; # [2,4,22,23,25,48,55..58,61,62,64..72,74..77] -our $LAST_BIT = 156 ; +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x05\x00\x55\x50\x54\x55\x45\x15"; # [2,4,22,23,25,48,49,56..59,62,63,65..73,75..78] +our $LAST_BIT = 158 ; our $BYTES = 20 ; sub Croaker @@ -914,6 +917,8 @@ The current hierarchy is: | | | +- deprecated::dot_in_inc | | + | +- deprecated::goto_construct + | | | +- deprecated::smartmatch | | | +- deprecated::unicode_property_name diff --git a/pod/perldiag.pod b/pod/perldiag.pod index fad5b672a4dd..325ca9d60f14 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -7564,7 +7564,7 @@ repeatedly, the C has no effect. =item Use of "goto" to jump into a construct is deprecated -(D deprecated) Using C to jump from an outer scope into an inner +(D deprecated::goto_construct) Using C to jump from an outer scope into an inner scope is deprecated and should be avoided. This was deprecated in Perl 5.12. diff --git a/pp_ctl.c b/pp_ctl.c index dee18a45c3c0..af13e25d3dee 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -3335,7 +3335,7 @@ PP(pp_goto) ? 2 : 1; if (enterops[i]) - deprecate("\"goto\" to jump into a construct"); + deprecate(WARN_DEPRECATED__GOTO_CONSTRUCT, "\"goto\" to jump into a construct"); } /* pop unwanted frames */ diff --git a/regen/warnings.pl b/regen/warnings.pl index 45cf34ec6604..2b4fc27f0386 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -80,6 +80,7 @@ BEGIN 'deprecated::unicode_property_name' => [ 5.011003, DEFAULT_ON], 'deprecated::apostrophe_as_package_separator' => [ 5.037009, DEFAULT_ON], 'deprecated::delimiter_will_be_paired' => [ 5.035010, DEFAULT_ON], + 'deprecated::goto_construct' => [ 5.011003, DEFAULT_ON], }], 'void' => [ 5.008, DEFAULT_OFF], 'recursion' => [ 5.008, DEFAULT_OFF], diff --git a/warnings.h b/warnings.h index 39639d82f1ed..e912397c237e 100644 --- a/warnings.h +++ b/warnings.h @@ -82,78 +82,79 @@ /* Warnings Categories added in Perl 5.011003 */ -#define WARN_DEPRECATED__UNICODE_PROPERTY_NAME 48 +#define WARN_DEPRECATED__GOTO_CONSTRUCT 48 +#define WARN_DEPRECATED__UNICODE_PROPERTY_NAME 49 /* Warnings Categories added in Perl 5.013 */ -#define WARN_NON_UNICODE 49 -#define WARN_NONCHAR 50 -#define WARN_SURROGATE 51 +#define WARN_NON_UNICODE 50 +#define WARN_NONCHAR 51 +#define WARN_SURROGATE 52 /* Warnings Categories added in Perl 5.017 */ -#define WARN_EXPERIMENTAL 52 -#define WARN_EXPERIMENTAL__REGEX_SETS 53 +#define WARN_EXPERIMENTAL 53 +#define WARN_EXPERIMENTAL__REGEX_SETS 54 /* Warnings Categories added in Perl 5.019 */ -#define WARN_SYSCALLS 54 +#define WARN_SYSCALLS 55 /* Warnings Categories added in Perl 5.021 */ -#define WARN_EXPERIMENTAL__CONST_ATTR 55 -#define WARN_EXPERIMENTAL__RE_STRICT 56 -#define WARN_EXPERIMENTAL__REFALIASING 57 -#define WARN_LOCALE 58 -#define WARN_MISSING 59 -#define WARN_REDUNDANT 60 +#define WARN_EXPERIMENTAL__CONST_ATTR 56 +#define WARN_EXPERIMENTAL__RE_STRICT 57 +#define WARN_EXPERIMENTAL__REFALIASING 58 +#define WARN_LOCALE 59 +#define WARN_MISSING 60 +#define WARN_REDUNDANT 61 /* Warnings Categories added in Perl 5.025 */ -#define WARN_EXPERIMENTAL__DECLARED_REFS 61 +#define WARN_EXPERIMENTAL__DECLARED_REFS 62 /* Warnings Categories added in Perl 5.025011 */ -#define WARN_DEPRECATED__DOT_IN_INC 62 +#define WARN_DEPRECATED__DOT_IN_INC 63 /* Warnings Categories added in Perl 5.027 */ -#define WARN_SHADOW 63 +#define WARN_SHADOW 64 /* Warnings Categories added in Perl 5.029 */ -#define WARN_EXPERIMENTAL__PRIVATE_USE 64 -#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 65 -#define WARN_EXPERIMENTAL__VLB 66 +#define WARN_EXPERIMENTAL__PRIVATE_USE 65 +#define WARN_EXPERIMENTAL__UNIPROP_WILDCARDS 66 +#define WARN_EXPERIMENTAL__VLB 67 /* Warnings Categories added in Perl 5.033 */ -#define WARN_EXPERIMENTAL__TRY 67 +#define WARN_EXPERIMENTAL__TRY 68 /* Warnings Categories added in Perl 5.035 */ -#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 68 -#define WARN_EXPERIMENTAL__BUILTIN 69 -#define WARN_EXPERIMENTAL__DEFER 70 -#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 71 -#define WARN_EXPERIMENTAL__FOR_LIST 72 -#define WARN_SCALAR 73 +#define WARN_EXPERIMENTAL__ARGS_ARRAY_WITH_SIGNATURES 69 +#define WARN_EXPERIMENTAL__BUILTIN 70 +#define WARN_EXPERIMENTAL__DEFER 71 +#define WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS 72 +#define WARN_EXPERIMENTAL__FOR_LIST 73 +#define WARN_SCALAR 74 /* Warnings Categories added in Perl 5.03501 */ -#define WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED 74 +#define WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED 75 /* Warnings Categories added in Perl 5.037 */ -#define WARN_EXPERIMENTAL__CLASS 75 +#define WARN_EXPERIMENTAL__CLASS 76 /* Warnings Categories added in Perl 5.037009 */ -#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 76 +#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 77 /* Warnings Categories added in Perl 5.03701 */ -#define WARN_DEPRECATED__SMARTMATCH 77 +#define WARN_DEPRECATED__SMARTMATCH 78 #define WARNsize 20 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" #define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" @@ -316,6 +317,7 @@ category parameters passed. =for apidoc Amnh||WARN_VOID =for apidoc Amnh||WARN_IMPRECISION =for apidoc Amnh||WARN_ILLEGALPROTO +=for apidoc Amnh||WARN_DEPRECATED__GOTO_CONSTRUCT =for apidoc Amnh||WARN_DEPRECATED__UNICODE_PROPERTY_NAME =for apidoc Amnh||WARN_NON_UNICODE =for apidoc Amnh||WARN_NONCHAR From f64f6e824cddb22ce6c163184903b3d618a79752 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 15:04:53 +0100 Subject: [PATCH 09/18] warnings.pm - add deprecated::version_downgrade category This also fixes the version_downgrade to show the correct version that version downgrades will be removed in. --- handy.h | 8 ++++---- lib/warnings.pm | 43 +++++++++++++++++++++++++------------------ op.c | 2 +- pod/perldiag.pod | 12 ++++++------ regen/warnings.pl | 1 + warnings.h | 13 +++++++++---- 6 files changed, 46 insertions(+), 33 deletions(-) diff --git a/handy.h b/handy.h index 3f1922728ca5..5444aa65ae0b 100644 --- a/handy.h +++ b/handy.h @@ -2961,11 +2961,11 @@ last-inclusive range. #ifdef PERL_CORE # define deprecate(category,s) Perl_ck_warner_d(aTHX_ packWARN(category), \ "Use of " s " is deprecated") -# define deprecate_disappears_in(when,message) \ - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ +# define deprecate_disappears_in(category,when,message) \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ message " is deprecated, and will disappear in Perl " when) -# define deprecate_fatal_in(when,message) \ - Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED), \ +# define deprecate_fatal_in(category,when,message) \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ message " is deprecated, and will become fatal in Perl " when) #endif diff --git a/lib/warnings.pm b/lib/warnings.pm index 5dd848c1e2ec..b484bc4d4918 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -117,17 +117,20 @@ our %Offsets = ( 'experimental::for_list' => 146, 'scalar' => 148, + # Warnings Categories added in Perl 5.035009 + 'deprecated::version_downgrade' => 150, + # Warnings Categories added in Perl 5.03501 - 'deprecated::delimiter_will_be_paired'=> 150, + 'deprecated::delimiter_will_be_paired'=> 152, # Warnings Categories added in Perl 5.037 - 'experimental::class' => 152, + 'experimental::class' => 154, # Warnings Categories added in Perl 5.037009 - 'deprecated::apostrophe_as_package_separator'=> 154, + 'deprecated::apostrophe_as_package_separator'=> 156, # Warnings Categories added in Perl 5.03701 - 'deprecated::smartmatch' => 156, + 'deprecated::smartmatch' => 158, ); our %Bits = ( @@ -137,20 +140,21 @@ our %Bits = ( 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x40\x00\x00\x40\x14", # [2,48,49,63,75,77,78] - 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77] - 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x40\x00\x00\x40\x51", # [2,48,49,63,75,76,78,79] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [78] + 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [63] 'deprecated::goto_construct' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [48] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [78] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [79] 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [49] + 'deprecated::version_downgrade' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [75] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x15\x10\x54\x55\x05\x01", # [53,54,56..58,62,65..73,76] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x15\x10\x54\x55\x05\x04", # [53,54,56..58,62,65..73,77] 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [69] 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [70] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [76] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [77] 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [56] 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [62] 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [71] @@ -219,20 +223,21 @@ our %DeadBits = ( 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] - 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x80\x00\x00\x80\x28", # [2,48,49,63,75,77,78] - 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77] - 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x80\x00\x00\x80\xa2", # [2,48,49,63,75,76,78,79] + 'deprecated::apostrophe_as_package_separator'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [78] + 'deprecated::delimiter_will_be_paired'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] 'deprecated::dot_in_inc' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [63] 'deprecated::goto_construct' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [48] - 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [78] + 'deprecated::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [79] 'deprecated::unicode_property_name' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [49] + 'deprecated::version_downgrade' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [75] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x2a\x20\xa8\xaa\x0a\x02", # [53,54,56..58,62,65..73,76] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x2a\x20\xa8\xaa\x0a\x08", # [53,54,56..58,62,65..73,77] 'experimental::args_array_with_signatures'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [69] 'experimental::builtin' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [70] - 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [76] + 'experimental::class' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [77] 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [56] 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [62] 'experimental::defer' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [71] @@ -307,8 +312,8 @@ our %NoOp = ( # These are used by various things, including our own tests our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x05\x00\x55\x50\x54\x55\x45\x15"; # [2,4,22,23,25,48,49,56..59,62,63,65..73,75..78] -our $LAST_BIT = 158 ; +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x05\x00\x55\x50\x54\x55\x45\x55"; # [2,4,22,23,25,48,49,56..59,62,63,65..73,75..79] +our $LAST_BIT = 160 ; our $BYTES = 20 ; sub Croaker @@ -922,6 +927,8 @@ The current hierarchy is: | +- deprecated::smartmatch | | | +- deprecated::unicode_property_name + | | + | +- deprecated::version_downgrade | +- exiting | diff --git a/op.c b/op.c index e36cfbddf88d..cf3f034f4e58 100644 --- a/op.c +++ b/op.c @@ -7914,7 +7914,7 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg) /* otherwise they are off */ else { if(PL_prevailing_version >= SHORTVER(5, 11)) - deprecate_fatal_in("5.40", + deprecate_fatal_in(WARN_DEPRECATED__VERSION_DOWNGRADE, "5.40", "Downgrading a use VERSION declaration to below v5.11"); if (!(PL_hints & HINT_EXPLICIT_STRICT_REFS)) diff --git a/pod/perldiag.pod b/pod/perldiag.pod index 325ca9d60f14..fc64eebe4fb7 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -2177,12 +2177,12 @@ somehow called on another platform. This should not happen. =item Downgrading a use VERSION declaration to below v5.11 is deprecated -(S deprecated) This warning is emitted on a C statement that -requests a version below v5.11 (when the effects of C would be -disabled), after a previous declaration of one having a larger number (which -would have enabled these effects). Because of a change to the way that -C interacts with the strictness flags, this is no longer -supported. +(S deprecated::version_downgrade) This warning is emitted on a +C statement that requests a version below v5.11 (when the +effects of C would be disabled), after a previous +declaration of one having a larger number (which would have enabled +these effects). Because of a change to the way that C +interacts with the strictness flags, this is no longer supported. =item (Do you need to predeclare %s?) diff --git a/regen/warnings.pl b/regen/warnings.pl index 2b4fc27f0386..6b49709c6a6a 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -81,6 +81,7 @@ BEGIN 'deprecated::apostrophe_as_package_separator' => [ 5.037009, DEFAULT_ON], 'deprecated::delimiter_will_be_paired' => [ 5.035010, DEFAULT_ON], 'deprecated::goto_construct' => [ 5.011003, DEFAULT_ON], + 'deprecated::version_downgrade' => [ 5.035009, DEFAULT_ON], }], 'void' => [ 5.008, DEFAULT_OFF], 'recursion' => [ 5.008, DEFAULT_OFF], diff --git a/warnings.h b/warnings.h index e912397c237e..50b105eebfc2 100644 --- a/warnings.h +++ b/warnings.h @@ -140,21 +140,25 @@ #define WARN_EXPERIMENTAL__FOR_LIST 73 #define WARN_SCALAR 74 +/* Warnings Categories added in Perl 5.035009 */ + +#define WARN_DEPRECATED__VERSION_DOWNGRADE 75 + /* Warnings Categories added in Perl 5.03501 */ -#define WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED 75 +#define WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED 76 /* Warnings Categories added in Perl 5.037 */ -#define WARN_EXPERIMENTAL__CLASS 76 +#define WARN_EXPERIMENTAL__CLASS 77 /* Warnings Categories added in Perl 5.037009 */ -#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 77 +#define WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR 78 /* Warnings Categories added in Perl 5.03701 */ -#define WARN_DEPRECATED__SMARTMATCH 78 +#define WARN_DEPRECATED__SMARTMATCH 79 #define WARNsize 20 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" #define WARN_NONEstring "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" @@ -344,6 +348,7 @@ category parameters passed. =for apidoc Amnh||WARN_EXPERIMENTAL__EXTRA_PAIRED_DELIMITERS =for apidoc Amnh||WARN_EXPERIMENTAL__FOR_LIST =for apidoc Amnh||WARN_SCALAR +=for apidoc Amnh||WARN_DEPRECATED__VERSION_DOWNGRADE =for apidoc Amnh||WARN_DEPRECATED__DELIMITER_WILL_BE_PAIRED =for apidoc Amnh||WARN_EXPERIMENTAL__CLASS =for apidoc Amnh||WARN_DEPRECATED__APOSTROPHE_AS_PACKAGE_SEPARATOR From 617170d8fd39cea88b7e990098ec4b601c61d363 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 15:05:50 +0100 Subject: [PATCH 10/18] regen/warnings.pl - line up categories, put them in date order This makes it easier to see the order the categories were added in. --- regen/warnings.pl | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/regen/warnings.pl b/regen/warnings.pl index 6b49709c6a6a..1d1aa1de664b 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -75,13 +75,14 @@ BEGIN 'malloc' => [ 5.008, DEFAULT_ON], }], 'deprecated' => [ 5.008, DEFAULT_ON, { - 'deprecated::smartmatch' => [ 5.037010, DEFAULT_ON], - 'deprecated::dot_in_inc' => [ 5.025011, DEFAULT_ON], - 'deprecated::unicode_property_name' => [ 5.011003, DEFAULT_ON], - 'deprecated::apostrophe_as_package_separator' => [ 5.037009, DEFAULT_ON], - 'deprecated::delimiter_will_be_paired' => [ 5.035010, DEFAULT_ON], 'deprecated::goto_construct' => [ 5.011003, DEFAULT_ON], + 'deprecated::unicode_property_name' => [ 5.011003, DEFAULT_ON], + 'deprecated::dot_in_inc' => [ 5.025011, DEFAULT_ON], 'deprecated::version_downgrade' => [ 5.035009, DEFAULT_ON], + 'deprecated::delimiter_will_be_paired' => [ 5.035010, DEFAULT_ON], + 'deprecated::apostrophe_as_package_separator' + => [ 5.037009, DEFAULT_ON], + 'deprecated::smartmatch' => [ 5.037010, DEFAULT_ON], }], 'void' => [ 5.008, DEFAULT_OFF], 'recursion' => [ 5.008, DEFAULT_OFF], From 94368e2019af36a6627c556f903edf2185fe64c5 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 10:19:01 +0100 Subject: [PATCH 11/18] embed.fnc - document deprecate_xxx() macros and add them to handy.h Also do not generate PERL_ARGS style macros for macros. --- embed.fnc | 10 ++++++++ handy.h | 37 +++++++++++++++++++++-------- proto.h | 63 ++++++++------------------------------------------ regen/embed.pl | 2 +- 4 files changed, 48 insertions(+), 64 deletions(-) diff --git a/embed.fnc b/embed.fnc index 8ec175f92e24..48a3569c09e3 100644 --- a/embed.fnc +++ b/embed.fnc @@ -3872,6 +3872,16 @@ EXpx |SV * |sv_setsv_cow |NULLOK SV *dsv \ |NN SV *ssv #endif /* defined(PERL_ANY_COW) */ #if defined(PERL_CORE) +Cdm |void |deprecate |U32 category \ + |"construct" +Cdm |void |deprecate_disappears_in \ + |U32 category \ + |"when" \ + |"construct" +Cdm |void |deprecate_fatal_in \ + |U32 category \ + |"when" \ + |"construct" p |void |opslab_force_free \ |NN OPSLAB *slab p |void |opslab_free |NN OPSLAB *slab diff --git a/handy.h b/handy.h index 5444aa65ae0b..7807c9ecba42 100644 --- a/handy.h +++ b/handy.h @@ -2955,18 +2955,37 @@ last-inclusive range. #define pTHX__VALUE #endif /* USE_ITHREADS */ -/* Perl_deprecate was not part of the public API, and did not have a deprecate() - shortcut macro defined without -DPERL_CORE. Neither codesearch.google.com nor - CPAN::Unpack show any users outside the core. */ +/* + Perl_deprecate was not part of the public API, and did not have a deprecate() + shortcut macro defined without -DPERL_CORE. Neither codesearch.google.com nor + CPAN::Unpack show any users outside the core. + +=for apidoc_section $warning +=for apidoc m||deprecate|U32 category|"construct" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the given +category with an appropriate message. The C argument must be a C string. + +=for apidoc m||deprecate_disappears_in|U32 category|"when"|"construct" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the given +category with an appropriate message that the construct will disappear in a specific +release. The C and C arguments must be a C string. + +=for apidoc m||deprecate_fatal_in|U32 category|"when"|"construct" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the given +category with an appropriate message that the construct will become fatal in a specific +release. The C and C arguments must be a C string. + +*/ + #ifdef PERL_CORE -# define deprecate(category,s) Perl_ck_warner_d(aTHX_ packWARN(category), \ - "Use of " s " is deprecated") -# define deprecate_disappears_in(category,when,message) \ +# define deprecate(category,construct) Perl_ck_warner_d(aTHX_ packWARN(category), \ + "Use of " construct " is deprecated") +# define deprecate_disappears_in(category,when,construct) \ Perl_ck_warner_d(aTHX_ packWARN(category), \ - message " is deprecated, and will disappear in Perl " when) -# define deprecate_fatal_in(category,when,message) \ + construct " is deprecated, and will disappear in Perl " when) +# define deprecate_fatal_in(category,when,construct) \ Perl_ck_warner_d(aTHX_ packWARN(category), \ - message " is deprecated, and will become fatal in Perl " when) + construct " is deprecated, and will become fatal in Perl " when) #endif /* Internal macros to deal with gids and uids */ diff --git a/proto.h b/proto.h index 161b7e9bb7ea..e01277451718 100644 --- a/proto.h +++ b/proto.h @@ -56,7 +56,6 @@ Perl_PerlLIO_open_cloexec(pTHX_ const char *file, int flag) /* PERL_CALLCONV const XOP * Perl_custom_op_xop(pTHX_ const OP *o); */ -#define PERL_ARGS_ASSERT_PERL_CUSTOM_OP_XOP PERL_CALLCONV HV * Perl_localeconv(pTHX); @@ -334,12 +333,10 @@ Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val); /* PERL_CALLCONV SSize_t av_tindex(pTHX_ AV *av) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_AV_TINDEX /* PERL_CALLCONV SSize_t av_top_index(pTHX_ AV *av) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_AV_TOP_INDEX PERL_CALLCONV void Perl_av_undef(pTHX_ AV *av); @@ -1155,7 +1152,6 @@ Perl_find_script(pTHX_ const char *scriptname, bool dosearch, const char * const /* PERL_CALLCONV I32 foldEQ_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */ -#define PERL_ARGS_ASSERT_FOLDEQ_UTF8 PERL_CALLCONV I32 Perl_foldEQ_utf8_flags(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2, U32 flags); @@ -1356,7 +1352,6 @@ Perl_gv_add_by_type(pTHX_ GV *gv, svtype type); /* PERL_CALLCONV GV * gv_autoload4(pTHX_ HV *stash, const char *name, STRLEN len, I32 method) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_GV_AUTOLOAD4 PERL_CALLCONV GV * Perl_gv_autoload_pv(pTHX_ HV *stash, const char *namepv, U32 flags) @@ -1408,11 +1403,9 @@ Perl_gv_fetchfile_flags(pTHX_ const char * const name, const STRLEN len, const U /* PERL_CALLCONV GV * gv_fetchmeth(pTHX_ HV *stash, const char *name, STRLEN len, I32 level); */ -#define PERL_ARGS_ASSERT_GV_FETCHMETH /* PERL_CALLCONV GV * gv_fetchmeth_autoload(pTHX_ HV *stash, const char *name, STRLEN len, I32 level); */ -#define PERL_ARGS_ASSERT_GV_FETCHMETH_AUTOLOAD PERL_CALLCONV GV * Perl_gv_fetchmeth_pv(pTHX_ HV *stash, const char *name, I32 level, U32 flags); @@ -1491,7 +1484,6 @@ Perl_gv_handler(pTHX_ HV *stash, I32 id) /* PERL_CALLCONV void gv_init(pTHX_ GV *gv, HV *stash, const char *name, STRLEN len, int multi); */ -#define PERL_ARGS_ASSERT_GV_INIT PERL_CALLCONV void Perl_gv_init_pv(pTHX_ GV *gv, HV *stash, const char *name, U32 flags); @@ -1717,11 +1709,9 @@ Perl_hv_scalar(pTHX_ HV *hv) /* PERL_CALLCONV SV ** hv_stores(pTHX_ HV *hv, const char * const key, SV *val); */ -#define PERL_ARGS_ASSERT_HV_STORES /* PERL_CALLCONV void hv_undef(pTHX_ HV *hv); */ -#define PERL_ARGS_ASSERT_HV_UNDEF PERL_CALLCONV void Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags); @@ -1731,17 +1721,14 @@ Perl_hv_undef_flags(pTHX_ HV *hv, U32 flags); ibcmp(pTHX_ const char *a, const char *b, I32 len) __attribute__warn_unused_result__ __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IBCMP /* PERL_CALLCONV I32 ibcmp_locale(pTHX_ const char *a, const char *b, I32 len) __attribute__warn_unused_result__ __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IBCMP_LOCALE /* PERL_CALLCONV I32 ibcmp_utf8(pTHX_ const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2); */ -#define PERL_ARGS_ASSERT_IBCMP_UTF8 PERL_CALLCONV STRLEN Perl_infix_plugin_standard(pTHX_ char *operator_ptr, STRLEN operator_len, struct Perl_custom_infix **def); @@ -1818,22 +1805,18 @@ Perl_io_close(pTHX_ IO *io, GV *gv, bool is_explicit, bool warn_on_fail) is_ascii_string(const U8 * const s, STRLEN len) __attribute__warn_unused_result__ __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IS_ASCII_STRING /* PERL_CALLCONV bool is_c9strict_utf8_string(const U8 *s, STRLEN len) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING /* PERL_CALLCONV bool is_c9strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */ -#define PERL_ARGS_ASSERT_IS_C9STRICT_UTF8_STRING_LOC /* PERL_CALLCONV bool is_invariant_string(const U8 * const s, STRLEN len) __attribute__warn_unused_result__ __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IS_INVARIANT_STRING PERL_CALLCONV I32 Perl_is_lvalue_sub(pTHX) @@ -1843,11 +1826,9 @@ Perl_is_lvalue_sub(pTHX) /* PERL_CALLCONV bool is_strict_utf8_string(const U8 *s, STRLEN len) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING /* PERL_CALLCONV bool is_strict_utf8_string_loc(const U8 *s, STRLEN len, const U8 **ep); */ -#define PERL_ARGS_ASSERT_IS_STRICT_UTF8_STRING_LOC PERL_CALLCONV Size_t Perl_is_utf8_FF_helper_(const U8 * const s0, const U8 * const e, const bool require_partial) @@ -1865,31 +1846,25 @@ Perl_is_utf8_char_helper_(const U8 * const s, const U8 *e, const U32 flags) /* PERL_CALLCONV bool is_utf8_fixed_width_buf_flags(const U8 * const s, STRLEN len, const U32 flags); */ -#define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_FLAGS /* PERL_CALLCONV bool is_utf8_fixed_width_buf_loc_flags(const U8 * const s, STRLEN len, const U8 **ep, const U32 flags); */ -#define PERL_ARGS_ASSERT_IS_UTF8_FIXED_WIDTH_BUF_LOC_FLAGS /* PERL_CALLCONV bool is_utf8_invariant_string(const U8 * const s, STRLEN len) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_IS_UTF8_INVARIANT_STRING /* PERL_CALLCONV bool is_utf8_string(const U8 *s, STRLEN len) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_IS_UTF8_STRING /* PERL_CALLCONV bool is_utf8_string_loc_flags(const U8 *s, STRLEN len, const U8 **ep, const U32 flags); */ -#define PERL_ARGS_ASSERT_IS_UTF8_STRING_LOC_FLAGS /* PERL_CALLCONV bool is_utf8_valid_partial_char(const U8 * const s0, const U8 * const e) __attribute__warn_unused_result__ __attribute__pure__; */ -#define PERL_ARGS_ASSERT_IS_UTF8_VALID_PARTIAL_CHAR PERL_CALLCONV bool Perl_isinfnan(NV nv) @@ -2594,7 +2569,6 @@ Perl_my_fork(void); /* PERL_CALLCONV I32 my_lstat(pTHX); */ -#define PERL_ARGS_ASSERT_MY_LSTAT PERL_CALLCONV I32 Perl_my_lstat_flags(pTHX_ const U32 flags); @@ -2635,7 +2609,6 @@ Perl_my_socketpair(int family, int type, int protocol, int fd[2]); /* PERL_CALLCONV I32 my_stat(pTHX); */ -#define PERL_ARGS_ASSERT_MY_STAT PERL_CALLCONV I32 Perl_my_stat_flags(pTHX_ const U32 flags); @@ -2706,7 +2679,6 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right) /* PERL_CALLCONV CV * newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block); */ -#define PERL_ARGS_ASSERT_NEWATTRSUB PERL_CALLCONV CV * Perl_newATTRSUB_x(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block, bool o_is_gv); @@ -2721,12 +2693,10 @@ Perl_newAVREF(pTHX_ OP *o) /* PERL_CALLCONV AV * newAV_alloc_x(pTHX_ SSize_t size) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_NEWAV_ALLOC_X /* PERL_CALLCONV AV * newAV_alloc_xz(pTHX_ SSize_t size) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_NEWAV_ALLOC_XZ PERL_CALLCONV AV * Perl_newAVav(pTHX_ AV *oav) @@ -2807,7 +2777,6 @@ Perl_newGVREF(pTHX_ I32 type, OP *o) /* PERL_CALLCONV GV * newGVgen(pTHX_ const char *pack); */ -#define PERL_ARGS_ASSERT_NEWGVGEN PERL_CALLCONV GV * Perl_newGVgen_flags(pTHX_ const char *pack, U32 flags) @@ -3040,7 +3009,6 @@ Perl_newSVsv_flags(pTHX_ SV * const old, I32 flags) /* PERL_CALLCONV SV * newSVsv_nomg(pTHX_ SV * const old) __attribute__warn_unused_result__; */ -#define PERL_ARGS_ASSERT_NEWSVSV_NOMG PERL_CALLCONV SV * Perl_newSVuv(pTHX_ const UV u) @@ -3207,7 +3175,6 @@ Perl_op_linklist(pTHX_ OP *o); /* PERL_CALLCONV OP * op_lvalue(pTHX_ OP *o, I32 type); */ -#define PERL_ARGS_ASSERT_OP_LVALUE PERL_CALLCONV OP * Perl_op_lvalue_flags(pTHX_ OP *o, I32 type, U32 flags); @@ -3475,7 +3442,6 @@ Perl_perly_sighandler(int sig, Siginfo_t *info, void *uap, bool safe); /* PERL_CALLCONV const char * const phase_name(pTHX_ enum perl_phase); */ -#define PERL_ARGS_ASSERT_PHASE_NAME PERL_CALLCONV void Perl_pmop_dump(pTHX_ PMOP *pm); @@ -3793,11 +3759,9 @@ Perl_resume_compcv(pTHX_ struct suspended_compcv *buffer, bool save); /* PERL_CALLCONV void resume_compcv_and_save(pTHX_ struct suspended_compcv *buffer); */ -#define PERL_ARGS_ASSERT_RESUME_COMPCV_AND_SAVE /* PERL_CALLCONV void resume_compcv_final(pTHX_ struct suspended_compcv *buffer); */ -#define PERL_ARGS_ASSERT_RESUME_COMPCV_FINAL PERL_CALLCONV char * Perl_rninstr(const char *big, const char *bigend, const char *little, const char *lend) @@ -3892,7 +3856,6 @@ Perl_save_adelete(pTHX_ AV *av, SSize_t key); /* PERL_CALLCONV void save_aelem(pTHX_ AV *av, SSize_t idx, SV **sptr); */ -#define PERL_ARGS_ASSERT_SAVE_AELEM PERL_CALLCONV void Perl_save_aelem_flags(pTHX_ AV *av, SSize_t idx, SV **sptr, const U32 flags); @@ -3969,7 +3932,6 @@ Perl_save_hdelete(pTHX_ HV *hv, SV *keysv); /* PERL_CALLCONV void save_helem(pTHX_ HV *hv, SV *key, SV **sptr); */ -#define PERL_ARGS_ASSERT_SAVE_HELEM PERL_CALLCONV void Perl_save_helem_flags(pTHX_ HV *hv, SV *key, SV **sptr, const U32 flags); @@ -4410,7 +4372,6 @@ Perl_sv_copypv_flags(pTHX_ SV * const dsv, SV * const ssv, const I32 flags); /* PERL_CALLCONV void sv_copypv_nomg(pTHX_ SV * const dsv, SV * const ssv); */ -#define PERL_ARGS_ASSERT_SV_COPYPV_NOMG PERL_CALLCONV void Perl_sv_dec(pTHX_ SV * const sv); @@ -4610,7 +4571,6 @@ Perl_sv_nosharing(pTHX_ SV *sv); /* PERL_CALLCONV bool sv_numeq(pTHX_ SV *sv1, SV *sv2); */ -#define PERL_ARGS_ASSERT_SV_NUMEQ PERL_CALLCONV bool Perl_sv_numeq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags); @@ -4854,7 +4814,6 @@ Perl_sv_setuv_mg(pTHX_ SV * const sv, const UV u); /* PERL_CALLCONV bool sv_streq(pTHX_ SV *sv1, SV *sv2); */ -#define PERL_ARGS_ASSERT_SV_STREQ PERL_CALLCONV bool Perl_sv_streq_flags(pTHX_ SV *sv1, SV *sv2, const U32 flags); @@ -4922,7 +4881,6 @@ Perl_sv_utf8_downgrade_flags(pTHX_ SV * const sv, const bool fail_ok, const U32 /* PERL_CALLCONV bool sv_utf8_downgrade_nomg(pTHX_ SV * const sv, const bool fail_ok); */ -#define PERL_ARGS_ASSERT_SV_UTF8_DOWNGRADE_NOMG PERL_CALLCONV void Perl_sv_utf8_encode(pTHX_ SV * const sv); @@ -4931,7 +4889,6 @@ Perl_sv_utf8_encode(pTHX_ SV * const sv); /* PERL_CALLCONV STRLEN sv_utf8_upgrade_flags(pTHX_ SV * const sv, const I32 flags); */ -#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_FLAGS PERL_CALLCONV STRLEN Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV * const sv, const I32 flags, STRLEN extra); @@ -4940,7 +4897,6 @@ Perl_sv_utf8_upgrade_flags_grow(pTHX_ SV * const sv, const I32 flags, STRLEN ext /* PERL_CALLCONV STRLEN sv_utf8_upgrade_nomg(pTHX_ SV *sv); */ -#define PERL_ARGS_ASSERT_SV_UTF8_UPGRADE_NOMG PERL_CALLCONV void Perl_sv_vcatpvf(pTHX_ SV * const sv, const char * const pat, va_list * const args); @@ -5028,7 +4984,6 @@ Perl_tmps_grow_p(pTHX_ SSize_t ix); /* PERL_CALLCONV UV to_uni_fold(pTHX_ UV c, U8 *p, STRLEN *lenp); */ -#define PERL_ARGS_ASSERT_TO_UNI_FOLD PERL_CALLCONV UV Perl_to_uni_lower(pTHX_ UV c, U8 *p, STRLEN *lenp); @@ -5125,15 +5080,12 @@ Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg) /* PERL_CALLCONV U8 * uvchr_to_utf8(pTHX_ U8 *d, UV uv); */ -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8 /* PERL_CALLCONV U8 * uvchr_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags); */ -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS /* PERL_CALLCONV U8 * uvchr_to_utf8_flags_msgs(pTHX_ U8 *d, UV uv, UV flags, HV **msgs); */ -#define PERL_ARGS_ASSERT_UVCHR_TO_UTF8_FLAGS_MSGS PERL_CALLCONV U8 * Perl_uvoffuni_to_utf8_flags(pTHX_ U8 *d, UV uv, UV flags); @@ -5269,7 +5221,6 @@ Perl_watch(pTHX_ char **addr) /* PERL_CALLCONV I32 whichsig(pTHX_ const char *sig); */ -#define PERL_ARGS_ASSERT_WHICHSIG PERL_CALLCONV I32 Perl_whichsig_pv(pTHX_ const char *sig); @@ -6040,6 +5991,15 @@ Perl_sv_setsv_cow(pTHX_ SV *dsv, SV *ssv); #endif /* defined(PERL_ANY_COW) */ #if defined(PERL_CORE) +/* PERL_CALLCONV void +deprecate(pTHX_ U32 category, const char * const construct); */ + +/* PERL_CALLCONV void +deprecate_disappears_in(pTHX_ U32 category, const char * const when, const char * const construct); */ + +/* PERL_CALLCONV void +deprecate_fatal_in(pTHX_ U32 category, const char * const when, const char * const construct); */ + PERL_CALLCONV void Perl_opslab_force_free(pTHX_ OPSLAB *slab) __attribute__visibility__("hidden"); @@ -6406,7 +6366,6 @@ Perl__add_range_to_invlist(pTHX_ SV *invlist, UV start, UV end) /* PERL_CALLCONV void _invlist_intersection(pTHX_ SV * const a, SV * const b, SV **i); */ -# define PERL_ARGS_ASSERT__INVLIST_INTERSECTION PERL_CALLCONV void Perl__invlist_intersection_maybe_complement_2nd(pTHX_ SV * const a, SV * const b, const bool complement_b, SV **i); @@ -6420,11 +6379,9 @@ Perl__invlist_invert(pTHX_ SV * const invlist); /* PERL_CALLCONV void _invlist_subtract(pTHX_ SV * const a, SV * const b, SV **result); */ -# define PERL_ARGS_ASSERT__INVLIST_SUBTRACT /* PERL_CALLCONV void _invlist_union(pTHX_ SV * const a, SV * const b, SV **output); */ -# define PERL_ARGS_ASSERT__INVLIST_UNION PERL_CALLCONV void Perl__invlist_union_maybe_complement_2nd(pTHX_ SV * const a, SV * const b, const bool complement_b, SV **output); @@ -10149,7 +10106,6 @@ Perl_dump_c_backtrace(pTHX_ PerlIO *fp, int max_depth, int skip); /* PERL_CALLCONV void free_c_backtrace(pTHX_ Perl_c_backtrace *bt); */ -# define PERL_ARGS_ASSERT_FREE_C_BACKTRACE PERL_CALLCONV Perl_c_backtrace * Perl_get_c_backtrace(pTHX_ int max_depth, int skip) @@ -10331,7 +10287,6 @@ Perl_sv_dup_inc(pTHX_ const SV * const ssv, CLONE_PARAMS * const param) #else /* if !defined(USE_ITHREADS) */ /* PERL_CALLCONV void CopFILEGV_set(pTHX_ COP *c, GV *gv); */ -# define PERL_ARGS_ASSERT_COPFILEGV_SET #endif /* !defined(USE_ITHREADS) */ #if defined(USE_LOCALE_COLLATE) diff --git a/regen/embed.pl b/regen/embed.pl index 1c2fe4a5f9fc..f960c60f08bb 100755 --- a/regen/embed.pl +++ b/regen/embed.pl @@ -105,7 +105,7 @@ sub generate_proto_h { die_at_end "flag $1 is not legal (for function $plain_func)"; } my @nonnull; - my $args_assert_line = ( $flags !~ /G/ ); + my $args_assert_line = ( $flags !~ /[Gm]/ ); my $has_depth = ( $flags =~ /W/ ); my $has_context = ( $flags !~ /T/ ); my $never_returns = ( $flags =~ /r/ ); From 5b8881c1a8fe2c738d02d95debf3c7f355ed8521 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Sat, 11 Mar 2023 10:48:25 +0100 Subject: [PATCH 12/18] handy.h - fixup for deprecated warnings and docs --- handy.h | 58 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/handy.h b/handy.h index 7807c9ecba42..f12263ffd47e 100644 --- a/handy.h +++ b/handy.h @@ -2961,31 +2961,47 @@ last-inclusive range. CPAN::Unpack show any users outside the core. =for apidoc_section $warning -=for apidoc m||deprecate|U32 category|"construct" -Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the given -category with an appropriate message. The C argument must be a C string. - -=for apidoc m||deprecate_disappears_in|U32 category|"when"|"construct" -Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the given -category with an appropriate message that the construct will disappear in a specific -release. The C and C arguments must be a C string. - -=for apidoc m||deprecate_fatal_in|U32 category|"when"|"construct" -Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the given -category with an appropriate message that the construct will become fatal in a specific -release. The C and C arguments must be a C string. +=for apidoc Cdm||deprecate|U32 category|"message" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the +given category with an appropriate message. The C argument must +be a C string. The string " is deprecated" will automatically be added +to the end of the C. + +=for apidoc Cdm||deprecate_disappears_in|U32 category|"when"|"message" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the +given category with an appropriate message that the construct referred +to by the message will disappear in a specific release. The C and +C arguments must be a C string. The C string is expected +to be of the form "5.40", with no minor element in the version. The actual +message output will be the result of the following expression C which is why C +and C must be literal C strings. + +=for apidoc Cdm||deprecate_fatal_in|U32 category|"when"|"message" +Wrapper around Perl_ck_warner_d() to produce a deprecated warning in the +given category with an appropriate message that the construct referred +to by the message will become fatal in a specific release. The C +and C arguments must be a C string. The C string is expected +to be of the form "5.40", with no minor element in the version. The actual +message output will be the result of the following expression C which is why C +and C must be literal C strings. +=cut */ #ifdef PERL_CORE -# define deprecate(category,construct) Perl_ck_warner_d(aTHX_ packWARN(category), \ - "Use of " construct " is deprecated") -# define deprecate_disappears_in(category,when,construct) \ - Perl_ck_warner_d(aTHX_ packWARN(category), \ - construct " is deprecated, and will disappear in Perl " when) -# define deprecate_fatal_in(category,when,construct) \ - Perl_ck_warner_d(aTHX_ packWARN(category), \ - construct " is deprecated, and will become fatal in Perl " when) +# define deprecate(category,message) \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ + message " is deprecated") + +# define deprecate_disappears_in(category,when,message) \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ + message " is deprecated, and will disappear in Perl " when) + +# define deprecate_fatal_in(category,when,message) \ + Perl_ck_warner_d(aTHX_ packWARN(category), \ + message " is deprecated, and will become fatal in Perl " when) #endif /* Internal macros to deal with gids and uids */ From 48d14d9aae7d57e2e0af12f39eba0dcfb8518c42 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 10:18:03 +0100 Subject: [PATCH 13/18] diag.t - detect use of "deprecate_xxx()" style functions --- pp_ctl.c | 2 +- t/porting/diag.t | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/pp_ctl.c b/pp_ctl.c index af13e25d3dee..f0befac33afa 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -3335,7 +3335,7 @@ PP(pp_goto) ? 2 : 1; if (enterops[i]) - deprecate(WARN_DEPRECATED__GOTO_CONSTRUCT, "\"goto\" to jump into a construct"); + deprecate(WARN_DEPRECATED__GOTO_CONSTRUCT, "Use of \"goto\" to jump into a construct"); } /* pop unwanted frames */ diff --git a/t/porting/diag.t b/t/porting/diag.t index 7d2e45fa46ce..80d457c2d1da 100644 --- a/t/porting/diag.t +++ b/t/porting/diag.t @@ -37,7 +37,7 @@ my @functions; foreach (@{(setup_embed())[0]}) { my $embed= $_->{embed} or next; - next unless $embed->{name} =~ /warn|(?{name} =~ /warn|(?{name} =~ /croak_kw_unless_class/; # The flag p means that this function may have a 'Perl_' prefix @@ -47,6 +47,7 @@ foreach (@{(setup_embed())[0]}) { push @functions, 'S_' . $embed->{name} if $embed->{flags} =~ /S/; }; push @functions, 'Perl_mess'; +@functions = sort { length($b) <=> length($a) || $a cmp $b } @functions; push @functions, 'PERL_DIAG_(?\w+)'; my $regcomp_fail_re = '\b(?:(?:Simple_)?v)?FAIL[2-4]?(?:utf8f)?\b'; @@ -59,6 +60,7 @@ my $text_re = '"(?(?:\\\\"|[^"]|"\s*[A-Z_]+\s*")*)"'; my $source_msg_call_re = qr/$source_msg_re(?:_nocontext)? \s* \( (?: \s* Perl_form \( )? (?:aTHX_)? \s* (?:packWARN\d*\((?.*?)\),)? \s* + (?:(?WARN_DEPRECATED__\w+)\s*,(?:\s*"5\.\d+"\s*,)?)? \s* $text_re /x; my $bad_version_re = qr{BADVERSION\([^"]*$text_re}; $regcomp_fail_re = qr/$regcomp_fail_re\([^"]*$text_re/; @@ -367,6 +369,9 @@ sub check_file { $routine = "Perl_warner" if $wrapper=~/WARN/; $routine = "yyerror" if $wrapper=~/DIE/; } + if ($routine=~/^deprecate/) { + $name .= " is deprecated"; + } # diag(Dumper(\%+,{category=>$category, routine=>$routine, name=>$name})); # Sometimes the regexp will pick up too much for the category # e.g., WARN_UNINITIALIZED), PL_warn_uninit_sv ... up to the next ) @@ -414,6 +419,7 @@ sub check_file { : $routine =~ /ckWARN\d*reg_d/? 'S' : $routine =~ /ckWARN\d*reg/ ? 'W' : $routine =~ /vWARN\d/ ? '[WDS]' + : $routine =~ /^deprecate/ ? '[WDS]' : '[PFX]'; my $categories; if (defined $category) { @@ -508,14 +514,20 @@ sub check_message { state %qrs; my $qr = $qrs{$severity} ||= qr/$severity/; + my $pod_line = $entries{$key}{line_number} // ""; + + if ($pod_line) { + $pod_line = ", at perldiag.pod line $pod_line"; + } + like($entries{$key}{severity}, $qr, ($severity =~ /\[/ ? "severity is one of $severity" - : "severity is $severity") . "for '$name' at $codefn line $."); + : "severity is $severity") . "for '$name' at $codefn line $.$pod_line"); is($entries{$key}{category}, $categories, ($categories ? "categories are [$categories]" : "no category") - . " for '$name' at $codefn line $."); + . " for '$name' at $codefn line $.$pod_line"); } } elsif ($partial) { # noop From ae67d7568a2ada25e0d1cdc5165ae3944278a476 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Sat, 11 Mar 2023 11:00:17 +0100 Subject: [PATCH 14/18] diag.t - parse and validate "when" parameter from deprecated_xxx() macros the "when" parameter is expected to be a version string of the form "5.\d+", with no minor version. --- t/porting/diag.t | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/t/porting/diag.t b/t/porting/diag.t index 80d457c2d1da..874844a0f337 100644 --- a/t/porting/diag.t +++ b/t/porting/diag.t @@ -60,7 +60,7 @@ my $text_re = '"(?(?:\\\\"|[^"]|"\s*[A-Z_]+\s*")*)"'; my $source_msg_call_re = qr/$source_msg_re(?:_nocontext)? \s* \( (?: \s* Perl_form \( )? (?:aTHX_)? \s* (?:packWARN\d*\((?.*?)\),)? \s* - (?:(?WARN_DEPRECATED__\w+)\s*,(?:\s*"5\.\d+"\s*,)?)? \s* + (?:(?WARN_DEPRECATED__\w+)\s*,(?:\s*(?"[^"]+")\s*,)?)? \s* $text_re /x; my $bad_version_re = qr{BADVERSION\([^"]*$text_re}; $regcomp_fail_re = qr/$regcomp_fail_re\([^"]*$text_re/; @@ -298,6 +298,7 @@ sub check_file { my $sub = 'top of file'; while (<$codefh>) { chomp; + my $first_line = $.; # Getting too much here isn't a problem; we only use this to skip # errors inside of XS modules, which should get documented in the # docs for the module. @@ -363,7 +364,9 @@ sub check_file { # DIE is just return Perl_die my ($name, $category, $routine, $wrapper); if (/\b$source_msg_call_re/) { - ($name, $category, $routine, $wrapper) = ($+{'text'}, $+{'category'}, $+{'routine'}, $+{'wrapper'}); + my $version_string; + ($name, $category, $routine, $wrapper, $version_string) = + ($+{'text'}, $+{'category'}, $+{'routine'}, $+{'wrapper'}, $+{'version_string'}); if ($wrapper) { $category = $wrapper if $wrapper=~/WARN/; $routine = "Perl_warner" if $wrapper=~/WARN/; @@ -371,6 +374,10 @@ sub check_file { } if ($routine=~/^deprecate/) { $name .= " is deprecated"; + if ($version_string) { + like($version_string, qr/"5\.\d+"/, + "version string is of the correct form at $codefn line $first_line"); + } } # diag(Dumper(\%+,{category=>$category, routine=>$routine, name=>$name})); # Sometimes the regexp will pick up too much for the category From d2486d72e5fbb519d6a17ed678a22adc70c64c01 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 21:18:14 +0100 Subject: [PATCH 15/18] perldeprecation.pod - add smartmatch deprecation This was missed when smartmatch was deprecated. --- pod/perldeprecation.pod | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pod/perldeprecation.pod b/pod/perldeprecation.pod index b64ade3b5c10..762b9f9a911c 100644 --- a/pod/perldeprecation.pod +++ b/pod/perldeprecation.pod @@ -14,6 +14,15 @@ features are available. The deprecated features will be grouped by the version of Perl in which they will be removed. +=head2 Perl 5.42 + +=head3 Smartmatch + +Smartmatch is now seen as a failed experiment and was marked as deprecated +in Perl 5.37.10. This includes the C and C keywords, as well +as the smartmatch operator C<~~>. The feature will be removed entirely in the +Perl 5.42.0 production release. + =head2 Perl 5.40 =head3 Downgrading a C to below v5.11 From ac76abe9818df81d17e3f18ef59cf5243545bf83 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 21:18:44 +0100 Subject: [PATCH 16/18] perldeprecation.pod - apostrophe as package separator goes away in 5.42 It was incorrectly documented as going away in 5.40 --- pod/perldeprecation.pod | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pod/perldeprecation.pod b/pod/perldeprecation.pod index 762b9f9a911c..aef594299388 100644 --- a/pod/perldeprecation.pod +++ b/pod/perldeprecation.pod @@ -23,6 +23,14 @@ in Perl 5.37.10. This includes the C and C keywords, as well as the smartmatch operator C<~~>. The feature will be removed entirely in the Perl 5.42.0 production release. +=head3 Use of C<'> as a global name separator. + +Perl allows use of C<'> instead of C<::> to replace the parts of a +package or global variable name, for example C and C are +equivalent. + +C<'> will no longer be recognized as a name separator in Perl 5.42. + =head2 Perl 5.40 =head3 Downgrading a C to below v5.11 @@ -46,14 +54,6 @@ disabled I C. This was not the previous behaviour of C, which at present will track explicitly-enabled strictness flags independently. -=head3 Use of C<'> as a global name separator. - -Perl allows use of C<'> instead of C<::> to replace the parts of a -package or global variable name, for example C and C are -equivalent. - -C<'> will no longer be recognized as a name separator in Perl 5.40. - =head2 Perl 5.38 =head3 Pod::Html utility functions From 229ef0acb594efc5237fa78ea5b36be31075ad01 Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 22:22:52 +0100 Subject: [PATCH 17/18] perldeprecation.pod - add unscheduled deprecations and add category info Multiple deprecation types that are not scheduled for removal in a specific version were not listed. Also now that we have deprecation subcategories we should specify them in the docs. --- pod/perldeprecation.pod | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/pod/perldeprecation.pod b/pod/perldeprecation.pod index aef594299388..9db966c511fa 100644 --- a/pod/perldeprecation.pod +++ b/pod/perldeprecation.pod @@ -14,6 +14,52 @@ features are available. The deprecated features will be grouped by the version of Perl in which they will be removed. +=head2 Unscheduled Deprecations + +=head3 Unicode Delimiter Will be Paired + +Some unicode delimiters used to be allowed as single characters but +in the future will be part of a ballanced pair. This deprecation category +is used to mark the ones that will change from being unpaired, to paired. + +Category: "deprecated::delimiter_will_be_paired" + +=head3 Dot In Inc + +The current working direct C<"."> used to be automatically included in +C<@INC>, but in Perl 5.26 this was removed for security reasons. Ever +since then we have produced a warning when a user uses C and +C does not include a path, and the file was not found in any +directory in @INC but I located C<".">. The file will not be loaded +but a deprecated warning will be generated. + +Category: "deprecated::dot_in_inc" + +=head3 Goto Block Construct + +C will produce a deprecated warning when jumping into the body +of a loop or other block construct from outside. For instance + + while (should_loop($x)) { + LABEL: + do_stuff(); + } + goto LABEL; + +will produce a warning that this behavior is deprecated. In general you should +just avoid doing this, the people that maintain your code will be grateful for +your restraint. + +Category: "deprecated::goto_construct" + +=head3 Unicode Property Name + +Various types of unicode property name will generate deprecated warnings +when used in a regex pattern. For instance surrogate characters will result +in deprecation warnings. + +Category: "deprecated::unicode_property_name" + =head2 Perl 5.42 =head3 Smartmatch @@ -23,6 +69,8 @@ in Perl 5.37.10. This includes the C and C keywords, as well as the smartmatch operator C<~~>. The feature will be removed entirely in the Perl 5.42.0 production release. +Category: "deprecated::smartmatch" + =head3 Use of C<'> as a global name separator. Perl allows use of C<'> instead of C<::> to replace the parts of a @@ -31,6 +79,8 @@ equivalent. C<'> will no longer be recognized as a name separator in Perl 5.42. +Category: "deprecated::apostrophe_as_package_separator" + =head2 Perl 5.40 =head3 Downgrading a C to below v5.11 @@ -54,6 +104,8 @@ disabled I C. This was not the previous behaviour of C, which at present will track explicitly-enabled strictness flags independently. +Category: "deprecated::version_downgrade" + =head2 Perl 5.38 =head3 Pod::Html utility functions From 0b2570f1238805d9b892c9cf4c704071e7ad7d6a Mon Sep 17 00:00:00 2001 From: Yves Orton Date: Wed, 8 Mar 2023 22:22:17 +0100 Subject: [PATCH 18/18] t/porting/deprecation.t - add tests for deprecation documentation and categories --- MANIFEST | 1 + regen/warnings.pl | 226 ++++++++++++++++++++-------------------- t/porting/deprecation.t | 145 ++++++++++++++++++++++++++ 3 files changed, 260 insertions(+), 112 deletions(-) create mode 100644 t/porting/deprecation.t diff --git a/MANIFEST b/MANIFEST index 9abd5c098608..7be8cbc3fc3c 100644 --- a/MANIFEST +++ b/MANIFEST @@ -6212,6 +6212,7 @@ t/porting/copyright.t Check that copyright years match t/porting/corelist.t Check that Module-CoreList has perl versions for the current perl t/porting/customized.dat Data file for porting/customized.t t/porting/customized.t Check all CUSTOMIZED files are as they should be +t/porting/deprecation.t Test that deprecation warnings are handled right t/porting/diag.t Test completeness of perldiag.pod t/porting/dual-life.t Check that dual-life bins are in utils/ t/porting/exec-bit.t Check that exec-bit bins are identified diff --git a/regen/warnings.pl b/regen/warnings.pl index 1d1aa1de664b..4b598bbc31d9 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -5,13 +5,13 @@ # lib/warnings.pm # warnings.h # -# from information hardcoded into this script (the $TREE hash), plus the +# from information hardcoded into this script (the $WARNING_TREE hash), plus the # template for warnings.pm in the DATA section. # # When changing the number of warnings, t/op/caller.t should change to # correspond with the value of $BYTES in lib/warnings.pm # -# With an argument of 'tree', just dump the contents of $TREE and exits. +# With an argument of 'tree', just dump the contents of $WARNING_TREE and exits. # Also accepts the standard regen_lib -q and -v args. # # This script is normally invoked from regen.pl. @@ -44,7 +44,7 @@ BEGIN # created. But the warnings category 'io' WILL include all the mask bits # necessary to turn on 'pipe', 'unopened' etc. -my $TREE = { +our $WARNING_TREE = { 'all' => [ 5.008, { 'io' => [ 5.008, { 'pipe' => [ 5.008, DEFAULT_OFF], @@ -334,7 +334,7 @@ sub warningsTree if !ref $v || ref $v ne 'ARRAY' ; my $offset ; - if ($tree ne $TREE) { + if ($tree ne $WARNING_TREE) { $rv .= $prefix . "|\n" ; $rv .= $prefix . "+- $k" ; $offset = ' ' x ($max + 4) ; @@ -404,149 +404,151 @@ sub mkOct ########################################################################### +sub main { -if (@ARGV && $ARGV[0] eq "tree") -{ - print warningsTree($TREE, " ") ; - exit ; -} - -my ($warn_h, $warn_pm) = map { - open_new($_, '>', { by => 'regen/warnings.pl' }); -} 'warnings.h', 'lib/warnings.pm'; + if (@ARGV && $ARGV[0] eq "tree") + { + print warningsTree($WARNING_TREE, " ") ; + exit ; + } -my ($index, $warn_size); + my ($warn_h, $warn_pm) = map { + open_new($_, '>', { by => 'regen/warnings.pl' }); + } 'warnings.h', 'lib/warnings.pm'; -# generate warnings.h + my ($index, $warn_size); -print $warn_h warnings_h_boilerplate_1(); + # generate warnings.h -$index = orderValues($TREE); + print $warn_h warnings_h_boilerplate_1(); -die < 255 ; -Too many warnings categories -- max is 255 -rewrite packWARN* & unpackWARN* macros -EOM + $index = orderValues($WARNING_TREE); -walk ($TREE) ; -for (my $i = $index; $i & 3; $i++) { - push @{$CATEGORIES{all}}, $i; -} + die <<~EOM if $index > 255 ; + Too many warnings categories -- max is 255 + rewrite packWARN* & unpackWARN* macros + EOM -$index *= 2 ; -$warn_size = int($index / 8) + ($index % 8 != 0) ; - -my $k ; -my $last_ver = 0; -my @names; -foreach $k (sort { $a <=> $b } keys %VALUE_TO_NAME) { - my ($name, $version) = @{ $VALUE_TO_NAME{$k} }; - print $warn_h "\n/* Warnings Categories added in Perl $version */\n\n" - if $last_ver != $version ; - $name =~ y/:/_/; - $name = "WARN_$name"; - print $warn_h tab(6, "#define $name"), " $k\n" ; - push @names, $name; - $last_ver = $version ; -} + walk ($WARNING_TREE) ; + for (my $i = $index; $i & 3; $i++) { + push @{$CATEGORIES{all}}, $i; + } -print $warn_h tab(6, '#define WARNsize'), " $warn_size\n" ; -print $warn_h tab(6, '#define WARN_ALLstring'), ' "', ('\125' x $warn_size) , "\"\n" ; -print $warn_h tab(6, '#define WARN_NONEstring'), ' "', ('\0' x $warn_size) , "\"\n" ; + $index *= 2 ; + $warn_size = int($index / 8) + ($index % 8 != 0) ; + + my $k ; + my $last_ver = 0; + my @names; + foreach $k (sort { $a <=> $b } keys %VALUE_TO_NAME) { + my ($name, $version) = @{ $VALUE_TO_NAME{$k} }; + print $warn_h "\n/* Warnings Categories added in Perl $version */\n\n" + if $last_ver != $version ; + $name =~ y/:/_/; + $name = "WARN_$name"; + print $warn_h tab(6, "#define $name"), " $k\n" ; + push @names, $name; + $last_ver = $version ; + } -print $warn_h warnings_h_boilerplate_2(); + print $warn_h tab(6, '#define WARNsize'), " $warn_size\n" ; + print $warn_h tab(6, '#define WARN_ALLstring'), ' "', ('\125' x $warn_size) , "\"\n" ; + print $warn_h tab(6, '#define WARN_NONEstring'), ' "', ('\0' x $warn_size) , "\"\n" ; -print $warn_h "\n\n/*\n" ; -print $warn_h map { "=for apidoc Amnh||$_\n" } @names; -print $warn_h "\n=cut\n*/\n\n" ; -print $warn_h "/* end of file warnings.h */\n"; + print $warn_h warnings_h_boilerplate_2(); -read_only_bottom_close_and_rename($warn_h); + print $warn_h "\n\n/*\n" ; + print $warn_h map { "=for apidoc Amnh||$_\n" } @names; + print $warn_h "\n=cut\n*/\n\n" ; + print $warn_h "/* end of file warnings.h */\n"; + read_only_bottom_close_and_rename($warn_h); -# generate warnings.pm -while () { - last if /^VERSION$/ ; - print $warn_pm $_ ; -} + # generate warnings.pm -print $warn_pm qq(our \$VERSION = "$::VERSION";\n); + while () { + last if /^VERSION$/ ; + print $warn_pm $_ ; + } -while () { - last if /^KEYWORDS$/ ; - print $warn_pm $_ ; -} + print $warn_pm qq(our \$VERSION = "$::VERSION";\n); -$last_ver = 0; -print $warn_pm "our %Offsets = (" ; -foreach my $k (sort { $a <=> $b } keys %VALUE_TO_NAME) { - my ($name, $version) = @{ $VALUE_TO_NAME{$k} }; - $name = lc $name; - $k *= 2 ; - if ( $last_ver != $version ) { - print $warn_pm "\n"; - print $warn_pm tab(6, " # Warnings Categories added in Perl $version"); - print $warn_pm "\n"; + while () { + last if /^KEYWORDS$/ ; + print $warn_pm $_ ; } - print $warn_pm tab(6, " '$name'"), "=> $k,\n" ; - $last_ver = $version; -} -print $warn_pm ");\n\n" ; + $last_ver = 0; + print $warn_pm "our %Offsets = (" ; + foreach my $k (sort { $a <=> $b } keys %VALUE_TO_NAME) { + my ($name, $version) = @{ $VALUE_TO_NAME{$k} }; + $name = lc $name; + $k *= 2 ; + if ( $last_ver != $version ) { + print $warn_pm "\n"; + print $warn_pm tab(6, " # Warnings Categories added in Perl $version"); + print $warn_pm "\n"; + } + print $warn_pm tab(6, " '$name'"), "=> $k,\n" ; + $last_ver = $version; + } -print $warn_pm "our %Bits = (\n" ; -foreach my $k (sort keys %CATEGORIES) { + print $warn_pm ");\n\n" ; - my $v = $CATEGORIES{$k} ; - my @list = sort { $a <=> $b } @$v ; + print $warn_pm "our %Bits = (\n" ; + foreach my $k (sort keys %CATEGORIES) { - print $warn_pm tab(6, " '$k'"), '=> "', - mkHex($warn_size, map $_ * 2 , @list), - '", # [', mkRange(@list), "]\n" ; -} + my $v = $CATEGORIES{$k} ; + my @list = sort { $a <=> $b } @$v ; -print $warn_pm ");\n\n" ; + print $warn_pm tab(6, " '$k'"), '=> "', + mkHex($warn_size, map $_ * 2 , @list), + '", # [', mkRange(@list), "]\n" ; + } -print $warn_pm "our %DeadBits = (\n" ; -foreach my $k (sort keys %CATEGORIES) { + print $warn_pm ");\n\n" ; - my $v = $CATEGORIES{$k} ; - my @list = sort { $a <=> $b } @$v ; + print $warn_pm "our %DeadBits = (\n" ; + foreach my $k (sort keys %CATEGORIES) { - print $warn_pm tab(6, " '$k'"), '=> "', - mkHex($warn_size, map $_ * 2 + 1 , @list), - '", # [', mkRange(@list), "]\n" ; -} + my $v = $CATEGORIES{$k} ; + my @list = sort { $a <=> $b } @$v ; -print $warn_pm ");\n\n" ; + print $warn_pm tab(6, " '$k'"), '=> "', + mkHex($warn_size, map $_ * 2 + 1 , @list), + '", # [', mkRange(@list), "]\n" ; + } -print $warn_pm "our %NoOp = (\n" ; -foreach my $k ( grep /\A[a-z:_]+\z/, sort keys %NO_BIT_FOR ) { - print $warn_pm tab(6, " '$k'"), "=> 1,\n"; -} + print $warn_pm ");\n\n" ; -print $warn_pm ");\n\n" ; -print $warn_pm "# These are used by various things, including our own tests\n"; -print $warn_pm tab(6, 'our $NONE'), '= "', ('\0' x $warn_size) , "\";\n" ; -print $warn_pm tab(6, 'our $DEFAULT'), '= "', - mkHex($warn_size, map $_ * 2, @DEFAULTS), - '"; # [', mkRange(sort { $a <=> $b } @DEFAULTS), "]\n" ; -print $warn_pm tab(6, 'our $LAST_BIT'), '= ' . "$index ;\n" ; -print $warn_pm tab(6, 'our $BYTES'), '= ' . "$warn_size ;\n" ; -while () { - if ($_ eq "=for warnings.pl tree-goes-here\n") { - print $warn_pm warningsTree($TREE, " "); - next; + print $warn_pm "our %NoOp = (\n" ; + foreach my $k ( grep /\A[a-z:_]+\z/, sort keys %NO_BIT_FOR ) { + print $warn_pm tab(6, " '$k'"), "=> 1,\n"; } - print $warn_pm $_ ; -} -read_only_bottom_close_and_rename($warn_pm); + print $warn_pm ");\n\n" ; + print $warn_pm "# These are used by various things, including our own tests\n"; + print $warn_pm tab(6, 'our $NONE'), '= "', ('\0' x $warn_size) , "\";\n" ; + print $warn_pm tab(6, 'our $DEFAULT'), '= "', + mkHex($warn_size, map $_ * 2, @DEFAULTS), + '"; # [', mkRange(sort { $a <=> $b } @DEFAULTS), "]\n" ; + print $warn_pm tab(6, 'our $LAST_BIT'), '= ' . "$index ;\n" ; + print $warn_pm tab(6, 'our $BYTES'), '= ' . "$warn_size ;\n" ; + while () { + if ($_ eq "=for warnings.pl tree-goes-here\n") { + print $warn_pm warningsTree($WARNING_TREE, " "); + next; + } + print $warn_pm $_ ; + } -exit(0); + read_only_bottom_close_and_rename($warn_pm); + exit(0); +} +main() unless caller(); # ----------------------------------------------------------------- sub warnings_h_boilerplate_1 { return <<'EOM'; } diff --git a/t/porting/deprecation.t b/t/porting/deprecation.t new file mode 100644 index 000000000000..109818fe6f51 --- /dev/null +++ b/t/porting/deprecation.t @@ -0,0 +1,145 @@ +#!/usr/bin/perl + +BEGIN { + if (-f './TestInit.pm') { + @INC = '.'; + } elsif (-f '../TestInit.pm') { + @INC = '..'; + } +} +use TestInit qw(T); # T is chdir to the top level + +use warnings; +use strict; +use Config; +use Data::Dumper; +require './t/test.pl'; + +plan("no_plan"); + +# Test that all deprecations in regen/warnings.pl are mentioned in +# pod/perldeprecation.pod and that there is sufficient time between them. + +my $pod_file = "./pod/perldeprecation.pod"; +my $warnings_file = "./regen/warnings.pl"; + +do $warnings_file; +our $WARNING_TREE; + +my $deprecated = $WARNING_TREE->{all}[1]{deprecated}[2]; + +open my $fh, "<", $pod_file + or die "failed to open '$pod_file': $!"; +my $removed_in_version; +my $subject; +my %category_seen; +my %subject_has_category; +my $in_legacy; + +while (<$fh>) { + if (/^=head2 (?|Perl (5\.\d+)(?:\.\d+)?|(Unscheduled))/) { # ignore minor version + $removed_in_version = lc $1; + if ($removed_in_version eq "5.38") { + $in_legacy = 1; + } + } + elsif (/^=head3 (.*)/) { + my $new_subject = $1; + if (!$in_legacy and $subject) { + ok($subject_has_category{$subject}, + "Subject '$subject' has a category specified"); + } + $subject = $new_subject; + } + elsif (/^Category: "([::\w]+)"/) { + my $category = $1; + $category_seen{$category} = $removed_in_version; + $subject_has_category{$subject} = $category; + next if $removed_in_version eq "unscheduled"; + my $tuple = $deprecated->{$category}; + ok( $tuple, "Deprecated category '$category' ($subject) exists in $warnings_file") + or next; + my $added_in_version = $tuple->[0]; + $added_in_version =~ s/(5\.\d{3})\d+/$1/; + + my $diff = $removed_in_version - $added_in_version; + cmp_ok($diff, ">=", 0.004, # two production cycles + "Version change for '$category' ($subject) is sufficiently after deprecation date") + } +} +# make sure that all the deprecated categories have an entry of some sort +foreach my $category (sort keys %$deprecated) { + ok($category_seen{$category},"Deprecated category '$category' is documented in $pod_file"); +} +# make sure that there arent any new uses of WARN_DEPRECATED, +# note that \< and \> are ERE expressions roughly equivalent to perl regex \b +if (-e ".git") { + chomp(my @warn_deprecated = `git grep "\"`); + my %files; + foreach my $line (@warn_deprecated) { + my ($file, $text) = split /:/, $line, 2; + if ($file =~ m!^dist/Devel-PPPort! || + $file eq "t/porting/diag.t" || + ($file eq "warnings.h" && $text=~/^[=#]/) + ) { + next; + } + $files{$file}++; + } + is(0+keys %files, 0, + "There should not be any new files which mention WARN_DEPRECATED"); +} + +# Test that deprecation warnings are produced under "use warnings" +# (set above) +{ + my $warning = "nada"; + local $SIG{__WARN__} = sub { $warning = $_[0] }; + my $count = 0; + while ($count<1) { + LABEL: $count++; + goto DONE if $count>1; + } + goto LABEL; + DONE: + like($warning, + qr/Use of "goto" to jump into a construct is deprecated/, + "Got expected deprecation warning"); +} +# Test that we can silence deprecation warnings with "no warnings 'deprecated'" +# as we used to. +{ + no warnings 'deprecated'; + my $warning = "nada"; + local $SIG{__WARN__} = sub { $warning = $_[0] }; + my $count = 0; + while ($count<1) { + LABEL: $count++; + goto DONE if $count>1; + } + goto LABEL; + DONE: + like($warning, qr/nada/, + "no warnings 'deprecated'; silenced deprecation warning as expected"); +} + +# Test that we can silence a specific deprecation warnings with "no warnings 'deprecated::$subcategory'" +# and that by doing so we don't silence any other deprecation warnings. +{ + no warnings 'deprecated::goto_construct'; + my $warning = "nada"; + local $SIG{__WARN__} = sub { $warning = $_[0] }; + my $count = 0; + while ($count<1) { + LABEL: $count++; + goto DONE if $count>1; + } + goto LABEL; + DONE: + like($warning, qr/nada/, + "no warnings 'deprecated::goto_construct'; silenced deprecation warning as expected"); + @INC = (); + do "regen.pl"; # this should produce a deprecation warning + like($warning, qr/is no longer in \@INC/, + "no warnings 'deprecated::goto_construct'; did not silence deprecated::dot_in_inc warnings"); +}