This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fewer false positives for %hash{$scalar} warning
authorFather Chrysostomos <sprout@cpan.org>
Thu, 12 Sep 2013 21:30:41 +0000 (14:30 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 13 Sep 2013 08:25:36 +0000 (01:25 -0700)
Instead of warning in the lexer, flag the op and then warn in op.c,
when the op tree is available, so we don’t end up warning for actual
lists or for sub calls.

Also, only warn in scalar context, as in list context $hash{$scalar}
and %hash{$scalar} do different things.

In op.c we no longer have easy access to the source code, so recon-
struct the hash/array access based on the op tree.  This means
%hash{foo} becomes %hash{"foo"}.  We only reconstruct constant keys,
so %hash{++$x} becomes %hash{...}.  This also corrects erroneous
dumps, like %hash{"} for %hash{"}"}.

Instead of triggering the warning solely based on the op tree, we
still keep the heuristic in toke.c, so that common workarounds for
that warning (e.g., {q<key>} and {("key")}) continue to work.

The heuristic in toke.c is tweaked to avoid warning for qw().

In a future commit I plan to extend this to the existing @array[0] and
@hash{key} warnings, to avoid false positives.

dump.c
ext/B/B/Concise.pm
op.c
op.h
perly.act
perly.h
perly.tab
perly.y
t/op/kvaslice.t
t/op/kvhslice.t
toke.c

diff --git a/dump.c b/dump.c
index d52dc93..1b6e5b4 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -954,6 +954,10 @@ S_op_private_to_names(pTHX_ SV *tmpsv, U32 optype, U32 op_private) {
        if (o->op_type == OP_PADRANGE)                                  \
            Perl_sv_catpvf(aTHX_ tmpsv, ",COUNT=%"UVuf,                 \
                            (UV)(oppriv & OPpPADRANGE_COUNTMASK));       \
+        if (  (o->op_type == OP_RV2HV || o->op_type == OP_RV2AV ||      \
+               o->op_type == OP_PADAV || o->op_type == OP_PADHV)        \
+           && oppriv & OPpSLICEWARNING  )                               \
+            sv_catpvs(tmpsv, ",SLICEWARNING");                          \
        if (SvCUR(tmpsv)) {                                             \
             if (xml)                                                    \
                 xmldump_attr1(level+1, file, "private=\"%s\"", SvPVX(tmpsv)+1); \
index 477a59a..4039954 100644 (file)
@@ -618,6 +618,8 @@ $priv{$_}{16} = "OURINTR" for qw(gvsv rv2sv rv2av rv2hv r2gv enteriter);
 $priv{$_}{8} = "LVSUB"
   for qw(rv2av rv2gv rv2hv padav padhv aelem helem aslice hslice
          av2arylen keys rkeys substr pos vec);
+$priv{$_}{4} = "SLICEWARN"
+  for qw(rv2hv rv2av kvhslice kvaslice padav padhv);
 @{$priv{$_}}{32,64} = qw(BOOL BOOL?) for qw(rv2hv padhv);
 $priv{substr}{16} = "REPL1ST";
 $priv{$_}{16} = "TARGMY"
diff --git a/op.c b/op.c
index 771c105..57c20ee 100644 (file)
--- a/op.c
+++ b/op.c
@@ -1185,6 +1185,72 @@ Perl_scalar(pTHX_ OP *o)
     case OP_SORT:
        Perl_ck_warner(aTHX_ packWARN(WARN_VOID), "Useless use of sort in scalar context");
        break;
+    case OP_KVHSLICE:
+    case OP_KVASLICE:
+       if (o->op_private & OPpSLICEWARNING) {
+           OP *kid = cLISTOPo->op_first;
+           if (kid) {
+               kid = kid->op_sibling; /* get past pushmark */
+               /* weed out false positives: op_list and op_entersub */
+               if (kid->op_type != OP_LIST && kid->op_type != OP_ENTERSUB
+                && kid->op_sibling) {
+                   OP *xvref = kid->op_sibling;
+                   const char funny =
+                       o->op_type == OP_KVHSLICE ? '%' : '@';
+                   const char lbrack =
+                       o->op_type == OP_KVHSLICE ? '{' : '[';
+                   const char rbrack =
+                       o->op_type == OP_KVHSLICE ? '}' : ']';
+                   GV *gv;
+                   SV * const name =
+                          (  xvref->op_type == OP_RV2AV
+                          || xvref->op_type == OP_RV2HV  )
+                       && cUNOPx(xvref)->op_first->op_type == OP_GV
+                       && (gv = cGVOPx_gv(cUNOPx(xvref)->op_first))
+                           ? varname(gv, funny, 0, NULL, 0, 1)
+                     :    xvref->op_type == OP_PADAV
+                       || xvref->op_type == OP_PADHV
+                           ? varname(MUTABLE_GV(PL_compcv), funny,
+                                     xvref->op_targ, NULL, 0, 1)
+                     :       NULL;
+                   SV *keysv;
+                   const char *key = NULL;
+                   if (!name) /* XS module fiddling with the op tree */
+                       break;
+                   if (kid->op_type == OP_CONST) {
+                       keysv = kSVOP_sv;
+                       if (SvPOK(kSVOP_sv)) {
+                           SV *sv = keysv;
+                           keysv = sv_newmortal();
+                           pv_pretty(keysv, SvPVX_const(sv), SvCUR(sv),
+                                     32, NULL, NULL,
+                                     PERL_PV_PRETTY_DUMP
+                                    |PERL_PV_ESCAPE_UNI_DETECT);
+                       }
+                       else if (!SvOK(keysv))
+                           key = "undef";
+                   }
+                   else key = "...";
+                   assert(name);
+                   assert(SvPOK(name));
+                   sv_chop(name,SvPVX(name)+1);
+                   if (key)
+                       Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                                  "Scalar value %%%"SVf
+                                  "%c%s%c better written as $%"SVf
+                                  "%c%s%c",
+                                   SVfARG(name), lbrack, key, rbrack,
+                                   SVfARG(name), lbrack, key, rbrack);
+                   else
+                       Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
+                                  "Scalar value %%%"SVf"%c%"SVf
+                                  "%c better written as $%"SVf
+                                  "%c%"SVf"%c",
+                                   SVfARG(name), lbrack, keysv, rbrack,
+                                   SVfARG(name), lbrack, keysv, rbrack);
+               }
+           }
+       }
     }
     return o;
 }
diff --git a/op.h b/op.h
index 08d46f9..f491e2e 100644 (file)
--- a/op.h
+++ b/op.h
@@ -221,6 +221,8 @@ Deprecated.  Use C<GIMME_V> instead.
 #define OPpEARLY_CV            32      /* foo() called before sub foo was parsed */
   /* OP_?ELEM only */
 #define OPpLVAL_DEFER          16      /* Defer creation of array/hash elem */
+  /* OP_RV2[AH]V OP_KV[AH]SLICE */
+#define OPpSLICEWARNING                4       /* warn about %hash{$scalar} */
   /* OP_RV2[SAH]V, OP_GVSV, OP_ENTERITER only */
 #define OPpOUR_INTRO           16      /* Variable was in an our() */
   /* OP_RV2[AGH]V, OP_PAD[AH]V, OP_[AH]ELEM, OP_[AH]SLICE OP_AV2ARYLEN,
index 5033bfc..67596ca 100644 (file)
--- a/perly.act
+++ b/perly.act
@@ -8,7 +8,7 @@ case 2:
 #line 141 "perly.y"
     {
                          PL_parser->expect = XSTATE;
-                       }
+                       ;}
     break;
 
   case 3:
@@ -16,14 +16,14 @@ case 2:
     {
                          newPROG(block_end((ps[(3) - (4)].val.ival),(ps[(4) - (4)].val.opval)));
                          (yyval.ival) = 0;
-                       }
+                       ;}
     break;
 
   case 4:
 #line 150 "perly.y"
     {
                          parser->expect = XTERM;
-                       }
+                       ;}
     break;
 
   case 5:
@@ -31,14 +31,14 @@ case 2:
     {
                          PL_eval_root = (ps[(3) - (3)].val.opval);
                          (yyval.ival) = 0;
-                       }
+                       ;}
     break;
 
   case 6:
 #line 159 "perly.y"
     {
                          parser->expect = XBLOCK;
-                       }
+                       ;}
     break;
 
   case 7:
@@ -49,14 +49,14 @@ case 2:
                          (yyval.ival) = 0;
                          yyunlex();
                          parser->yychar = YYEOF;
-                       }
+                       ;}
     break;
 
   case 8:
 #line 171 "perly.y"
     {
                          parser->expect = XSTATE;
-                       }
+                       ;}
     break;
 
   case 9:
@@ -67,14 +67,14 @@ case 2:
                          (yyval.ival) = 0;
                          yyunlex();
                          parser->yychar = YYEOF;
-                       }
+                       ;}
     break;
 
   case 10:
 #line 183 "perly.y"
     {
                          parser->expect = XSTATE;
-                       }
+                       ;}
     break;
 
   case 11:
@@ -85,14 +85,14 @@ case 2:
                          (yyval.ival) = 0;
                          yyunlex();
                          parser->yychar = YYEOF;
-                       }
+                       ;}
     break;
 
   case 12:
 #line 195 "perly.y"
     {
                          parser->expect = XSTATE;
-                       }
+                       ;}
     break;
 
   case 13:
@@ -100,7 +100,7 @@ case 2:
     {
                          PL_eval_root = (ps[(3) - (3)].val.opval);
                          (yyval.ival) = 0;
-                       }
+                       ;}
     break;
 
   case 14:
@@ -110,7 +110,7 @@ case 2:
                          (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 15:
@@ -120,12 +120,12 @@ case 2:
                          (yyval.opval) = block_end((ps[(2) - (7)].val.ival), (ps[(5) - (7)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (7)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(7) - (7)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 16:
 #line 226 "perly.y"
-    { (yyval.ival) = block_start(TRUE); }
+    { (yyval.ival) = block_start(TRUE); ;}
     break;
 
   case 17:
@@ -135,17 +135,17 @@ case 2:
                          (yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 18:
 #line 239 "perly.y"
-    { (yyval.ival) = block_start(FALSE); }
+    { (yyval.ival) = block_start(FALSE); ;}
     break;
 
   case 19:
 #line 244 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 20:
@@ -154,12 +154,12 @@ case 2:
                            PL_pad_reset_pending = TRUE;
                            if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval))
                                PL_hints |= HINT_BLOCK_SCOPE;
-                       }
+                       ;}
     break;
 
   case 21:
 #line 255 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 22:
@@ -168,7 +168,7 @@ case 2:
                            PL_pad_reset_pending = TRUE;
                            if ((ps[(1) - (2)].val.opval) && (ps[(2) - (2)].val.opval))
                                PL_hints |= HINT_BLOCK_SCOPE;
-                       }
+                       ;}
     break;
 
   case 23:
@@ -179,12 +179,12 @@ case 2:
                          } else {
                              (yyval.opval) = IF_MAD(newOP(OP_NULL, 0), NULL);
                          }
-                       }
+                       ;}
     break;
 
   case 24:
 #line 274 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 25:
@@ -195,7 +195,7 @@ case 2:
                                          PVAL((ps[(1) - (2)].val.p_tkval)), (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.p_tkval),
                              (ps[(2) - (2)].val.opval) ? cLISTOPx((yyval.opval))->op_first : (yyval.opval), 'L');
-                       }
+                       ;}
     break;
 
   case 26:
@@ -205,12 +205,12 @@ case 2:
                                           * PVAL((ps[(1) - (2)].val.p_tkval))[strlen(PVAL((ps[(1) - (2)].val.p_tkval)))+1],
                                          PVAL((ps[(1) - (2)].val.p_tkval)), (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.p_tkval), cLISTOPx((yyval.opval))->op_first, 'L');
-                       }
+                       ;}
     break;
 
   case 27:
 #line 296 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 28:
@@ -218,7 +218,7 @@ case 2:
     {
                          (yyval.opval) = newOP(OP_NULL,0);
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'p');
-                       }
+                       ;}
     break;
 
   case 29:
@@ -238,7 +238,7 @@ case 2:
                              SvREFCNT_inc_simple_void(fmtcv);
                              pad_add_anon(fmtcv, OP_NULL);
                          }
-                       }
+                       ;}
     break;
 
   case 30:
@@ -263,7 +263,7 @@ case 2:
                              CvCLONE_on(PL_compcv);
                          PL_parser->in_my = 0;
                          PL_parser->in_my_stash = NULL;
-                       }
+                       ;}
     break;
 
   case 31:
@@ -294,7 +294,7 @@ case 2:
                          (yyval.opval) = (OP*)NULL;
 #endif
                          intro_my();
-                       }
+                       ;}
     break;
 
   case 32:
@@ -312,12 +312,12 @@ case 2:
                              package_version((ps[(2) - (4)].val.opval));
                          (yyval.opval) = (OP*)NULL;
 #endif
-                       }
+                       ;}
     break;
 
   case 33:
 #line 385 "perly.y"
-    { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ }
+    { CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ ;}
     break;
 
   case 34:
@@ -335,7 +335,7 @@ case 2:
                          utilize(IVAL((ps[(1) - (7)].val.i_tkval)), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval));
                          (yyval.opval) = (OP*)NULL;
 #endif
-                       }
+                       ;}
     break;
 
   case 35:
@@ -347,7 +347,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')');
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 36:
@@ -359,7 +359,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')');
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 37:
@@ -373,17 +373,17 @@ case 2:
                                      ? 0
                                      : offset));
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (6)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 38:
 #line 431 "perly.y"
-    { (yyval.opval) = block_end((ps[(3) - (6)].val.ival), newWHENOP((ps[(4) - (6)].val.opval), op_scope((ps[(6) - (6)].val.opval)))); }
+    { (yyval.opval) = block_end((ps[(3) - (6)].val.ival), newWHENOP((ps[(4) - (6)].val.opval), op_scope((ps[(6) - (6)].val.opval)))); ;}
     break;
 
   case 39:
 #line 433 "perly.y"
-    { (yyval.opval) = newWHENOP(0, op_scope((ps[(2) - (2)].val.opval))); }
+    { (yyval.opval) = newWHENOP(0, op_scope((ps[(2) - (2)].val.opval))); ;}
     break;
 
   case 40:
@@ -396,7 +396,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (8)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (8)].val.i_tkval),(yyval.opval),')');
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 41:
@@ -409,7 +409,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (8)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (8)].val.i_tkval),(yyval.opval),')');
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 42:
@@ -432,7 +432,7 @@ case 2:
                          TOKEN_GETMAD((ps[(7) - (11)].val.i_tkval),(yyval.opval),'2');
                          TOKEN_GETMAD((ps[(10) - (11)].val.i_tkval),(yyval.opval),')');
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (11)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 43:
@@ -444,7 +444,7 @@ case 2:
                          TOKEN_GETMAD((ps[(5) - (9)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(7) - (9)].val.i_tkval),(yyval.opval),')');
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (9)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 44:
@@ -456,7 +456,7 @@ case 2:
                          TOKEN_GETMAD((ps[(3) - (8)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(6) - (8)].val.i_tkval),(yyval.opval),')');
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (8)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 45:
@@ -468,7 +468,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (7)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (7)].val.i_tkval),(yyval.opval),')');
                          PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 46:
@@ -477,7 +477,7 @@ case 2:
                          /* a block is a loop that happens once */
                          (yyval.opval) = newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
                                  (OP*)NULL, (ps[(1) - (2)].val.opval), (ps[(2) - (2)].val.opval), 0);
-                       }
+                       ;}
     break;
 
   case 47:
@@ -487,7 +487,7 @@ case 2:
                          if ((ps[(2) - (5)].val.opval)) {
                              package_version((ps[(2) - (5)].val.opval));
                          }
-                       }
+                       ;}
     break;
 
   case 48:
@@ -500,7 +500,7 @@ case 2:
                          TOKEN_GETMAD((ps[(8) - (8)].val.i_tkval),(yyval.opval),'}');
                          if (PL_parser->copline > (line_t)IVAL((ps[(4) - (8)].val.i_tkval)))
                              PL_parser->copline = (line_t)IVAL((ps[(4) - (8)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 49:
@@ -509,7 +509,7 @@ case 2:
                          PL_parser->expect = XSTATE;
                          (yyval.opval) = (ps[(1) - (2)].val.opval);
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),';');
-                       }
+                       ;}
     break;
 
   case 50:
@@ -519,7 +519,7 @@ case 2:
                          (yyval.opval) = IF_MAD(newOP(OP_NULL, 0), (OP*)NULL);
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),';');
                          PL_parser->copline = NOLINE;
-                       }
+                       ;}
     break;
 
   case 51:
@@ -543,55 +543,55 @@ case 2:
                          else PL_parser->copline--;
                          (yyval.opval) = newSTATEOP(0, NULL,
                                          convert(OP_FORMLINE, 0, list));
-                       }
+                       ;}
     break;
 
   case 52:
 #line 565 "perly.y"
-    { (yyval.opval) = NULL; }
+    { (yyval.opval) = NULL; ;}
     break;
 
   case 53:
 #line 567 "perly.y"
-    { (yyval.opval) = op_unscope((ps[(2) - (3)].val.opval)); }
+    { (yyval.opval) = op_unscope((ps[(2) - (3)].val.opval)); ;}
     break;
 
   case 54:
 #line 572 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 55:
 #line 574 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 56:
 #line 576 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'i');
-                       }
+                       ;}
     break;
 
   case 57:
 #line 580 "perly.y"
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'i');
-                       }
+                       ;}
     break;
 
   case 58:
 #line 584 "perly.y"
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[(3) - (3)].val.opval)), (ps[(1) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w');
-                       }
+                       ;}
     break;
 
   case 59:
 #line 588 "perly.y"
     { (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w');
-                       }
+                       ;}
     break;
 
   case 60:
@@ -599,17 +599,17 @@ case 2:
     { (yyval.opval) = newFOROP(0, (OP*)NULL, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval), (OP*)NULL);
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w');
                          PL_parser->copline = (line_t)IVAL((ps[(2) - (3)].val.i_tkval));
-                       }
+                       ;}
     break;
 
   case 61:
 #line 597 "perly.y"
-    { (yyval.opval) = newWHENOP((ps[(3) - (3)].val.opval), op_scope((ps[(1) - (3)].val.opval))); }
+    { (yyval.opval) = newWHENOP((ps[(3) - (3)].val.opval), op_scope((ps[(1) - (3)].val.opval))); ;}
     break;
 
   case 62:
 #line 602 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 63:
@@ -618,7 +618,7 @@ case 2:
                          ((ps[(2) - (2)].val.opval))->op_flags |= OPf_PARENS;
                          (yyval.opval) = op_scope((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 64:
@@ -631,12 +631,12 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'I');
                          TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 65:
 #line 623 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 66:
@@ -644,91 +644,91 @@ case 2:
     {
                          (yyval.opval) = op_scope((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 67:
 #line 633 "perly.y"
     { (yyval.ival) = (PL_min_intro_pending &&
                            PL_max_intro_pending >=  PL_min_intro_pending);
-                         intro_my(); }
+                         intro_my(); ;}
     break;
 
   case 68:
 #line 639 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 70:
 #line 645 "perly.y"
     { YYSTYPE tmplval;
                          (void)scan_num("1", &tmplval);
-                         (yyval.opval) = tmplval.opval; }
+                         (yyval.opval) = tmplval.opval; ;}
     break;
 
   case 72:
 #line 653 "perly.y"
-    { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); }
+    { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 73:
 #line 658 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 74:
 #line 662 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 75:
 #line 666 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
     break;
 
   case 76:
 #line 669 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 77:
 #line 670 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 78:
 #line 674 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, 0);
-                           SAVEFREESV(PL_compcv); }
+                           SAVEFREESV(PL_compcv); ;}
     break;
 
   case 79:
 #line 680 "perly.y"
     { (yyval.ival) = start_subparse(FALSE, CVf_ANON);
-                           SAVEFREESV(PL_compcv); }
+                           SAVEFREESV(PL_compcv); ;}
     break;
 
   case 80:
 #line 685 "perly.y"
     { (yyval.ival) = start_subparse(TRUE, 0);
-                           SAVEFREESV(PL_compcv); }
+                           SAVEFREESV(PL_compcv); ;}
     break;
 
   case 83:
 #line 696 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 85:
 #line 702 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 86:
 #line 704 "perly.y"
     { (yyval.opval) = (ps[(2) - (2)].val.opval);
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':');
-                       }
+                       ;}
     break;
 
   case 87:
@@ -738,14 +738,14 @@ case 2:
                                    (OP*)NULL
                                );
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),':');
-                       }
+                       ;}
     break;
 
   case 88:
 #line 718 "perly.y"
     { (yyval.opval) = (ps[(2) - (2)].val.opval);
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':');
-                       }
+                       ;}
     break;
 
   case 89:
@@ -755,12 +755,12 @@ case 2:
                                    (OP*)NULL
                                );
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),':');
-                       }
+                       ;}
     break;
 
   case 90:
 #line 731 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 91:
@@ -771,28 +771,28 @@ case 2:
                                );
                          PL_parser->expect = XSTATE;
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),';');
-                       }
+                       ;}
     break;
 
   case 92:
 #line 743 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 93:
 #line 747 "perly.y"
     { (yyval.opval) = newLOGOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 94:
 #line 751 "perly.y"
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 96:
@@ -805,7 +805,7 @@ case 2:
 #else
                          (yyval.opval) = (ps[(1) - (2)].val.opval);
 #endif
-                       }
+                       ;}
     break;
 
   case 97:
@@ -817,7 +817,7 @@ case 2:
                              token_getmad((ps[(2) - (3)].val.i_tkval),term,',');
                          )
                          (yyval.opval) = op_append_elem(OP_LIST, (ps[(1) - (3)].val.opval), term);
-                       }
+                       ;}
     break;
 
   case 99:
@@ -825,7 +825,7 @@ case 2:
     { (yyval.opval) = convert(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_STACKED,
                                op_prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (3)].val.i_tkval)),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) );
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 100:
@@ -835,7 +835,7 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 101:
@@ -847,7 +847,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (6)].val.i_tkval),(yyval.opval),'A');
                          TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 102:
@@ -856,7 +856,7 @@ case 2:
                                op_append_elem(OP_LIST, scalar((ps[(1) - (3)].val.opval)),
                                    newUNOP(OP_METHOD, 0, (ps[(3) - (3)].val.opval))));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'A');
-                       }
+                       ;}
     break;
 
   case 103:
@@ -865,7 +865,7 @@ case 2:
                                op_append_elem(OP_LIST,
                                    op_prepend_elem(OP_LIST, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval)),
                                    newUNOP(OP_METHOD, 0, (ps[(1) - (3)].val.opval))));
-                       }
+                       ;}
     break;
 
   case 104:
@@ -876,14 +876,14 @@ case 2:
                                    newUNOP(OP_METHOD, 0, (ps[(1) - (5)].val.opval))));
                          TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 105:
 #line 823 "perly.y"
     { (yyval.opval) = convert(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 106:
@@ -892,13 +892,13 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 107:
 #line 833 "perly.y"
     { SvREFCNT_inc_simple_void(PL_compcv);
-                         (yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, (OP*)NULL, (ps[(3) - (3)].val.opval)); }
+                         (yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, (OP*)NULL, (ps[(3) - (3)].val.opval)); ;}
     break;
 
   case 108:
@@ -906,7 +906,7 @@ case 2:
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                 op_append_elem(OP_LIST,
                                   op_prepend_elem(OP_LIST, (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)), (ps[(1) - (5)].val.opval)));
-                       }
+                       ;}
     break;
 
   case 111:
@@ -916,7 +916,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 112:
@@ -924,7 +924,7 @@ case 2:
     { (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[(1) - (4)].val.opval)), scalar((ps[(3) - (4)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 113:
@@ -935,7 +935,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'a');
                          TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 114:
@@ -945,7 +945,7 @@ case 2:
                                        scalar((ps[(3) - (4)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 115:
@@ -955,7 +955,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 116:
@@ -968,7 +968,7 @@ case 2:
                          TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(5) - (6)].val.i_tkval),(yyval.opval),';');
                          TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 117:
@@ -980,7 +980,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 118:
@@ -990,7 +990,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'a');
                          TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 119:
@@ -1001,7 +1001,7 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'a');
                          TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 120:
@@ -1011,7 +1011,7 @@ case 2:
                                               newCVREF(0, scalar((ps[(1) - (4)].val.opval)))));
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 121:
@@ -1020,7 +1020,7 @@ case 2:
                                   newCVREF(0, scalar((ps[(1) - (3)].val.opval))));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 122:
@@ -1030,7 +1030,7 @@ case 2:
                          TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),')');
                          TOKEN_GETMAD((ps[(4) - (6)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(6) - (6)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 123:
@@ -1038,7 +1038,7 @@ case 2:
     { (yyval.opval) = newSLICEOP(0, (ps[(3) - (4)].val.opval), (ps[(1) - (4)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 124:
@@ -1048,21 +1048,21 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),')');
                          TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 125:
 #line 955 "perly.y"
     { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 126:
 #line 959 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 127:
@@ -1071,49 +1071,49 @@ case 2:
                                scalar((ps[(1) - (3)].val.opval));
                            (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 128:
 #line 969 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 129:
 #line 973 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 130:
 #line 977 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 131:
 #line 981 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 132:
 #line 985 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 133:
 #line 989 "perly.y"
     { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 134:
@@ -1128,28 +1128,28 @@ case 2:
                              op = (UNOP*)op->op_first; /* get to range */
                              token_getmad((ps[(2) - (3)].val.i_tkval),(OP*)op,'o');
                            });
-                       }
+                       ;}
     break;
 
   case 135:
 #line 1005 "perly.y"
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 136:
 #line 1009 "perly.y"
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 137:
 #line 1013 "perly.y"
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 138:
@@ -1159,14 +1159,14 @@ case 2:
                                ((yyval.opval)->op_type == OP_NOT
                                    ? ((UNOP*)(yyval.opval))->op_first : (yyval.opval)),
                                '~');
-                       }
+                       ;}
     break;
 
   case 139:
 #line 1027 "perly.y"
     { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 140:
@@ -1176,21 +1176,21 @@ case 2:
                                    (ps[(2) - (2)].val.opval)
                                );
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'+');
-                       }
+                       ;}
     break;
 
   case 141:
 #line 1038 "perly.y"
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 142:
 #line 1042 "perly.y"
     { (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 143:
@@ -1198,7 +1198,7 @@ case 2:
     { (yyval.opval) = newUNOP(OP_POSTINC, 0,
                                        op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC));
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 144:
@@ -1206,7 +1206,7 @@ case 2:
     { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
                                        op_lvalue(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC));
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 145:
@@ -1214,7 +1214,7 @@ case 2:
     { (yyval.opval) = newUNOP(OP_PREINC, 0,
                                        op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREINC));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 146:
@@ -1222,7 +1222,7 @@ case 2:
     { (yyval.opval) = newUNOP(OP_PREDEC, 0,
                                        op_lvalue(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 147:
@@ -1230,7 +1230,7 @@ case 2:
     { (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 148:
@@ -1238,7 +1238,7 @@ case 2:
     { (yyval.opval) = newANONLIST((OP*)NULL);
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 149:
@@ -1247,7 +1247,7 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),';');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 150:
@@ -1256,7 +1256,7 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),';');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 151:
@@ -1266,21 +1266,21 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
                          OP_GETMAD((ps[(3) - (5)].val.opval),(yyval.opval),'s');
                          OP_GETMAD((ps[(4) - (5)].val.opval),(yyval.opval),'a');
-                       }
+                       ;}
     break;
 
   case 152:
 #line 1103 "perly.y"
     { (yyval.opval) = dofile((ps[(2) - (2)].val.opval), IVAL((ps[(1) - (2)].val.i_tkval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 153:
 #line 1107 "perly.y"
     { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'D');
-                       }
+                       ;}
     break;
 
   case 154:
@@ -1295,7 +1295,7 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 155:
@@ -1311,7 +1311,7 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 156:
@@ -1322,7 +1322,7 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 157:
@@ -1334,7 +1334,7 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 162:
@@ -1342,26 +1342,26 @@ case 2:
     { (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval));
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'?');
                          TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),':');
-                       }
+                       ;}
     break;
 
   case 163:
 #line 1165 "perly.y"
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, op_lvalue((ps[(2) - (2)].val.opval),OP_REFGEN));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 164:
 #line 1169 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 165:
 #line 1171 "perly.y"
     { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'k');
-                       }
+                       ;}
     break;
 
   case 166:
@@ -1369,12 +1369,12 @@ case 2:
     { (yyval.opval) = sawparens(IF_MAD(newUNOP(OP_NULL,0,(ps[(2) - (3)].val.opval)), (ps[(2) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 167:
 #line 1180 "perly.y"
-    { (yyval.opval) = IF_MAD(newUNOP(OP_NULL,0,(ps[(1) - (1)].val.opval)), (ps[(1) - (1)].val.opval)); }
+    { (yyval.opval) = IF_MAD(newUNOP(OP_NULL,0,(ps[(1) - (1)].val.opval)), (ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 168:
@@ -1382,37 +1382,37 @@ case 2:
     { (yyval.opval) = sawparens(newNULLLIST());
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 169:
 #line 1187 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 170:
 #line 1189 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 171:
 #line 1191 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 172:
 #line 1193 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 173:
 #line 1195 "perly.y"
-    { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));}
+    { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));;}
     break;
 
   case 174:
 #line 1197 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 175:
@@ -1424,7 +1424,7 @@ case 2:
                                        ref((ps[(1) - (4)].val.opval), OP_ASLICE)));
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 176:
@@ -1434,13 +1434,16 @@ case 2:
                                    newLISTOP(OP_KVASLICE, 0,
                                        list((ps[(3) - (4)].val.opval)),
                                        ref(oopsAV((ps[(1) - (4)].val.opval)), OP_KVASLICE)));
+                         if ((yyval.opval) && (ps[(1) - (4)].val.opval))
+                             (yyval.opval)->op_private |=
+                                 (ps[(1) - (4)].val.opval)->op_private & OPpSLICEWARNING;
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
-                       }
+                       ;}
     break;
 
   case 177:
-#line 1217 "perly.y"
+#line 1220 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_HSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_HSLICE, 0,
@@ -1450,43 +1453,46 @@ case 2:
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 178:
-#line 1228 "perly.y"
+#line 1231 "perly.y"
     { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
                                newOP(OP_PUSHMARK, 0),
                                    newLISTOP(OP_KVHSLICE, 0,
                                        list((ps[(3) - (5)].val.opval)),
                                        ref((ps[(1) - (5)].val.opval), OP_KVHSLICE)));
+                         if ((yyval.opval) && (ps[(1) - (5)].val.opval))
+                             (yyval.opval)->op_private |=
+                                 (ps[(1) - (5)].val.opval)->op_private & OPpSLICEWARNING;
                            PL_parser->expect = XOPERATOR;
                          TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
                          TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),';');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),'}');
-                       }
+                       ;}
     break;
 
   case 179:
-#line 1239 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1245 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 180:
-#line 1241 "perly.y"
-    { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); }
+#line 1247 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 181:
-#line 1243 "perly.y"
+#line 1249 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (3)].val.opval)));
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 182:
-#line 1248 "perly.y"
+#line 1254 "perly.y"
     {
                          (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                                op_append_elem(OP_LIST, (ps[(3) - (4)].val.opval), scalar((ps[(1) - (4)].val.opval))));
@@ -1498,122 +1504,122 @@ case 2:
                              token_getmad((ps[(2) - (4)].val.i_tkval),op,'(');
                              token_getmad((ps[(4) - (4)].val.i_tkval),op,')');
                          });
-                       }
+                       ;}
     break;
 
   case 183:
-#line 1261 "perly.y"
+#line 1267 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
                            op_append_elem(OP_LIST, (ps[(3) - (3)].val.opval), scalar((ps[(2) - (3)].val.opval))));
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 184:
-#line 1266 "perly.y"
+#line 1272 "perly.y"
     { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), OPf_SPECIAL);
                            PL_hints |= HINT_BLOCK_SCOPE;
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 185:
-#line 1271 "perly.y"
+#line 1277 "perly.y"
     { (yyval.opval) = newLOOPEX(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 186:
-#line 1275 "perly.y"
+#line 1281 "perly.y"
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 187:
-#line 1279 "perly.y"
+#line 1285 "perly.y"
     { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0);
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 188:
-#line 1283 "perly.y"
+#line 1289 "perly.y"
     { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 189:
-#line 1287 "perly.y"
+#line 1293 "perly.y"
     { (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 190:
-#line 1291 "perly.y"
+#line 1297 "perly.y"
     { (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.i_tkval) ? OPf_SPECIAL : 0);
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 191:
-#line 1295 "perly.y"
+#line 1301 "perly.y"
     { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.i_tkval) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 192:
-#line 1299 "perly.y"
-    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); }
+#line 1305 "perly.y"
+    { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 193:
-#line 1301 "perly.y"
+#line 1307 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                           op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); }
+                           op_append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); ;}
     break;
 
   case 194:
-#line 1304 "perly.y"
+#line 1310 "perly.y"
     { (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0);
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
-                       }
+                       ;}
     break;
 
   case 195:
-#line 1308 "perly.y"
+#line 1314 "perly.y"
     { (yyval.opval) = newOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0);
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 196:
-#line 1314 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1320 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 197:
-#line 1316 "perly.y"
+#line 1322 "perly.y"
     { (yyval.opval) = (ps[(1) - (3)].val.opval);
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 198:
-#line 1321 "perly.y"
+#line 1327 "perly.y"
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
-                               scalar((ps[(1) - (1)].val.opval))); }
+                               scalar((ps[(1) - (1)].val.opval))); ;}
     break;
 
   case 199:
-#line 1324 "perly.y"
+#line 1330 "perly.y"
     { (yyval.opval) = (IVAL((ps[(1) - (3)].val.i_tkval)) == OP_NOT)
                            ? newUNOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0, newSVOP(OP_CONST, 0, newSViv(0)))
                            : newOP(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_SPECIAL);
@@ -1621,20 +1627,20 @@ case 2:
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 200:
-#line 1333 "perly.y"
+#line 1339 "perly.y"
     { (yyval.opval) = newUNOP(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
                          TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 201:
-#line 1339 "perly.y"
+#line 1345 "perly.y"
     {
                            if (   (ps[(1) - (1)].val.opval)->op_type != OP_TRANS
                                && (ps[(1) - (1)].val.opval)->op_type != OP_TRANSR
@@ -1644,166 +1650,170 @@ case 2:
                                SAVEFREESV(PL_compcv);
                            } else
                                (yyval.ival) = 0;
-                       }
+                       ;}
     break;
 
   case 202:
-#line 1350 "perly.y"
+#line 1356 "perly.y"
     { (yyval.opval) = pmruntime((ps[(1) - (5)].val.opval), (ps[(4) - (5)].val.opval), 1, (ps[(2) - (5)].val.ival));
                          TOKEN_GETMAD((ps[(3) - (5)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(5) - (5)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 205:
-#line 1357 "perly.y"
+#line 1363 "perly.y"
     {
                          (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
                                newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
                          TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'X');
-                       }
+                       ;}
     break;
 
   case 207:
-#line 1367 "perly.y"
+#line 1373 "perly.y"
     { (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval));
                          DO_MAD(
                              token_getmad((ps[(1) - (3)].val.i_tkval),(yyval.opval),'d');
                              append_madprops((ps[(3) - (3)].val.opval)->op_madprop, (yyval.opval), 'a');
                              (ps[(3) - (3)].val.opval)->op_madprop = 0;
                          );
-                       }
+                       ;}
     break;
 
   case 208:
-#line 1375 "perly.y"
+#line 1381 "perly.y"
     { (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval)));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'d');
-                       }
+                       ;}
     break;
 
   case 209:
-#line 1382 "perly.y"
+#line 1388 "perly.y"
     { (yyval.opval) = sawparens((ps[(2) - (3)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 210:
-#line 1387 "perly.y"
+#line 1393 "perly.y"
     { (yyval.opval) = sawparens(newNULLLIST());
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'(');
                          TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')');
-                       }
+                       ;}
     break;
 
   case 211:
-#line 1392 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1398 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 212:
-#line 1394 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1400 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 213:
-#line 1396 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1402 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 214:
-#line 1401 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+#line 1407 "perly.y"
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 215:
-#line 1403 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1409 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 216:
-#line 1407 "perly.y"
-    { (yyval.opval) = (OP*)NULL; }
+#line 1413 "perly.y"
+    { (yyval.opval) = (OP*)NULL; ;}
     break;
 
   case 217:
-#line 1409 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1415 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
   case 218:
-#line 1415 "perly.y"
-    { PL_parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); }
+#line 1421 "perly.y"
+    { PL_parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 219:
-#line 1419 "perly.y"
+#line 1425 "perly.y"
     { (yyval.opval) = newCVREF(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'&');
-                       }
+                       ;}
     break;
 
   case 220:
-#line 1425 "perly.y"
+#line 1431 "perly.y"
     { (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'$');
-                       }
+                       ;}
     break;
 
   case 221:
-#line 1431 "perly.y"
+#line 1437 "perly.y"
     { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'@');
-                       }
+                       ;}
     break;
 
   case 222:
-#line 1437 "perly.y"
+#line 1443 "perly.y"
     { (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval));
+                         if ((yyval.opval)) (yyval.opval)->op_private |= IVAL((ps[(1) - (2)].val.i_tkval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'%');
-                       }
+                       ;}
     break;
 
   case 223:
-#line 1443 "perly.y"
+#line 1450 "perly.y"
     { (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'l');
-                       }
+                       ;}
     break;
 
   case 224:
-#line 1449 "perly.y"
+#line 1456 "perly.y"
     { (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval));
                          TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'*');
-                       }
+                       ;}
     break;
 
   case 225:
-#line 1456 "perly.y"
-    { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); }
+#line 1463 "perly.y"
+    { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 226:
-#line 1458 "perly.y"
-    { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); }
+#line 1465 "perly.y"
+    { (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 227:
-#line 1460 "perly.y"
-    { (yyval.opval) = op_scope((ps[(1) - (1)].val.opval)); }
+#line 1467 "perly.y"
+    { (yyval.opval) = op_scope((ps[(1) - (1)].val.opval)); ;}
     break;
 
   case 228:
-#line 1463 "perly.y"
-    { (yyval.opval) = (ps[(1) - (1)].val.opval); }
+#line 1470 "perly.y"
+    { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
     break;
 
+
+/* Line 1267 of yacc.c.  */
+
       default: break;
     
 
 /* Generated from:
- * 1c6010b3d1651d4fc7cbfc329723c507767b4230ac920ae0ffde8f344f4a0ab4 perly.y
+ * 80609b739b642fa427503886445869dfd47021624a1977b902211b38043ed9f1 perly.y
  * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
  * ex: set ro: */
diff --git a/perly.h b/perly.h
index dcf67d9..155dea0 100644 (file)
--- a/perly.h
+++ b/perly.h
@@ -5,24 +5,27 @@
  */
 
 #ifdef PERL_CORE
-/* A Bison parser, made by GNU Bison 2.6.5.  */
+/* A Bison parser, made by GNU Bison 2.3.  */
 
-/* Bison interface for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
-   
-   This program is free software: you can redistribute it and/or modify
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+   Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation, either version 3 of the License, or
-   (at your option) any later version.
-   
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 /* As a special exception, you may create a larger work that contains
    part or all of the Bison parser skeleton and distribute that work
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-   
+
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 0
-#endif
-#if YYDEBUG
-extern int yydebug;
-#endif
-
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
@@ -133,7 +128,6 @@ extern int yydebug;
      PEG = 337
    };
 #endif
-
 /* Tokens.  */
 #define GRAMPROG 258
 #define GRAMEXPR 259
@@ -217,6 +211,8 @@ extern int yydebug;
 #define PEG 337
 
 
+
+
 #ifdef PERL_IN_TOKE_C
 static bool
 S_is_opval_token(int type) {
@@ -243,8 +239,6 @@ S_is_opval_token(int type) {
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
 {
-/* Line 2042 of yacc.c  */
-
     I32        ival; /* __DEFAULT__ (marker for regen_perly.pl;
                                must always be 1st union member) */
     char *pval;
@@ -260,32 +254,18 @@ typedef union YYSTYPE
 #ifdef PERL_MAD
     TOKEN* tkval;
 #endif
-
-
-/* Line 2042 of yacc.c  */
-} YYSTYPE;
-# define YYSTYPE_IS_TRIVIAL 1
+}
+/* Line 1529 of yacc.c.  */
+       YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 
 /* Generated from:
- * 1c6010b3d1651d4fc7cbfc329723c507767b4230ac920ae0ffde8f344f4a0ab4 perly.y
+ * 80609b739b642fa427503886445869dfd47021624a1977b902211b38043ed9f1 perly.y
  * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
  * ex: set ro: */
index 3a1d620..fc94499 100644 (file)
--- a/perly.tab
+++ b/perly.tab
@@ -197,16 +197,16 @@ static const yytype_uint16 yyrline[] =
     1030,  1037,  1041,  1045,  1050,  1055,  1060,  1069,  1074,  1079,
     1085,  1091,  1102,  1106,  1110,  1122,  1135,  1143,  1155,  1156,
     1157,  1158,  1159,  1164,  1168,  1170,  1174,  1179,  1181,  1186,
-    1188,  1190,  1192,  1194,  1196,  1198,  1207,  1216,  1227,  1238,
-    1240,  1242,  1247,  1260,  1265,  1270,  1274,  1278,  1282,  1286,
-    1290,  1294,  1298,  1300,  1303,  1307,  1313,  1315,  1320,  1323,
-    1332,  1339,  1338,  1354,  1355,  1356,  1362,  1366,  1374,  1381,
-    1386,  1391,  1393,  1395,  1400,  1402,  1407,  1408,  1414,  1418,
-    1424,  1430,  1436,  1442,  1448,  1455,  1457,  1459,  1462
+    1188,  1190,  1192,  1194,  1196,  1198,  1207,  1219,  1230,  1244,
+    1246,  1248,  1253,  1266,  1271,  1276,  1280,  1284,  1288,  1292,
+    1296,  1300,  1304,  1306,  1309,  1313,  1319,  1321,  1326,  1329,
+    1338,  1345,  1344,  1360,  1361,  1362,  1368,  1372,  1380,  1387,
+    1392,  1397,  1399,  1401,  1406,  1408,  1413,  1414,  1420,  1424,
+    1430,  1436,  1442,  1449,  1455,  1462,  1464,  1466,  1469
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || 0
+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -225,17 +225,17 @@ static const char *const yytname[] =
   "ANDOP", "NOTOP", "','", "ASSIGNOP", "'?'", "':'", "DORDOR", "OROR",
   "ANDAND", "BITOROP", "BITANDOP", "SHIFTOP", "MATCHOP", "'!'", "'~'",
   "REFGEN", "UMINUS", "POWOP", "POSTDEC", "POSTINC", "PREDEC", "PREINC",
-  "ARROW", "')'", "'('", "PEG", "$accept", "grammar", "$@1", "$@2", "$@3",
-  "$@4", "$@5", "$@6", "block", "formblock", "remember", "mblock",
+  "ARROW", "')'", "'('", "PEG", "$accept", "grammar", "@1", "@2", "@3",
+  "@4", "@5", "@6", "block", "formblock", "remember", "mblock",
   "mremember", "stmtseq", "formstmtseq", "fullstmt", "labfullstmt",
-  "barestmt", "$@7", "$@8", "$@9", "formline", "formarg", "sideff", "else",
+  "barestmt", "@7", "@8", "@9", "formline", "formarg", "sideff", "else",
   "cont", "mintro", "nexpr", "texpr", "iexpr", "mexpr", "mnexpr", "miexpr",
   "formname", "startsub", "startanonsub", "startformsub", "subname",
   "proto", "subattrlist", "myattrlist", "subbody", "expr", "listexpr",
   "listop", "@10", "method", "subscripted", "termbinop", "termunop",
   "anonymous", "termdo", "term", "@11", "myattrterm", "myterm",
   "optlistexpr", "optexpr", "my_scalar", "amper", "scalar", "ary", "hsh",
-  "arylen", "star", "indirob", YY_NULL
+  "arylen", "star", "indirob", 0
 };
 #endif
 
@@ -314,8 +314,8 @@ static const yytype_uint8 yyr2[] =
        2,     2,     2,     2,     2,     1,     1,     1,     1
 };
 
-/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
-   Performed when YYTABLE doesn't specify something else to do.  Zero
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
@@ -448,7 +448,8 @@ static const yytype_int16 yypgoto[] =
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If YYTABLE_NINF, syntax error.  */
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
 #define YYTABLE_NINF -204
 static const yytype_int16 yytable[] =
 {
@@ -742,12 +743,6 @@ static const yytype_int16 yytable[] =
        0,     0,   184
 };
 
-#define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-387)))
-
-#define yytable_value_is_error(Yytable_value) \
-  (!!((Yytable_value) == (-204)))
-
 static const yytype_int16 yycheck[] =
 {
       10,    11,    12,    15,    42,   295,   295,    11,   297,   298,
@@ -1128,6 +1123,6 @@ static const toketypes yy_type_tab[] =
 };
 
 /* Generated from:
- * 1c6010b3d1651d4fc7cbfc329723c507767b4230ac920ae0ffde8f344f4a0ab4 perly.y
+ * 80609b739b642fa427503886445869dfd47021624a1977b902211b38043ed9f1 perly.y
  * 5c9d2a0262457fe9b70073fc8ad6c188f812f38ad57712b7e2f53daa01b297cc regen_perly.pl
  * ex: set ro: */
diff --git a/perly.y b/perly.y
index accc95d..6b19646 100644 (file)
--- a/perly.y
+++ b/perly.y
@@ -1210,6 +1210,9 @@ term      :       termbinop
                                    newLISTOP(OP_KVASLICE, 0,
                                        list($3),
                                        ref(oopsAV($1), OP_KVASLICE)));
+                         if ($$ && $1)
+                             $$->op_private |=
+                                 $1->op_private & OPpSLICEWARNING;
                          TOKEN_GETMAD($2,$$,'[');
                          TOKEN_GETMAD($4,$$,']');
                        }
@@ -1230,6 +1233,9 @@ term      :       termbinop
                                    newLISTOP(OP_KVHSLICE, 0,
                                        list($3),
                                        ref($1, OP_KVHSLICE)));
+                         if ($$ && $1)
+                             $$->op_private |=
+                                 $1->op_private & OPpSLICEWARNING;
                            PL_parser->expect = XOPERATOR;
                          TOKEN_GETMAD($2,$$,'{');
                          TOKEN_GETMAD($4,$$,';');
@@ -1435,6 +1441,7 @@ ary       :       '@' indirob
 
 hsh    :       '%' indirob
                        { $$ = newHVREF($2);
+                         if ($$) $$->op_private |= IVAL($1);
                          TOKEN_GETMAD($1,$$,'%');
                        }
        ;
index d434e3a..a82a411 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
 
 # use strict;
 
-plan tests => 35;
+plan tests => 34;
 
 # simple use cases
 {
@@ -149,7 +149,7 @@ plan tests => 35;
     my @a = 'a'..'c';
     {
         @warn = ();
-        my ($v) = eval '%a[0]';
+        my $v = eval '%a[0]';
         is (scalar @warn, 1, 'warning in scalar context');
         like $warn[0], qr{^Scalar value %a\[0\] better written as \$a\[0\]},
             "correct warning text";
@@ -159,9 +159,7 @@ plan tests => 35;
         my ($k,$v) = eval '%a[0]';
         is ($k, 0);
         is ($v, 'a');
-        is (scalar @warn, 1, 'warning, even in list context');
-        like $warn[0], qr{^Scalar value %a\[0\] better written as \$a\[0\]},
-            "correct warning text";
+        is (scalar @warn, 0, 'no warning in list context');
     }
 }
 
index 9d23a95..6ca875d 100644 (file)
@@ -8,7 +8,7 @@ BEGIN {
 
 # use strict;
 
-plan tests => 39;
+plan tests => 38;
 
 # simple use cases
 {
@@ -50,7 +50,8 @@ plan tests => 39;
         eval 'is( scalar %h{i}, "I", "correct value");';
 
         is (scalar @warn, 1);
-        like ($warn[0], qr/^Scalar value \%h\{i\} better written as \$h\{i\}/);
+        like ($warn[0],
+              qr/^Scalar value \%h\{"i"\} better written as \$h\{"i"\}/);
     }
 }
 
@@ -79,7 +80,6 @@ plan tests => 39;
 
 # ref of a slice produces list
 {
-    no warnings 'syntax';
     my %h = map { $_ => uc $_ } 'a'..'z';
     my @a = \%h{ qw'c d e' };
 
@@ -146,9 +146,10 @@ plan tests => 39;
     my %h = map { $_ => uc $_ } 'a'..'c';
     {
         @warn = ();
-        my ($v) = eval '%h{a}';
+        my $v = eval '%h{a}';
         is (scalar @warn, 1, 'warning in scalar context');
-        like $warn[0], qr{^Scalar value %h{a} better written as \$h{a}},
+        like $warn[0],
+             qr{^Scalar value %h{"a"} better written as \$h{"a"}},
             "correct warning text";
     }
     {
@@ -156,9 +157,7 @@ plan tests => 39;
         my ($k,$v) = eval '%h{a}';
         is ($k, 'a');
         is ($v, 'A');
-        is (scalar @warn, 1, 'warning, even in list context');
-        like $warn[0], qr{^Scalar value %h{a} better written as \$h{a}},
-            "correct warning text";
+        is (scalar @warn, 0, 'no warning in list context');
     }
 
     # deprecated syntax
diff --git a/toke.c b/toke.c
index 4690771..0522852 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -5800,6 +5800,7 @@ Perl_yylex(pTHX)
        Mop(OP_MULTIPLY);
 
     case '%':
+    {
        if (PL_expect == XOPERATOR) {
            if (s[1] == '=' && !PL_lex_allbrackets &&
                    PL_lex_fakeeof >= LEX_FAKEEOF_ASSIGN)
@@ -5811,6 +5812,7 @@ Perl_yylex(pTHX)
        PL_tokenbuf[0] = '%';
        s = scan_ident(s, PL_bufend, PL_tokenbuf + 1,
                sizeof PL_tokenbuf - 1, FALSE);
+       pl_yylval.ival = 0;
        if (!PL_tokenbuf[1]) {
            PREREF('%');
        }
@@ -5822,26 +5824,23 @@ Perl_yylex(pTHX)
            if (*s == '[' || *s == '{') {
                if (ckWARN(WARN_SYNTAX)) {
                    const char *t = s + 1;
+                   while (*t == ' ') t++;
+                   if (*t == 'q' && t[1] == 'w'
+                    && !isWORDCHAR_lazy_if(t+2,UTF))
+                       goto no_qw_warning;
                    while (*t && (isWORDCHAR_lazy_if(t,UTF) || strchr(" \t$#+-'\"", *t)))
                        t += UTF ? UTF8SKIP(t) : 1;
                    if (*t == '}' || *t == ']') {
-                       t++;
-                       PL_bufptr = PEEKSPACE(PL_bufptr); /* XXX can realloc */
-       /* diag_listed_as: Scalar value @%s[%s] better written as $%s[%s] */
-                       Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                           "Scalar value %"SVf" better written as $%"SVf,
-                           SVfARG(newSVpvn_flags(PL_bufptr, (STRLEN)(t-PL_bufptr),
-                                                SVs_TEMP | (UTF ? SVf_UTF8 : 0 ))),
-                            SVfARG(newSVpvn_flags(PL_bufptr+1, (STRLEN)(t-PL_bufptr-1),
-                                                SVs_TEMP | (UTF ? SVf_UTF8 : 0 ))));
+                       pl_yylval.ival = OPpSLICEWARNING;
                    }
                }
            }
        }
+      no_qw_warning:
        PL_expect = XOPERATOR;
        force_ident_maybe_lex('%');
        TERM('%');
-
+    }
     case '^':
        if (!PL_lex_allbrackets && PL_lex_fakeeof >=
                (s[1] == '=' ? LEX_FAKEEOF_ASSIGN : LEX_FAKEEOF_BITWISE))