Deprecate use of := to mean an empty attribute list in my $pi := 4;
Nicholas Clark [Wed, 4 Nov 2009 11:33:12 +0000 (11:33 +0000)]
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.

dist/B-Deparse/t/deparse.t
pod/perl5112delta.pod
t/lib/warnings/toke
toke.c

index c9c92f9..12879fc 100644 (file)
@@ -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;
index b2a6522..aea02f3 100644 (file)
@@ -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
 
index a7ef0f8..2236442 100644 (file)
@@ -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 (file)
--- 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;