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