diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 5e681728d..319c05836 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -381,6 +381,9 @@ advance_token :: proc(p: ^Parser) -> tokenizer.Token { #partial switch p.curr_tok.kind { case .Comment: consume_comment_groups(p, prev) + if p.curr_tok.kind == .Semicolon && p.expr_level > 0 && p.curr_tok.text == "\n" { + advance_token(p) + } case .Semicolon: if p.expr_level > 0 && p.curr_tok.text == "\n" { advance_token(p) diff --git a/src/parser.cpp b/src/parser.cpp index 03e9073ca..c4dc2c0bc 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1529,6 +1529,9 @@ gb_internal Token advance_token(AstFile *f) { switch (f->curr_token.kind) { case Token_Comment: consume_comment_groups(f, prev); + if (f->curr_token.kind == Token_Semicolon && ignore_newlines(f) && f->curr_token.string == "\n") { + advance_token(f); + } break; case Token_Semicolon: if (ignore_newlines(f) && f->curr_token.string == "\n") { diff --git a/tests/core/odin/test_parser.odin b/tests/core/odin/test_parser.odin index 3fb15d893..4a1fdbfb4 100644 --- a/tests/core/odin/test_parser.odin +++ b/tests/core/odin/test_parser.odin @@ -131,3 +131,41 @@ my_func :: proc (cond: bool, a: string, b: string) -> string { testing.expect(t, ok, "bad parse") testing.expect(t, file.syntax_error_count == 0, "should contain zero errors") } + + +@test +test_parse_multiline_ternary_with_comment :: proc(t: ^testing.T) { + context.allocator = context.temp_allocator + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + file := ast.File{ + fullpath = "test.odin", + src = ` + package main + + my_func :: proc (cond: bool, a: string, b: string) -> string { + out := ( + cond + ? a // This is a comment! + : b + ) + return out + } + `, + } + + p := parser.default_parser() + + p.err = proc(pos: tokenizer.Pos, format: string, args: ..any) { + message := fmt.tprintf(format, ..args) + log.errorf("%s(%d:%d): %s", pos.file, pos.line, pos.column, message) + } + + p.warn = proc(pos: tokenizer.Pos, format: string, args: ..any) { + message := fmt.tprintf(format, ..args) + log.warnf("%s(%d:%d): %s", pos.file, pos.line, pos.column, message) + } + + ok := parser.parse_file(&p, &file) + testing.expect(t, ok, "bad parse") + testing.expect(t, file.syntax_error_count == 0, "should contain zero errors") +}