diff --git a/core/odin/ast/ast.odin b/core/odin/ast/ast.odin index 31e8fdd53..075a669de 100644 --- a/core/odin/ast/ast.odin +++ b/core/odin/ast/ast.odin @@ -861,6 +861,7 @@ Bit_Field_Field :: struct { name: ^Expr, type: ^Expr, bit_size: ^Expr, + tag: tokenizer.Token, comments: ^Comment_Group, } diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 7c0fe2e98..991b05398 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2832,11 +2832,17 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { expect_token(p, .Or) bit_size := parse_expr(p, true) + tag: tokenizer.Token + if p.curr_tok.kind == .String { + tag = expect_token(p, .String) + } + field := ast.new(ast.Bit_Field_Field, name.pos, bit_size) field.name = name field.type = type field.bit_size = bit_size + field.tag = tag append(&fields, field) diff --git a/tests/core/odin/test_parser.odin b/tests/core/odin/test_parser.odin index 772ae5982..b4310104f 100644 --- a/tests/core/odin/test_parser.odin +++ b/tests/core/odin/test_parser.odin @@ -1,8 +1,12 @@ package test_core_odin_parser +import "base:runtime" + +import "core:fmt" +import "core:log" import "core:odin/ast" import "core:odin/parser" -import "base:runtime" +import "core:odin/tokenizer" import "core:testing" @test @@ -34,7 +38,7 @@ Foo :: bit_field uint {} Foo :: bit_field uint {hello: bool | 1} Foo :: bit_field uint { - hello: bool | 1, + hello: bool | 1 ` + "`fmt:\"-\"`" + `, hello: bool | 5, } @@ -48,6 +52,17 @@ Foo :: bit_field uint { } 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") -} \ No newline at end of file +}