aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaytan Laats <laytanlaats@hotmail.com>2024-08-11 20:59:54 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-08-11 20:59:54 +0200
commitf0840ed24e89e6eb4ca6f87b6d8a3ca1f71a1239 (patch)
tree875fcc98a3e6307d282478f15e0b4e07c64a30d8
parent26fa3aca44a01f83447adb45f0f1e31fcc3d2ae6 (diff)
core/odin: support field tags on bit_field fields
Fixes #4044
-rw-r--r--core/odin/ast/ast.odin1
-rw-r--r--core/odin/parser/parser.odin6
-rw-r--r--tests/core/odin/test_parser.odin21
3 files changed, 25 insertions, 3 deletions
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
+}