From: Nicholas Clark Date: Wed, 4 Nov 2009 11:33:12 +0000 (+0000) Subject: Deprecate use of := to mean an empty attribute list in my $pi := 4; X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=d83f38d8facaed626f27ae5d9f0f66709664dc5e;p=p5sagit%2Fp5-mst-13.2.git Deprecate use of := to mean an empty attribute list in my $pi := 4; An accident of Perl's parser meant that my $pi := 4; was parsed as an empty attribute list. Empty attribute lists are ignored, hence the above is equivalent to my $pi = 4; However, the fact that it is currently valid syntax means that := cannot be used as new token, without silently changing the meaning of existing code. Hence it is now deprecated, so that it can subsequently be removed, allowing the possibility of := to be used as a new token with new semantics. --- diff --git a/dist/B-Deparse/t/deparse.t b/dist/B-Deparse/t/deparse.t index c9c92f9..12879fc 100644 --- a/dist/B-Deparse/t/deparse.t +++ b/dist/B-Deparse/t/deparse.t @@ -17,7 +17,7 @@ BEGIN { require feature; feature->import(':5.10'); } -use Test::More tests => 78; +use Test::More tests => 81; use Config (); use B::Deparse; @@ -591,3 +591,15 @@ foreach (0..3) { print ++$x, "\n"; } } +#### +my $pi = 4; +#### +no warnings; +my $pi := 4; +>>>> +no warnings; +my $pi = 4; +#### +my $pi : = 4; +>>>> +my $pi = 4; diff --git a/pod/perl5112delta.pod b/pod/perl5112delta.pod index b2a6522..aea02f3 100644 --- a/pod/perl5112delta.pod +++ b/pod/perl5112delta.pod @@ -15,11 +15,28 @@ XXX Unlikely to need this section. =head1 Incompatible Changes -XXX For a release on a stable branch, this section aspires to be: +=head2 Use of C<:=> to mean an empty attribute list is now deprecated. - There are no changes intentionally incompatible with 5.XXX.XXX. If any - exist, they are bugs and reports are welcome. +An accident of Perl's parser means that these constructions are all equivalent: + my $pi := 4; + my $pi : = 4; + my $pi : = 4; + +with the C<:> being treated as the start of an attribute list, which ends +before the C<=>. As whitespace is not significant here, all are parsed as an +empty attribute list, hence all the above are equivalent to, and better written +as + + my $pi = 4; + +because no attribute processing is done for an empty list. + +As is, this means that C<:=> cannot be used as a new token, without silently +changing the meaning of existing code. Hence that particular form is now +deprecated, and will become a syntax error. If it is absolutely necessary to +have empty attribute lists (for example, because of a code generator) the +avoid the warning by adding a space before the C<=>. =head1 Core Enhancements diff --git a/t/lib/warnings/toke b/t/lib/warnings/toke index a7ef0f8..2236442 100644 --- a/t/lib/warnings/toke +++ b/t/lib/warnings/toke @@ -901,3 +901,62 @@ my $bar = qr/^foo${\}n/; EXPECT Possible unintended interpolation of $\ in regex at - line 3. Possible unintended interpolation of $\ in regex at - line 5. +######## +# toke.c +use feature 'state'; +# This one is fine as an empty attribute list +my $holy_Einstein : = ''; +# This one is deprecated +my $krunch := 4; +our $FWISK_FWISK_FWIZZACH_FWACH_ZACHITTY_ZICH_SHAZZATZ_FWISK := ''; +state $thump := 'Trumpets'; +# Lather rinse repeat in my usual obsessive style +my @holy_perfect_pitch : = (); +my @zok := (); +our @GUKGUK := (); +# state @widget_mark := (); +my %holy_seditives : = (); +my %bang := (); +our %GIGAZING := (); +# state %hex := (); +no warnings 'deprecated'; +my $holy_giveaways : = ''; +my $eee_yow := []; +our $TWOYYOYYOING_THUK_UGH := 1 == 1; +state $octothorn := 'Tinky Winky'; +my @holy_Taj_Mahal : = (); +my @touche := (); +our @PLAK_DAK_THUK_FRIT := (); +# state @hash_mark := (); +my %holy_priceless_collection_of_Etruscan_snoods : = (); +my %wham_eth := (); +our %THWUK := (); +# state %octalthorpe := (); +use warnings; +my $holy_sewer_pipe : = ''; +my $thunk := undef; +our $BLIT := time; +state $crunch := 'Laa Laa'; +my @glurpp := (); +my @holy_harem : = (); +our @FABADAP := (); +# state @square := (); +my %holy_pin_cushions : = (); +my %swoosh := (); +our %RRRRR := (); +# state %scratchmark := (); +EXPECT +Use of := for an empty attribute list is deprecated at - line 6. +Use of := for an empty attribute list is deprecated at - line 7. +Use of := for an empty attribute list is deprecated at - line 8. +Use of := for an empty attribute list is deprecated at - line 11. +Use of := for an empty attribute list is deprecated at - line 12. +Use of := for an empty attribute list is deprecated at - line 15. +Use of := for an empty attribute list is deprecated at - line 16. +Use of := for an empty attribute list is deprecated at - line 33. +Use of := for an empty attribute list is deprecated at - line 34. +Use of := for an empty attribute list is deprecated at - line 35. +Use of := for an empty attribute list is deprecated at - line 36. +Use of := for an empty attribute list is deprecated at - line 38. +Use of := for an empty attribute list is deprecated at - line 41. +Use of := for an empty attribute list is deprecated at - line 42. diff --git a/toke.c b/toke.c index bd20434..fa78415 100644 --- a/toke.c +++ b/toke.c @@ -4298,6 +4298,9 @@ Perl_yylex(pTHX) if (!PL_in_my || PL_lex_state != LEX_NORMAL) break; PL_bufptr = s; /* update in case we back off */ + if (*s == '=') { + deprecate(":= for an empty attribute list"); + } goto grabattrs; case XATTRBLOCK: PL_expect = XBLOCK;