Add new error "Can't use keyword '%s' as a label"
Rafael Garcia-Suarez [Thu, 30 Jul 2009 21:19:13 +0000 (23:19 +0200)]
pod/perldiag.pod
toke.c

index 2623010..9447ba4 100644 (file)
@@ -1147,6 +1147,11 @@ that is already inside a group with a byte-order modifier.
 For example you cannot force little-endianness on a type that
 is inside a big-endian group.
 
+=item Can't use keyword '%s' as a label
+
+(F) You attempted to use a reserved keyword, such as C<print> or C<BEGIN>,
+as a statement label. This is disallowed since Perl 5.11.0.
+
 =item Can't use "my %s" in sort comparison
 
 (F) The global variables $a and $b are reserved for sort comparisons.
diff --git a/toke.c b/toke.c
index 554975a..b264279 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -5275,17 +5275,20 @@ Perl_yylex(pTHX)
        while (d < PL_bufend && isSPACE(*d))
                d++;    /* no comments skipped here, or s### is misparsed */
 
-       /* Check for keywords */
-       tmp = keyword(PL_tokenbuf, len, 0);
-
        /* Is this a label? */
        if (!tmp && PL_expect == XSTATE
              && d < PL_bufend && *d == ':' && *(d + 1) != ':') {
+           tmp = keyword(PL_tokenbuf, len, 0);
+           if (tmp)
+               Perl_croak(aTHX_ "Can't use keyword '%s' as a label", PL_tokenbuf);
            s = d + 1;
            pl_yylval.pval = CopLABEL_alloc(PL_tokenbuf);
            CLINE;
            TOKEN(LABEL);
        }
+       else
+           /* Check for keywords */
+           tmp = keyword(PL_tokenbuf, len, 0);
 
        /* Is this a word before a => operator? */
        if (*d == '=' && d[1] == '>') {