mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-29 17:34:34 +00:00
Fix #1610
This commit is contained in:
@@ -1577,7 +1577,7 @@ void assign_removal_flag_to_semicolon(AstFile *f) {
|
||||
}
|
||||
}
|
||||
|
||||
void expect_semicolon(AstFile *f, Ast *s) {
|
||||
void expect_semicolon(AstFile *f) {
|
||||
Token prev_token = {};
|
||||
|
||||
if (allow_token(f, Token_Semicolon)) {
|
||||
@@ -1602,17 +1602,17 @@ void expect_semicolon(AstFile *f, Ast *s) {
|
||||
if (f->curr_token.kind == Token_EOF) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (s != nullptr) {
|
||||
return;
|
||||
}
|
||||
switch (f->curr_token.kind) {
|
||||
case Token_EOF:
|
||||
return;
|
||||
}
|
||||
String p = token_to_string(f->curr_token);
|
||||
syntax_error(prev_token, "Expected ';', got %.*s", LIT(p));
|
||||
fix_advance_to_next_stmt(f);
|
||||
|
||||
if (f->curr_token.pos.line == f->prev_token.pos.line) {
|
||||
String p = token_to_string(f->curr_token);
|
||||
prev_token.pos = token_pos_end(prev_token);
|
||||
syntax_error(prev_token, "Expected ';', got %.*s", LIT(p));
|
||||
fix_advance_to_next_stmt(f);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3181,7 +3181,7 @@ Ast *parse_foreign_block(AstFile *f, Token token) {
|
||||
Ast *body = ast_block_stmt(f, decls, open, close);
|
||||
|
||||
Ast *decl = ast_foreign_block_decl(f, token, foreign_library, body, docs);
|
||||
expect_semicolon(f, decl);
|
||||
expect_semicolon(f);
|
||||
return decl;
|
||||
}
|
||||
|
||||
@@ -3227,15 +3227,11 @@ Ast *parse_value_decl(AstFile *f, Array<Ast *> names, CommentGroup *docs) {
|
||||
}
|
||||
|
||||
if (f->expr_level >= 0) {
|
||||
Ast *end = nullptr;
|
||||
if (!is_mutable && values.count > 0) {
|
||||
end = values[values.count-1];
|
||||
}
|
||||
if (f->curr_token.kind == Token_CloseBrace &&
|
||||
f->curr_token.pos.line == f->prev_token.pos.line) {
|
||||
|
||||
} else {
|
||||
expect_semicolon(f, end);
|
||||
expect_semicolon(f);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4143,11 +4139,7 @@ Ast *parse_return_stmt(AstFile *f) {
|
||||
advance_token(f);
|
||||
}
|
||||
|
||||
Ast *end = nullptr;
|
||||
if (results.count > 0) {
|
||||
end = results[results.count-1];
|
||||
}
|
||||
expect_semicolon(f, end);
|
||||
expect_semicolon(f);
|
||||
return ast_return_stmt(f, token, results);
|
||||
}
|
||||
|
||||
@@ -4398,7 +4390,7 @@ Ast *parse_import_decl(AstFile *f, ImportDeclKind kind) {
|
||||
syntax_error(import_name, "'using import' is not allowed, please use the import name explicitly");
|
||||
}
|
||||
|
||||
expect_semicolon(f, s);
|
||||
expect_semicolon(f);
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -4456,7 +4448,7 @@ Ast *parse_foreign_decl(AstFile *f) {
|
||||
} else {
|
||||
s = ast_foreign_import_decl(f, token, filepaths, lib_name, docs, f->line_comment);
|
||||
}
|
||||
expect_semicolon(f, s);
|
||||
expect_semicolon(f);
|
||||
return s;
|
||||
}
|
||||
}
|
||||
@@ -4595,7 +4587,7 @@ Ast *parse_stmt(AstFile *f) {
|
||||
case Token_Not:
|
||||
case Token_And:
|
||||
s = parse_simple_stmt(f, StmtAllowFlag_Label);
|
||||
expect_semicolon(f, s);
|
||||
expect_semicolon(f);
|
||||
return s;
|
||||
|
||||
|
||||
@@ -4623,7 +4615,7 @@ Ast *parse_stmt(AstFile *f) {
|
||||
label = parse_ident(f);
|
||||
}
|
||||
s = ast_branch_stmt(f, token, label);
|
||||
expect_semicolon(f, s);
|
||||
expect_semicolon(f);
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -4638,12 +4630,12 @@ Ast *parse_stmt(AstFile *f) {
|
||||
Array<Ast *> list = parse_lhs_expr_list(f);
|
||||
if (list.count == 0) {
|
||||
syntax_error(token, "Illegal use of 'using' statement");
|
||||
expect_semicolon(f, nullptr);
|
||||
expect_semicolon(f);
|
||||
return ast_bad_stmt(f, token, f->curr_token);
|
||||
}
|
||||
|
||||
if (f->curr_token.kind != Token_Colon) {
|
||||
expect_semicolon(f, list[list.count-1]);
|
||||
expect_semicolon(f);
|
||||
return ast_using_stmt(f, token, list);
|
||||
}
|
||||
expect_token_after(f, Token_Colon, "identifier list");
|
||||
@@ -4700,13 +4692,13 @@ Ast *parse_stmt(AstFile *f) {
|
||||
} else if (tag == "assert" || tag == "panic") {
|
||||
Ast *t = ast_basic_directive(f, hash_token, name);
|
||||
Ast *stmt = ast_expr_stmt(f, parse_call_expr(f, t));
|
||||
expect_semicolon(f, stmt);
|
||||
expect_semicolon(f);
|
||||
return stmt;
|
||||
} else if (name.string == "force_inline" ||
|
||||
name.string == "force_no_inline") {
|
||||
Ast *expr = parse_force_inlining_operand(f, name);
|
||||
Ast *stmt = ast_expr_stmt(f, expr);
|
||||
expect_semicolon(f, stmt);
|
||||
expect_semicolon(f);
|
||||
return stmt;
|
||||
} else if (tag == "unroll") {
|
||||
return parse_unrolled_for_loop(f, name);
|
||||
@@ -4728,7 +4720,7 @@ Ast *parse_stmt(AstFile *f) {
|
||||
|
||||
case Token_Semicolon:
|
||||
s = ast_empty_stmt(f, token);
|
||||
expect_semicolon(f, nullptr);
|
||||
expect_semicolon(f);
|
||||
return s;
|
||||
}
|
||||
|
||||
@@ -5586,7 +5578,7 @@ bool parse_file(Parser *p, AstFile *f) {
|
||||
}
|
||||
|
||||
Ast *pd = ast_package_decl(f, f->package_token, package_name, docs, f->line_comment);
|
||||
expect_semicolon(f, pd);
|
||||
expect_semicolon(f);
|
||||
f->pkg_decl = pd;
|
||||
|
||||
if (f->error_count == 0) {
|
||||
|
||||
Reference in New Issue
Block a user