summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Cook <tony@develop-help.com>2018-08-28 14:11:10 +1000
committerTony Cook <tony@develop-help.com>2019-01-03 15:22:13 +1100
commit817480137a8b1165315f21d14b8968862101c3a2 (patch)
treee58c6879e89ada90f7d70159a9ac943af80c4f5f
parent91d140d32797985c6160836671a1db4ae003e563 (diff)
downloadperl-817480137a8b1165315f21d14b8968862101c3a2.tar.gz
(perl #132158) abort compilation if we see an error compiling a form
-rw-r--r--t/lib/croak/toke9
-rw-r--r--toke.c9
2 files changed, 18 insertions, 0 deletions
diff --git a/t/lib/croak/toke b/t/lib/croak/toke
index 59c377ba6b..21851229fe 100644
--- a/t/lib/croak/toke
+++ b/t/lib/croak/toke
@@ -493,3 +493,12 @@ sub t1 {}
sub t2 (}
EXPECT
Prototype not terminated at - line 2.
+########
+# NAME [perl #132158] format with syntax errors
+format=
+@
+=h
+=cut
+EXPECT
+syntax error at - line 4, next token ???
+Execution of - aborted due to compilation errors.
diff --git a/toke.c b/toke.c
index 844de04a23..666424ba02 100644
--- a/toke.c
+++ b/toke.c
@@ -5099,6 +5099,14 @@ Perl_yylex(pTHX)
return yylex();
case LEX_FORMLINE:
+ if (PL_parser->sub_error_count != PL_error_count) {
+ /* There was an error parsing a formline, which tends to
+ mess up the parser.
+ Unlike interpolated sub-parsing, we can't treat any of
+ these as recoverable, so no need to check sub_no_recover.
+ */
+ yyquit();
+ }
assert(PL_lex_formbrack);
s = scan_formline(PL_bufptr);
if (!PL_lex_formbrack)
@@ -6518,6 +6526,7 @@ Perl_yylex(pTHX)
SAVEI32(PL_lex_formbrack);
PL_parser->form_lex_state = PL_lex_state;
PL_lex_formbrack = PL_lex_brackets + 1;
+ PL_parser->sub_error_count = PL_error_count;
goto leftbracket;
}
}