From 1f25714ad0c0126e303a12bd7ba010ac61b5e716 Mon Sep 17 00:00:00 2001 From: Father Chrysostomos Date: Mon, 16 Sep 2013 09:57:13 -0700 Subject: [PATCH] Make postderef experimental --- lib/warnings.pm | 25 ++++++++++++++----------- pod/perldiag.pod | 15 +++++++++++++++ pod/perllexwarn.pod | 2 ++ regen/warnings.pl | 2 ++ t/lib/warnings/toke | 13 +++++++++++++ t/op/postfixderef.t | 1 + toke.c | 4 ++++ warnings.h | 3 ++- 8 files changed, 53 insertions(+), 12 deletions(-) diff --git a/lib/warnings.pm b/lib/warnings.pm index 3a08b67..6611619 100644 --- a/lib/warnings.pm +++ b/lib/warnings.pm @@ -236,11 +236,12 @@ our %Offsets = ( # Warnings Categories added in Perl 5.019 - 'syscalls' => 112, + 'experimental::postderef'=> 112, + 'syscalls' => 114, ); our %Bits = ( - 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x01", # [0..56] + 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x05", # [0..57] 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [29] 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [30] 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] @@ -250,9 +251,10 @@ our %Bits = ( 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\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", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x55\x00", # [51..55] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x55\x01", # [51..56] 'experimental::lexical_subs'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [52] 'experimental::lexical_topic'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [53] + 'experimental::postderef'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [56] 'experimental::regex_sets'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [54] 'experimental::smartmatch'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [55] 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] @@ -260,7 +262,7 @@ our %Bits = ( 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x40\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", # [24] - 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [5..11,56] + 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [5..11,57] 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\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", # [12] @@ -288,7 +290,7 @@ our %Bits = ( 'substr' => "\x00\x00\x00\x00\x00\x00\x40\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", # [50] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [56] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [57] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [41] @@ -300,7 +302,7 @@ our %Bits = ( ); our %DeadBits = ( - 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x02", # [0..56] + 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x0a", # [0..57] 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [29] 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [30] 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] @@ -310,9 +312,10 @@ our %DeadBits = ( 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\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", # [3] - 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaa\x00", # [51..55] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaa\x02", # [51..56] 'experimental::lexical_subs'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [52] 'experimental::lexical_topic'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [53] + 'experimental::postderef'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [56] 'experimental::regex_sets'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [54] 'experimental::smartmatch'=> "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [55] 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] @@ -320,7 +323,7 @@ our %DeadBits = ( 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [46] 'inplace' => "\x00\x00\x00\x00\x00\x80\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", # [24] - 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [5..11,56] + 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [5..11,57] 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\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", # [12] @@ -348,7 +351,7 @@ our %DeadBits = ( 'substr' => "\x00\x00\x00\x00\x00\x00\x80\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", # [50] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00", # [28..38,47] - 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [56] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [57] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [41] @@ -360,8 +363,8 @@ our %DeadBits = ( ); $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -$DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x55\x00", # [2,52..55,4,22,23,25] -$LAST_BIT = 114 ; +$DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x55\x01", # [2,52,53,56,54,55,4,22,23,25] +$LAST_BIT = 116 ; $BYTES = 15 ; $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ; diff --git a/pod/perldiag.pod b/pod/perldiag.pod index a51359e..da4dfbd 100644 --- a/pod/perldiag.pod +++ b/pod/perldiag.pod @@ -4301,6 +4301,21 @@ but there was no array C<@foo> in scope at the time. If you wanted a literal @foo, then write it as \@foo; otherwise find out what happened to the array you apparently lost track of. +=item Postfix dereference is experimental + +(S experimental::postderef) This warning is emitted if you use +the experimental postfix dereference syntax. Simply suppress the +warning if you want to use the feature, but know that in doing +so you are taking the risk of using an experimental feature which +may change or be removed in a future Perl version: + + no warnings "experimental::postderef"; + use feature "postderef", "postderef_qq"; + $ref->$*; + $aref->@*; + $aref->@[@indices]; + ... etc ... + =item Precedence problem: open %s should be open(%s) (S precedence) The old irregular construct diff --git a/pod/perllexwarn.pod b/pod/perllexwarn.pod index 0d76e93..d423d05 100644 --- a/pod/perllexwarn.pod +++ b/pod/perllexwarn.pod @@ -232,6 +232,8 @@ will be lost. | | | +- experimental::lexical_topic | | + | +- experimental::postderef + | | | +- experimental::regex_sets | | | +- experimental::smartmatch diff --git a/regen/warnings.pl b/regen/warnings.pl index a3e2b44..a1c5ebd 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -97,6 +97,8 @@ my $tree = { [ 5.017, DEFAULT_ON ], 'experimental::smartmatch' => [ 5.017, DEFAULT_ON ], + 'experimental::postderef' => + [ 5.019, DEFAULT_ON ], }], #'default' => [ 5.008, DEFAULT_ON ], diff --git a/t/lib/warnings/toke b/t/lib/warnings/toke index a16df9c..389dc9c 100644 --- a/t/lib/warnings/toke +++ b/t/lib/warnings/toke @@ -79,6 +79,8 @@ toke.c AOK Useless use of \\E. $a = "abcd\E" ; + Postfix dereference is experimental + %s number > %s non-portable my $a = 0b011111111111111111111111111111110 ; $a = 0b011111111111111111111111111111111 ; @@ -1041,6 +1043,17 @@ EXPECT Useless use of \E at - line 3. ######## # toke.c +use feature 'postderef', 'postderef_qq'; +(\$_)->$*; +"$_->$*"; +no warnings 'experimental::postderef'; +(\$_)->$*; +"$_->$*"; +EXPECT +Postfix dereference is experimental at - line 3. +Postfix dereference is experimental at - line 4. +######## +# toke.c use warnings 'portable' ; my $a = 0b011111111111111111111111111111110 ; $a = 0b011111111111111111111111111111111 ; diff --git a/t/op/postfixderef.t b/t/op/postfixderef.t index 024732d..41d35ef 100644 --- a/t/op/postfixderef.t +++ b/t/op/postfixderef.t @@ -43,6 +43,7 @@ plan(118); } use feature 'postderef'; +no warnings 'experimental::postderef'; { no strict 'refs'; diff --git a/toke.c b/toke.c index 88c4348..5d3fdce 100644 --- a/toke.c +++ b/toke.c @@ -5779,6 +5779,10 @@ Perl_yylex(pTHX) ||(*s == '*' && (s[1] == '*' || s[1] == '{')) )) { + Perl_ck_warner_d(aTHX_ + packWARN(WARN_EXPERIMENTAL__POSTDEREF), + "Postfix dereference is experimental" + ); PL_expect = XPOSTDEREF; TOKEN(ARROW); } diff --git a/warnings.h b/warnings.h index f5ff791..7455a6c 100644 --- a/warnings.h +++ b/warnings.h @@ -97,7 +97,8 @@ /* Warnings Categories added in Perl 5.019 */ -#define WARN_SYSCALLS 56 +#define WARN_EXPERIMENTAL__POSTDEREF 56 +#define WARN_SYSCALLS 57 #define WARNsize 15 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125\125\125\125\125\125\125" -- 2.7.4