This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
(perl #134310) don't confuse S_no_op()
authorTony Cook <tony@develop-help.com>
Wed, 31 Jul 2019 01:06:20 +0000 (11:06 +1000)
committerTony Cook <tony@develop-help.com>
Wed, 31 Jul 2019 01:06:20 +0000 (11:06 +1000)
This code could previously set PL_bufptr so it points after the
returned s pointer, which S_no_op() asserts on for the test case.

Since setting PL_bufptr here is useful when producing the error
message, just make sure we restore it.

t/lib/croak/toke
toke.c

index 4ef6f72..3c32f08 100644 (file)
@@ -528,3 +528,15 @@ qq!$x\U@{s{0})(?{!;
 EXPECT
 syntax error at - line 3, near ")("
 Execution of - aborted due to compilation errors.
+########
+# NAME [perl #134310] don't confuse S_no_op() with PL_bufptr after s
+0 0x@
+EXPECT
+Number found where operator expected at - line 1, near "0 0x"
+       (Missing operator before  0x?)
+Array found where operator expected at - line 1, near "0x@
+;"
+       (Missing operator before ;?)
+No digits found for hexadecimal literal at - line 1, near "0 0x@"
+syntax error at - line 1, near "0 0x"
+Execution of - aborted due to compilation errors.
diff --git a/toke.c b/toke.c
index 2f794d6..26de580 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -11342,10 +11342,12 @@ Perl_scan_num(pTHX_ const char *start, YYSTYPE* lvalp)
                    behaviour, like for: "0x.3" and "0x+$foo".
                 */
                 const char *d = s;
+                char *oldbp = PL_bufptr;
                 if (*d) ++d; /* so the user sees the bad non-digit */
                 PL_bufptr = (char *)d; /* so yyerror reports the context */
                 yyerror(Perl_form(aTHX_ "No digits found for %s literal",
                                   shift == 4 ? "hexadecimal" : "binary"));
+                PL_bufptr = oldbp;
             }
 
            if (overflowed) {