From 97ab24bff11cb4fbfd0439de385eb0c1cea71d0e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 9 Jun 2026 16:44:03 +0100 Subject: [PATCH] Attempt to fix `assign_removal_flag_to_semicolon` --- src/parser.cpp | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index ddacef32d..9a683a60a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1905,39 +1905,43 @@ gb_internal Token expect_closing(AstFile *f, TokenKind kind, String const &conte } gb_internal void assign_removal_flag_to_semicolon(AstFile *f) { - Token *prev_token = nullptr; - Token *curr_token = nullptr; + if (!((build_context.command_kind == Command_strip_semicolon) || + (build_context.strict_style || (ast_file_vet_flags(f) & VetFlag_Semicolon)))) { + return; + } + + GB_ASSERT(f->prev_token.kind == Token_Semicolon); + if (f->prev_token.string != ";") { + return; + } + if (f->curr_token.pos.line > f->prev_token.pos.line) { + return; + } + + Token *prev_token; + Token curr_token; if (f->use_cached_tokens) { // NOTE(bill): this is used for rewriting files to strip unneeded semicolons prev_token = &f->cached_tokens.data[f->prev_token_index]; - curr_token = &f->cached_tokens.data[f->curr_token_index]; + curr_token = f->cached_tokens.data[f->curr_token_index]; } else { Token prev_token_ = f->prev_token; - Token curr_token_ = f->curr_token; prev_token = &prev_token_; - curr_token = &curr_token_; + curr_token = f->curr_token; } - GB_ASSERT(prev_token->kind == Token_Semicolon); - if (prev_token->string != ";") { + + if (curr_token.pos.line > prev_token->pos.line) { return; - } - bool ok = false; - if (curr_token->pos.line > prev_token->pos.line) { - ok = true; - } else if (curr_token->pos.line == prev_token->pos.line) { - switch (curr_token->kind) { + } else if (curr_token.pos.line == prev_token->pos.line) { + switch (curr_token.kind) { case Token_CloseBrace: case Token_CloseParen: case Token_EOF: - ok = true; - break; + return; } } - if (!ok) { - return; - } if (build_context.strict_style || (ast_file_vet_flags(f) & VetFlag_Semicolon)) { syntax_error(*prev_token, "Found unneeded semicolon"); @@ -1946,8 +1950,6 @@ gb_internal void assign_removal_flag_to_semicolon(AstFile *f) { } gb_internal void expect_semicolon(AstFile *f) { - Token prev_token = {}; - if (allow_token(f, Token_Semicolon)) { assign_removal_flag_to_semicolon(f); return; @@ -1961,7 +1963,7 @@ gb_internal void expect_semicolon(AstFile *f) { break; } - prev_token = f->prev_token; + Token prev_token = f->prev_token; if (prev_token.kind == Token_Semicolon) { assign_removal_flag_to_semicolon(f); return;