[perl #123737] Fix assertion failure with 0$#{ blead
authorDavid Mitchell <davem@iabyn.com>
Sat, 25 Apr 2015 16:07:03 +0000 (17:07 +0100)
committerDavid Mitchell <davem@iabyn.com>
Sat, 25 Apr 2015 16:07:03 +0000 (17:07 +0100)
This is a follow-up to FC's 488bc579589, which stopped assertion
failures on parsing 0${. A similar code path still failed with
0$#{.

The fix is similar to the previous fix, although I suspect a more general
fix is needed - perhaps moving the fixes into S_no_op() - but not this
close to the 5.22 release.

t/lib/croak/toke
toke.c

index a5e02af..a061ac8 100644 (file)
@@ -28,6 +28,15 @@ syntax error at - line 1, near "0$"
 Missing right curly or square bracket at - line 1, at end of line
 Execution of - aborted due to compilation errors.
 ########
+# NAME (Missing operator before $#{?) [perl #123737]
+0$#{
+EXPECT
+Array length found where operator expected at - line 1, near "0$#{"
+       (Missing operator before $#{?)
+syntax error at - line 1, near "0$#"
+Missing right curly or square bracket at - line 1, at end of line
+Execution of - aborted due to compilation errors.
+########
 # NAME Unterminated here-doc in string eval
 eval "<<foo"; die $@
 EXPECT
diff --git a/toke.c b/toke.c
index 294cb8f..4962521 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -6011,8 +6011,14 @@ Perl_yylex(pTHX)
            PL_tokenbuf[0] = '@';
            s = scan_ident(s + 1, PL_tokenbuf + 1,
                           sizeof PL_tokenbuf - 1, FALSE);
-           if (PL_expect == XOPERATOR)
-               no_op("Array length", s);
+            if (PL_expect == XOPERATOR) {
+                d = s;
+                if (PL_bufptr > s) {
+                    d = PL_bufptr-1;
+                    PL_bufptr = PL_oldbufptr;
+                }
+               no_op("Array length", d);
+            }
            if (!PL_tokenbuf[1])
                PREREF(DOLSHARP);
            PL_expect = XOPERATOR;