34484a
From 52ef21e43af97a7ed71a9bb7621a3c058196cfc2 Mon Sep 17 00:00:00 2001
34484a
From: Zefram <zefram@fysh.org>
34484a
Date: Tue, 16 Jan 2018 08:04:08 +0000
34484a
Subject: [PATCH] fix parsing of braced subscript after parens
34484a
MIME-Version: 1.0
34484a
Content-Type: text/plain; charset=UTF-8
34484a
Content-Transfer-Encoding: 8bit
34484a
34484a
Where an arrow is omitted between subscripts, if a parenthesised
34484a
subscript is followed by a braced one, PL_expect was getting set to
34484a
XBLOCK due to code intended for "foreach (...) {...}".  This broke
34484a
bareword autoquotation, and the parsing of operators following the
34484a
braced subscript.  Alter PL_expect from XBLOCK to XOPERATOR following
34484a
a parenthesised subscript.  Fixes [perl #8045].
34484a
34484a
Petr Písař: Ported to 5.26.1.
34484a
34484a
Signed-off-by: Petr Písař <ppisar@redhat.com>
34484a
---
34484a
 perly.act           | 250 +++++++++++++++++++++++++++-------------------------
34484a
 perly.h             |  10 ++-
34484a
 perly.tab           |  30 +++----
34484a
 perly.y             |  20 ++++-
34484a
 t/op/postfixderef.t |  25 +++++-
34484a
 5 files changed, 192 insertions(+), 143 deletions(-)
34484a
34484a
diff --git a/perly.act b/perly.act
34484a
index 73c44e5..4f74883 100644
34484a
--- a/perly.act
34484a
+++ b/perly.act
34484a
@@ -1194,65 +1194,77 @@ case 2:
34484a
   case 141:
34484a
 #line 931 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
-				   newCVREF(0, scalar((ps[-3].val.opval)))); }
34484a
+				   newCVREF(0, scalar((ps[-3].val.opval))));
34484a
+			  if (parser->expect == XBLOCK)
34484a
+			      parser->expect = XOPERATOR;
34484a
+			}
34484a
 
34484a
     break;
34484a
 
34484a
   case 142:
34484a
-#line 934 "perly.y" /* yacc.c:1646  */
34484a
+#line 937 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
 				   op_append_elem(OP_LIST, (ps[-1].val.opval),
34484a
-				       newCVREF(0, scalar((ps[-4].val.opval))))); }
34484a
+				       newCVREF(0, scalar((ps[-4].val.opval)))));
34484a
+			  if (parser->expect == XBLOCK)
34484a
+			      parser->expect = XOPERATOR;
34484a
+			}
34484a
 
34484a
     break;
34484a
 
34484a
   case 143:
34484a
-#line 939 "perly.y" /* yacc.c:1646  */
34484a
+#line 945 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
 				   op_append_elem(OP_LIST, (ps[-1].val.opval),
34484a
-					       newCVREF(0, scalar((ps[-3].val.opval))))); }
34484a
+					       newCVREF(0, scalar((ps[-3].val.opval)))));
34484a
+			  if (parser->expect == XBLOCK)
34484a
+			      parser->expect = XOPERATOR;
34484a
+			}
34484a
 
34484a
     break;
34484a
 
34484a
   case 144:
34484a
-#line 943 "perly.y" /* yacc.c:1646  */
34484a
+#line 952 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
-				   newCVREF(0, scalar((ps[-2].val.opval)))); }
34484a
+				   newCVREF(0, scalar((ps[-2].val.opval))));
34484a
+			  if (parser->expect == XBLOCK)
34484a
+			      parser->expect = XOPERATOR;
34484a
+			}
34484a
 
34484a
     break;
34484a
 
34484a
   case 145:
34484a
-#line 946 "perly.y" /* yacc.c:1646  */
34484a
+#line 958 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-4].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 146:
34484a
-#line 948 "perly.y" /* yacc.c:1646  */
34484a
+#line 960 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), (ps[-3].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 147:
34484a
-#line 950 "perly.y" /* yacc.c:1646  */
34484a
+#line 962 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newSLICEOP(0, (ps[-1].val.opval), NULL); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 148:
34484a
-#line 955 "perly.y" /* yacc.c:1646  */
34484a
+#line 967 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[-2].val.opval), (ps[-1].val.ival), (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 149:
34484a
-#line 957 "perly.y" /* yacc.c:1646  */
34484a
+#line 969 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 150:
34484a
-#line 959 "perly.y" /* yacc.c:1646  */
34484a
+#line 971 "perly.y" /* yacc.c:1646  */
34484a
     {   if ((ps[-1].val.ival) != OP_REPEAT)
34484a
 				scalar((ps[-2].val.opval));
34484a
 			    (yyval.opval) = newBINOP((ps[-1].val.ival), 0, (ps[-2].val.opval), scalar((ps[0].val.opval)));
34484a
@@ -1261,111 +1273,111 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 151:
34484a
-#line 964 "perly.y" /* yacc.c:1646  */
34484a
+#line 976 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 152:
34484a
-#line 966 "perly.y" /* yacc.c:1646  */
34484a
+#line 978 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 153:
34484a
-#line 968 "perly.y" /* yacc.c:1646  */
34484a
+#line 980 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 154:
34484a
-#line 970 "perly.y" /* yacc.c:1646  */
34484a
+#line 982 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 155:
34484a
-#line 972 "perly.y" /* yacc.c:1646  */
34484a
+#line 984 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 156:
34484a
-#line 974 "perly.y" /* yacc.c:1646  */
34484a
+#line 986 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newBINOP((ps[-1].val.ival), 0, scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 157:
34484a
-#line 976 "perly.y" /* yacc.c:1646  */
34484a
+#line 988 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newRANGE((ps[-1].val.ival), scalar((ps[-2].val.opval)), scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 158:
34484a
-#line 978 "perly.y" /* yacc.c:1646  */
34484a
+#line 990 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newLOGOP(OP_AND, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 159:
34484a
-#line 980 "perly.y" /* yacc.c:1646  */
34484a
+#line 992 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newLOGOP(OP_OR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 160:
34484a
-#line 982 "perly.y" /* yacc.c:1646  */
34484a
+#line 994 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[-2].val.opval), (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 161:
34484a
-#line 984 "perly.y" /* yacc.c:1646  */
34484a
+#line 996 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = bind_match((ps[-1].val.ival), (ps[-2].val.opval), (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 162:
34484a
-#line 989 "perly.y" /* yacc.c:1646  */
34484a
+#line 1001 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 163:
34484a
-#line 991 "perly.y" /* yacc.c:1646  */
34484a
+#line 1003 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 164:
34484a
-#line 994 "perly.y" /* yacc.c:1646  */
34484a
+#line 1006 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 165:
34484a
-#line 996 "perly.y" /* yacc.c:1646  */
34484a
+#line 1008 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 166:
34484a
-#line 998 "perly.y" /* yacc.c:1646  */
34484a
+#line 1010 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_POSTINC, 0,
34484a
 					op_lvalue(scalar((ps[-1].val.opval)), OP_POSTINC)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 167:
34484a
-#line 1001 "perly.y" /* yacc.c:1646  */
34484a
+#line 1013 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_POSTDEC, 0,
34484a
 					op_lvalue(scalar((ps[-1].val.opval)), OP_POSTDEC));}
34484a
 
34484a
     break;
34484a
 
34484a
   case 168:
34484a
-#line 1004 "perly.y" /* yacc.c:1646  */
34484a
+#line 1016 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = op_convert_list(OP_JOIN, 0,
34484a
 				       op_append_elem(
34484a
 					OP_LIST,
34484a
@@ -1380,52 +1392,52 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 169:
34484a
-#line 1015 "perly.y" /* yacc.c:1646  */
34484a
+#line 1027 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_PREINC, 0,
34484a
 					op_lvalue(scalar((ps[0].val.opval)), OP_PREINC)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 170:
34484a
-#line 1018 "perly.y" /* yacc.c:1646  */
34484a
+#line 1030 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_PREDEC, 0,
34484a
 					op_lvalue(scalar((ps[0].val.opval)), OP_PREDEC)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 171:
34484a
-#line 1025 "perly.y" /* yacc.c:1646  */
34484a
+#line 1037 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newANONLIST((ps[-1].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 172:
34484a
-#line 1027 "perly.y" /* yacc.c:1646  */
34484a
+#line 1039 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newANONLIST(NULL);}
34484a
 
34484a
     break;
34484a
 
34484a
   case 173:
34484a
-#line 1029 "perly.y" /* yacc.c:1646  */
34484a
+#line 1041 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newANONHASH((ps[-2].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 174:
34484a
-#line 1031 "perly.y" /* yacc.c:1646  */
34484a
+#line 1043 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newANONHASH(NULL); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 175:
34484a
-#line 1033 "perly.y" /* yacc.c:1646  */
34484a
+#line 1045 "perly.y" /* yacc.c:1646  */
34484a
     { SvREFCNT_inc_simple_void(PL_compcv);
34484a
 			  (yyval.opval) = newANONATTRSUB((ps[-3].val.ival), (ps[-2].val.opval), (ps[-1].val.opval), (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 176:
34484a
-#line 1036 "perly.y" /* yacc.c:1646  */
34484a
+#line 1048 "perly.y" /* yacc.c:1646  */
34484a
     {
34484a
 			  OP *body;
34484a
 			  if (parser->copline > (line_t)(ps[-2].val.ival))
34484a
@@ -1439,103 +1451,103 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 177:
34484a
-#line 1050 "perly.y" /* yacc.c:1646  */
34484a
+#line 1062 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = dofile((ps[0].val.opval), (ps[-1].val.ival));}
34484a
 
34484a
     break;
34484a
 
34484a
   case 178:
34484a
-#line 1052 "perly.y" /* yacc.c:1646  */
34484a
+#line 1064 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, op_scope((ps[0].val.opval)));}
34484a
 
34484a
     break;
34484a
 
34484a
   case 183:
34484a
-#line 1060 "perly.y" /* yacc.c:1646  */
34484a
+#line 1072 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newCONDOP(0, (ps[-4].val.opval), (ps[-2].val.opval), (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 184:
34484a
-#line 1062 "perly.y" /* yacc.c:1646  */
34484a
+#line 1074 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 185:
34484a
-#line 1064 "perly.y" /* yacc.c:1646  */
34484a
+#line 1076 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, localize((ps[0].val.opval),1)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 186:
34484a
-#line 1066 "perly.y" /* yacc.c:1646  */
34484a
+#line 1078 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 187:
34484a
-#line 1068 "perly.y" /* yacc.c:1646  */
34484a
+#line 1080 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = localize((ps[0].val.opval),0); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 188:
34484a
-#line 1070 "perly.y" /* yacc.c:1646  */
34484a
+#line 1082 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = sawparens((ps[-1].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 189:
34484a
-#line 1072 "perly.y" /* yacc.c:1646  */
34484a
+#line 1084 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 190:
34484a
-#line 1074 "perly.y" /* yacc.c:1646  */
34484a
+#line 1086 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = sawparens(newNULLLIST()); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 191:
34484a
-#line 1076 "perly.y" /* yacc.c:1646  */
34484a
+#line 1088 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 192:
34484a
-#line 1078 "perly.y" /* yacc.c:1646  */
34484a
+#line 1090 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 193:
34484a
-#line 1080 "perly.y" /* yacc.c:1646  */
34484a
+#line 1092 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 194:
34484a
-#line 1082 "perly.y" /* yacc.c:1646  */
34484a
+#line 1094 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 195:
34484a
-#line 1084 "perly.y" /* yacc.c:1646  */
34484a
+#line 1096 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[0].val.opval), OP_AV2ARYLEN));}
34484a
 
34484a
     break;
34484a
 
34484a
   case 196:
34484a
-#line 1086 "perly.y" /* yacc.c:1646  */
34484a
+#line 1098 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 197:
34484a
-#line 1088 "perly.y" /* yacc.c:1646  */
34484a
+#line 1100 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = op_prepend_elem(OP_ASLICE,
34484a
 				newOP(OP_PUSHMARK, 0),
34484a
 				    newLISTOP(OP_ASLICE, 0,
34484a
@@ -1549,7 +1561,7 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 198:
34484a
-#line 1098 "perly.y" /* yacc.c:1646  */
34484a
+#line 1110 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = op_prepend_elem(OP_KVASLICE,
34484a
 				newOP(OP_PUSHMARK, 0),
34484a
 				    newLISTOP(OP_KVASLICE, 0,
34484a
@@ -1563,7 +1575,7 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 199:
34484a
-#line 1108 "perly.y" /* yacc.c:1646  */
34484a
+#line 1120 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = op_prepend_elem(OP_HSLICE,
34484a
 				newOP(OP_PUSHMARK, 0),
34484a
 				    newLISTOP(OP_HSLICE, 0,
34484a
@@ -1577,7 +1589,7 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 200:
34484a
-#line 1118 "perly.y" /* yacc.c:1646  */
34484a
+#line 1130 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = op_prepend_elem(OP_KVHSLICE,
34484a
 				newOP(OP_PUSHMARK, 0),
34484a
 				    newLISTOP(OP_KVHSLICE, 0,
34484a
@@ -1591,26 +1603,26 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 201:
34484a
-#line 1128 "perly.y" /* yacc.c:1646  */
34484a
+#line 1140 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 202:
34484a
-#line 1130 "perly.y" /* yacc.c:1646  */
34484a
+#line 1142 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 203:
34484a
-#line 1132 "perly.y" /* yacc.c:1646  */
34484a
+#line 1144 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[-2].val.opval)));
34484a
 			}
34484a
 
34484a
     break;
34484a
 
34484a
   case 204:
34484a
-#line 1135 "perly.y" /* yacc.c:1646  */
34484a
+#line 1147 "perly.y" /* yacc.c:1646  */
34484a
     {
34484a
 			  (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
 				op_append_elem(OP_LIST, (ps[-1].val.opval), scalar((ps[-3].val.opval))));
34484a
@@ -1619,7 +1631,7 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 205:
34484a
-#line 1140 "perly.y" /* yacc.c:1646  */
34484a
+#line 1152 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
 			    op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval))));
34484a
 			}
34484a
@@ -1627,130 +1639,130 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 206:
34484a
-#line 1144 "perly.y" /* yacc.c:1646  */
34484a
+#line 1156 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newSVREF((ps[-3].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 207:
34484a
-#line 1146 "perly.y" /* yacc.c:1646  */
34484a
+#line 1158 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 208:
34484a
-#line 1148 "perly.y" /* yacc.c:1646  */
34484a
+#line 1160 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newHVREF((ps[-3].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 209:
34484a
-#line 1150 "perly.y" /* yacc.c:1646  */
34484a
+#line 1162 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, 0,
34484a
 				       scalar(newCVREF((ps[-1].val.ival),(ps[-3].val.opval)))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 210:
34484a
-#line 1153 "perly.y" /* yacc.c:1646  */
34484a
+#line 1165 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newGVREF(0,(ps[-3].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 211:
34484a
-#line 1155 "perly.y" /* yacc.c:1646  */
34484a
+#line 1167 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newOP((ps[0].val.ival), OPf_SPECIAL);
34484a
 			    PL_hints |= HINT_BLOCK_SCOPE; }
34484a
 
34484a
     break;
34484a
 
34484a
   case 212:
34484a
-#line 1158 "perly.y" /* yacc.c:1646  */
34484a
+#line 1170 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newLOOPEX((ps[-1].val.ival),(ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 213:
34484a
-#line 1160 "perly.y" /* yacc.c:1646  */
34484a
+#line 1172 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 214:
34484a
-#line 1162 "perly.y" /* yacc.c:1646  */
34484a
+#line 1174 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newOP((ps[0].val.ival), 0); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 215:
34484a
-#line 1164 "perly.y" /* yacc.c:1646  */
34484a
+#line 1176 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 216:
34484a
-#line 1166 "perly.y" /* yacc.c:1646  */
34484a
+#line 1178 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP((ps[-1].val.ival), 0, (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 217:
34484a
-#line 1168 "perly.y" /* yacc.c:1646  */
34484a
+#line 1180 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newOP(OP_REQUIRE, (ps[0].val.ival) ? OPf_SPECIAL : 0); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 218:
34484a
-#line 1170 "perly.y" /* yacc.c:1646  */
34484a
+#line 1182 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_REQUIRE, (ps[-1].val.ival) ? OPf_SPECIAL : 0, (ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 219:
34484a
-#line 1172 "perly.y" /* yacc.c:1646  */
34484a
+#line 1184 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 220:
34484a
-#line 1174 "perly.y" /* yacc.c:1646  */
34484a
+#line 1186 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
 			    op_append_elem(OP_LIST, (ps[0].val.opval), scalar((ps[-1].val.opval)))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 221:
34484a
-#line 1177 "perly.y" /* yacc.c:1646  */
34484a
+#line 1189 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newOP((ps[0].val.ival), 0); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 222:
34484a
-#line 1179 "perly.y" /* yacc.c:1646  */
34484a
+#line 1191 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newOP((ps[-2].val.ival), 0);}
34484a
 
34484a
     break;
34484a
 
34484a
   case 223:
34484a
-#line 1181 "perly.y" /* yacc.c:1646  */
34484a
+#line 1193 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 224:
34484a
-#line 1183 "perly.y" /* yacc.c:1646  */
34484a
+#line 1195 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[-2].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 225:
34484a
-#line 1185 "perly.y" /* yacc.c:1646  */
34484a
+#line 1197 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 226:
34484a
-#line 1187 "perly.y" /* yacc.c:1646  */
34484a
+#line 1199 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = ((ps[-2].val.ival) == OP_NOT)
34484a
                           ? newUNOP((ps[-2].val.ival), 0, newSVOP(OP_CONST, 0, newSViv(0)))
34484a
                           : newOP((ps[-2].val.ival), OPf_SPECIAL); }
34484a
@@ -1758,13 +1770,13 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 227:
34484a
-#line 1191 "perly.y" /* yacc.c:1646  */
34484a
+#line 1203 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP((ps[-3].val.ival), 0, (ps[-1].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 228:
34484a
-#line 1193 "perly.y" /* yacc.c:1646  */
34484a
+#line 1205 "perly.y" /* yacc.c:1646  */
34484a
     {
34484a
 			    if (   (ps[0].val.opval)->op_type != OP_TRANS
34484a
 			        && (ps[0].val.opval)->op_type != OP_TRANSR
34484a
@@ -1779,13 +1791,13 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 229:
34484a
-#line 1204 "perly.y" /* yacc.c:1646  */
34484a
+#line 1216 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = pmruntime((ps[-5].val.opval), (ps[-2].val.opval), (ps[-1].val.opval), 1, (ps[-4].val.ival)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 232:
34484a
-#line 1208 "perly.y" /* yacc.c:1646  */
34484a
+#line 1220 "perly.y" /* yacc.c:1646  */
34484a
     {
34484a
 			  (yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
34484a
 				newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
34484a
@@ -1794,109 +1806,109 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 234:
34484a
-#line 1217 "perly.y" /* yacc.c:1646  */
34484a
+#line 1229 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = my_attrs((ps[-1].val.opval),(ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 235:
34484a
-#line 1219 "perly.y" /* yacc.c:1646  */
34484a
+#line 1231 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = localize((ps[0].val.opval),1); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 236:
34484a
-#line 1221 "perly.y" /* yacc.c:1646  */
34484a
+#line 1233 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newUNOP(OP_REFGEN, 0, my_attrs((ps[-1].val.opval),(ps[0].val.opval))); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 237:
34484a
-#line 1226 "perly.y" /* yacc.c:1646  */
34484a
+#line 1238 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = sawparens((ps[-1].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 238:
34484a
-#line 1228 "perly.y" /* yacc.c:1646  */
34484a
+#line 1240 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = sawparens(newNULLLIST()); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 239:
34484a
-#line 1231 "perly.y" /* yacc.c:1646  */
34484a
+#line 1243 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 240:
34484a
-#line 1233 "perly.y" /* yacc.c:1646  */
34484a
+#line 1245 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 241:
34484a
-#line 1235 "perly.y" /* yacc.c:1646  */
34484a
+#line 1247 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 242:
34484a
-#line 1240 "perly.y" /* yacc.c:1646  */
34484a
+#line 1252 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = NULL; }
34484a
 
34484a
     break;
34484a
 
34484a
   case 243:
34484a
-#line 1242 "perly.y" /* yacc.c:1646  */
34484a
+#line 1254 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 244:
34484a
-#line 1246 "perly.y" /* yacc.c:1646  */
34484a
+#line 1258 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = NULL; }
34484a
 
34484a
     break;
34484a
 
34484a
   case 245:
34484a
-#line 1248 "perly.y" /* yacc.c:1646  */
34484a
+#line 1260 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 246:
34484a
-#line 1252 "perly.y" /* yacc.c:1646  */
34484a
+#line 1264 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = NULL; }
34484a
 
34484a
     break;
34484a
 
34484a
   case 247:
34484a
-#line 1254 "perly.y" /* yacc.c:1646  */
34484a
+#line 1266 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 248:
34484a
-#line 1260 "perly.y" /* yacc.c:1646  */
34484a
+#line 1272 "perly.y" /* yacc.c:1646  */
34484a
     { parser->in_my = 0; (yyval.opval) = my((ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 256:
34484a
-#line 1277 "perly.y" /* yacc.c:1646  */
34484a
+#line 1289 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newCVREF((ps[-1].val.ival),(ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 257:
34484a
-#line 1281 "perly.y" /* yacc.c:1646  */
34484a
+#line 1293 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newSVREF((ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 258:
34484a
-#line 1285 "perly.y" /* yacc.c:1646  */
34484a
+#line 1297 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newAVREF((ps[0].val.opval));
34484a
 			  if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
34484a
 			}
34484a
@@ -1904,7 +1916,7 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 259:
34484a
-#line 1291 "perly.y" /* yacc.c:1646  */
34484a
+#line 1303 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newHVREF((ps[0].val.opval));
34484a
 			  if ((yyval.opval)) (yyval.opval)->op_private |= (ps[-1].val.ival);
34484a
 			}
34484a
@@ -1912,61 +1924,61 @@ case 2:
34484a
     break;
34484a
 
34484a
   case 260:
34484a
-#line 1297 "perly.y" /* yacc.c:1646  */
34484a
+#line 1309 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newAVREF((ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 261:
34484a
-#line 1299 "perly.y" /* yacc.c:1646  */
34484a
+#line 1311 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newAVREF((ps[-3].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 262:
34484a
-#line 1303 "perly.y" /* yacc.c:1646  */
34484a
+#line 1315 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newGVREF(0,(ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 264:
34484a
-#line 1308 "perly.y" /* yacc.c:1646  */
34484a
+#line 1320 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newAVREF((ps[-2].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 266:
34484a
-#line 1313 "perly.y" /* yacc.c:1646  */
34484a
+#line 1325 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newHVREF((ps[-2].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 268:
34484a
-#line 1318 "perly.y" /* yacc.c:1646  */
34484a
+#line 1330 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = newGVREF(0,(ps[-2].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 269:
34484a
-#line 1323 "perly.y" /* yacc.c:1646  */
34484a
+#line 1335 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = scalar((ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 270:
34484a
-#line 1325 "perly.y" /* yacc.c:1646  */
34484a
+#line 1337 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = scalar((ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 271:
34484a
-#line 1327 "perly.y" /* yacc.c:1646  */
34484a
+#line 1339 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = op_scope((ps[0].val.opval)); }
34484a
 
34484a
     break;
34484a
 
34484a
   case 272:
34484a
-#line 1330 "perly.y" /* yacc.c:1646  */
34484a
+#line 1342 "perly.y" /* yacc.c:1646  */
34484a
     { (yyval.opval) = (ps[0].val.opval); }
34484a
 
34484a
     break;
34484a
@@ -1977,6 +1989,6 @@ case 2:
34484a
     
34484a
 
34484a
 /* Generated from:
34484a
- * a8b5527eacb1205d15c8c01acb4a8f99b494e5b453ddd68a2a2e7fca4be3302a perly.y
34484a
+ * c44aaa81abd3fc5c53b5aee014f9e6e11ef70a4c8470b767618f5938627ef0e7 perly.y
34484a
  * 153cba5d215c1a083a0459c43f4d55c45fd0a7093c197d7247a456dcde21ea53 regen_perly.pl
34484a
  * ex: set ro: */
34484a
diff --git a/perly.h b/perly.h
34484a
index a7e9a43..256d797 100644
34484a
--- a/perly.h
34484a
+++ b/perly.h
34484a
@@ -7,11 +7,11 @@
34484a
 #define PERL_BISON_VERSION  30000
34484a
 
34484a
 #ifdef PERL_CORE
34484a
-/* A Bison parser, made by GNU Bison 3.0.2.  */
34484a
+/* A Bison parser, made by GNU Bison 3.0.4.  */
34484a
 
34484a
 /* Bison interface for Yacc-like parsers in C
34484a
 
34484a
-   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
34484a
+   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
34484a
 
34484a
    This program is free software: you can redistribute it and/or modify
34484a
    it under the terms of the GNU General Public License as published by
34484a
@@ -160,7 +160,7 @@ S_is_opval_token(int type) {
34484a
 #endif /* PERL_IN_TOKE_C */
34484a
 #endif /* PERL_CORE */
34484a
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
34484a
-typedef union YYSTYPE YYSTYPE;
34484a
+
34484a
 union YYSTYPE
34484a
 {
34484a
 
34484a
@@ -171,6 +171,8 @@ union YYSTYPE
34484a
     GV *gvval;
34484a
 
34484a
 };
34484a
+
34484a
+typedef union YYSTYPE YYSTYPE;
34484a
 # define YYSTYPE_IS_TRIVIAL 1
34484a
 # define YYSTYPE_IS_DECLARED 1
34484a
 #endif
34484a
@@ -181,6 +183,6 @@ int yyparse (void);
34484a
 
34484a
 
34484a
 /* Generated from:
34484a
- * a8b5527eacb1205d15c8c01acb4a8f99b494e5b453ddd68a2a2e7fca4be3302a perly.y
34484a
+ * c44aaa81abd3fc5c53b5aee014f9e6e11ef70a4c8470b767618f5938627ef0e7 perly.y
34484a
  * 153cba5d215c1a083a0459c43f4d55c45fd0a7093c197d7247a456dcde21ea53 regen_perly.pl
34484a
  * ex: set ro: */
34484a
diff --git a/perly.tab b/perly.tab
34484a
index e4065de..fe19874 100644
34484a
--- a/perly.tab
34484a
+++ b/perly.tab
34484a
@@ -83,20 +83,20 @@ static const yytype_uint16 yyrline[] =
34484a
      769,   774,   773,   825,   826,   830,   832,   834,   836,   840,
34484a
      842,   847,   851,   855,   859,   865,   870,   876,   882,   884,
34484a
      887,   886,   897,   898,   902,   906,   909,   914,   919,   922,
34484a
-     926,   930,   933,   938,   942,   945,   947,   949,   954,   956,
34484a
-     958,   963,   965,   967,   969,   971,   973,   975,   977,   979,
34484a
-     981,   983,   988,   990,   993,   995,   997,  1000,  1003,  1014,
34484a
-    1017,  1024,  1026,  1028,  1030,  1032,  1035,  1049,  1051,  1055,
34484a
-    1056,  1057,  1058,  1059,  1061,  1063,  1065,  1067,  1069,  1071,
34484a
-    1073,  1075,  1077,  1079,  1081,  1083,  1085,  1087,  1097,  1107,
34484a
-    1117,  1127,  1129,  1131,  1134,  1139,  1143,  1145,  1147,  1149,
34484a
-    1152,  1154,  1157,  1159,  1161,  1163,  1165,  1167,  1169,  1171,
34484a
-    1173,  1176,  1178,  1180,  1182,  1184,  1186,  1190,  1193,  1192,
34484a
-    1205,  1206,  1207,  1212,  1216,  1218,  1220,  1225,  1227,  1230,
34484a
-    1232,  1234,  1239,  1241,  1246,  1247,  1252,  1253,  1259,  1263,
34484a
-    1264,  1265,  1268,  1269,  1272,  1273,  1276,  1280,  1284,  1290,
34484a
-    1296,  1298,  1302,  1306,  1307,  1311,  1312,  1316,  1317,  1322,
34484a
-    1324,  1326,  1329
34484a
+     926,   930,   936,   944,   951,   957,   959,   961,   966,   968,
34484a
+     970,   975,   977,   979,   981,   983,   985,   987,   989,   991,
34484a
+     993,   995,  1000,  1002,  1005,  1007,  1009,  1012,  1015,  1026,
34484a
+    1029,  1036,  1038,  1040,  1042,  1044,  1047,  1061,  1063,  1067,
34484a
+    1068,  1069,  1070,  1071,  1073,  1075,  1077,  1079,  1081,  1083,
34484a
+    1085,  1087,  1089,  1091,  1093,  1095,  1097,  1099,  1109,  1119,
34484a
+    1129,  1139,  1141,  1143,  1146,  1151,  1155,  1157,  1159,  1161,
34484a
+    1164,  1166,  1169,  1171,  1173,  1175,  1177,  1179,  1181,  1183,
34484a
+    1185,  1188,  1190,  1192,  1194,  1196,  1198,  1202,  1205,  1204,
34484a
+    1217,  1218,  1219,  1224,  1228,  1230,  1232,  1237,  1239,  1242,
34484a
+    1244,  1246,  1251,  1253,  1258,  1259,  1264,  1265,  1271,  1275,
34484a
+    1276,  1277,  1280,  1281,  1284,  1285,  1288,  1292,  1296,  1302,
34484a
+    1308,  1310,  1314,  1318,  1319,  1323,  1324,  1328,  1329,  1334,
34484a
+    1336,  1338,  1341
34484a
 };
34484a
 #endif
34484a
 
34484a
@@ -1109,6 +1109,6 @@ static const toketypes yy_type_tab[] =
34484a
 };
34484a
 
34484a
 /* Generated from:
34484a
- * a8b5527eacb1205d15c8c01acb4a8f99b494e5b453ddd68a2a2e7fca4be3302a perly.y
34484a
+ * c44aaa81abd3fc5c53b5aee014f9e6e11ef70a4c8470b767618f5938627ef0e7 perly.y
34484a
  * 153cba5d215c1a083a0459c43f4d55c45fd0a7093c197d7247a456dcde21ea53 regen_perly.pl
34484a
  * ex: set ro: */
34484a
diff --git a/perly.y b/perly.y
34484a
index 7d57dea..14d48d6 100644
34484a
--- a/perly.y
34484a
+++ b/perly.y
34484a
@@ -929,19 +929,31 @@ subscripted:    gelem '{' expr ';' '}'        /* *main::{something} */
34484a
 					jmaybe($3)); }
34484a
 	|	term ARROW '(' ')'          /* $subref->() */
34484a
 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
-				   newCVREF(0, scalar($1))); }
34484a
+				   newCVREF(0, scalar($1)));
34484a
+			  if (parser->expect == XBLOCK)
34484a
+			      parser->expect = XOPERATOR;
34484a
+			}
34484a
 	|	term ARROW '(' expr ')'     /* $subref->(@args) */
34484a
 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
 				   op_append_elem(OP_LIST, $4,
34484a
-				       newCVREF(0, scalar($1)))); }
34484a
+				       newCVREF(0, scalar($1))));
34484a
+			  if (parser->expect == XBLOCK)
34484a
+			      parser->expect = XOPERATOR;
34484a
+			}
34484a
 
34484a
 	|	subscripted '(' expr ')'   /* $foo->{bar}->(@args) */
34484a
 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
 				   op_append_elem(OP_LIST, $3,
34484a
-					       newCVREF(0, scalar($1)))); }
34484a
+					       newCVREF(0, scalar($1))));
34484a
+			  if (parser->expect == XBLOCK)
34484a
+			      parser->expect = XOPERATOR;
34484a
+			}
34484a
 	|	subscripted '(' ')'        /* $foo->{bar}->() */
34484a
 			{ $$ = newUNOP(OP_ENTERSUB, OPf_STACKED,
34484a
-				   newCVREF(0, scalar($1))); }
34484a
+				   newCVREF(0, scalar($1)));
34484a
+			  if (parser->expect == XBLOCK)
34484a
+			      parser->expect = XOPERATOR;
34484a
+			}
34484a
 	|	'(' expr ')' '[' expr ']'            /* list slice */
34484a
 			{ $$ = newSLICEOP(0, $5, $2); }
34484a
 	|	QWLIST '[' expr ']'            /* list literal slice */
34484a
diff --git a/t/op/postfixderef.t b/t/op/postfixderef.t
34484a
index ba69f06..c2983cf 100644
34484a
--- a/t/op/postfixderef.t
34484a
+++ b/t/op/postfixderef.t
34484a
@@ -16,7 +16,7 @@ BEGIN {
34484a
 
34484a
 use strict qw(refs subs);
34484a
 
34484a
-plan(116);
34484a
+plan(130);
34484a
 
34484a
 {
34484a
     no strict 'refs';
34484a
@@ -365,3 +365,26 @@ is "$_->@{foo}", "foo->7 8 9", '->@{ does not interpolate without feature';
34484a
     is "foo$ref->$*bar", "foo plus overload plus bar",
34484a
        '"foo $s->$* bar" does concat overloading';
34484a
 }
34484a
+
34484a
+# parsing of {} subscript as subscript rather than block
34484a
+{
34484a
+    sub ppp { "qqq" }
34484a
+    my $h = { ppp => "pp", qqq => "qq", rrr => 7 };
34484a
+    is ${$h}{ppp}, "pp";
34484a
+    is ${$h}{"rrr"} - 2, 5;
34484a
+    my $ar = [$h];
34484a
+    is $ar->[0]->{ppp}, "pp";
34484a
+    is $ar->[0]->{"rrr"} - 2, 5;
34484a
+    is $ar->[0]{ppp}, "pp";
34484a
+    is $ar->[0]{"rrr"} - 2, 5;
34484a
+    my $hr = {h=>$h};
34484a
+    is $hr->{"h"}->{ppp}, "pp";
34484a
+    is $hr->{"h"}->{"rrr"} - 2, 5;
34484a
+    is $hr->{"h"}{ppp}, "pp";
34484a
+    is $hr->{"h"}{"rrr"} - 2, 5;
34484a
+    my $cr = sub { $h };
34484a
+    is $cr->()->{ppp}, "pp";
34484a
+    is $cr->()->{"rrr"} - 2, 5;
34484a
+    is $cr->(){ppp}, "pp";
34484a
+    is $cr->(){"rrr"} - 2, 5;
34484a
+}
34484a
-- 
34484a
2.13.6
34484a