Prevent assertion failure with ‘no a a 3’
authorFather Chrysostomos <sprout@cpan.org>
Fri, 14 Sep 2012 13:20:34 +0000 (06:20 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 15 Sep 2012 05:29:45 +0000 (22:29 -0700)
This particular syntax error, whittled down from ‘no if $] >= 5.17.4
warnings => "deprecated"’ (which contains a type), causes the parser
to try to free an op from the new sub (for the BEGIN block) after
freeing the new sub.

This happens on line 526 of perly.c.  It should not be necessary for
the parser to free the op at this point, since after an error any ops
owned by incomplete subs’ slabs will be freed.

I’m leaving the other three instances of op_free in perly.c in place,
at least for now, since there are cases where the forced token stack
prevents ops from being freed when their subs are.

perly.c
t/comp/parser.t

diff --git a/perly.c b/perly.c
index 5fb2d72..c83a932 100644 (file)
--- a/perly.c
+++ b/perly.c
@@ -522,8 +522,6 @@ Perl_yyparse (pTHX_ int gramtype)
        }
 
        YYDSYMPRINTF ("Error: discarding", yytoken, &parser->yylval);
-       if (yy_type_tab[yytoken] == toketype_opval)
-           op_free(parser->yylval.opval);
        parser->yychar = YYEMPTY;
 
     }
index 27f81dc..a5ba93c 100644 (file)
@@ -3,7 +3,7 @@
 # Checks if the parser behaves correctly in edge cases
 # (including weird syntax errors)
 
-print "1..152\n";
+print "1..153\n";
 
 sub failed {
     my ($got, $expected, $name) = @_;
@@ -443,6 +443,10 @@ is prototype "Hello::_he_said", '_', 'initial tick in sub declaration';
        'literal -> [0] after an array subscript within ""');
 }
 
+eval 'no if $] >= 5.17.4 warnings => "deprecated"';
+is 1,1, ' no crash for "no ... syntax error"';
+
+
 # Add new tests HERE (above this line)
 
 # bug #74022: Loop on characters in \p{OtherIDContinue}