This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix eval 'q;;'
authorFather Chrysostomos <sprout@cpan.org>
Tue, 28 Aug 2012 01:26:11 +0000 (18:26 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 28 Aug 2012 06:24:03 +0000 (23:24 -0700)
The parser expects a semicolon at the end of every statement, so the
lexer provides one.  It was not doing so for evals ending with a
semicolon, even if that semicolon was not a statement-terminating
semicolon.

t/base/lex.t
toke.c

index 75529d8..4c4981d 100644 (file)
@@ -1,6 +1,6 @@
 #!./perl
 
-print "1..65\n";
+print "1..66\n";
 
 $x = 'x';
 
@@ -323,3 +323,6 @@ eval '/(?{print <<END
 ok 65 - here-doc in re-eval in string eval
 END
 })/';
+
+eval 'print qq ;ok 66 - eval ending with semicolon\n;'
+  or print "not ok 66 - eval ending with semicolon\n";
diff --git a/toke.c b/toke.c
index 456aea2..98d6e34 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -758,8 +758,7 @@ Perl_lex_start(pTHX_ SV *line, PerlIO *rsfp, U32 flags)
        parser->linestr = flags & LEX_START_COPIED
                            ? SvREFCNT_inc_simple_NN(line)
                            : newSVpvn_flags(s, len, SvUTF8(line));
-       if (!len || s[len-1] != ';')
-           sv_catpvs(parser->linestr, "\n;");
+       sv_catpvs(parser->linestr, "\n;");
     } else {
        parser->linestr = newSVpvs("\n;");
     }