From 0218af7e36eefe0ae056d227470819a8622032e2 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Tue, 13 Oct 2026 11:49:54 +0200 Subject: [PATCH] Allow empty statements (semicolons) anywhere. v3.0 backport. Reported by Volodymyr Chernetskyi. #1519 --- doc/extensions.html | 4 ++-- src/lj_parse.c | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/doc/extensions.html b/doc/extensions.html index 73edf11f..687e0c7e 100644 --- a/doc/extensions.html +++ b/doc/extensions.html @@ -370,8 +370,7 @@ Other features are only enabled, if LuaJIT is built with

Not backported are: diff --git a/src/lj_parse.c b/src/lj_parse.c index 00a64382..297f1cd2 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c @@ -2740,13 +2740,13 @@ static void parse_label(LexState *ls) lj_lex_error(ls, 0, LJ_ERR_XLDUP, strdata(name)); idx = gola_new(ls, name, VSTACK_LABEL, fs->pc); lex_check(ls, TK_label); - /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */ + /* Recursively parse trailing statements: labels and ';'. */ for (;;) { if (ls->tok == TK_label) { synlevel_begin(ls); parse_label(ls); synlevel_end(ls); - } else if (LJ_52 && ls->tok == ';') { + } else if (ls->tok == ';') { lj_lex_next(ls); } else { break; @@ -3033,16 +3033,17 @@ static int parse_stmt(LexState *ls) lj_lex_next(ls); parse_break(ls); return !LJ_52; /* Must be last in Lua 5.1. */ - case TK_continue: - if (!parse_isend(lj_lex_lookahead(ls))) goto assign; /* Soft keyword. */ + case TK_continue: { + LexToken tokx = lj_lex_lookahead(ls); + if (!(parse_isend(tokx) || tokx == ';')) + goto assign; /* Soft keyword. */ lj_lex_next(ls); parse_continue(ls); return 1; /* Must be last. */ -#if LJ_52 + } case ';': lj_lex_next(ls); break; -#endif case TK_label: parse_label(ls); break; @@ -3068,7 +3069,7 @@ static void parse_chunk(LexState *ls) synlevel_begin(ls); while (!islast && !parse_isend(ls->tok)) { islast = parse_stmt(ls); - lex_opt(ls, ';'); + while (ls->tok == ';') lj_lex_next(ls); lj_assertLS(ls->fs->framesize >= ls->fs->freereg && ls->fs->freereg >= ls->fs->nactvar, "bad regalloc");