From 297f2e3078700e1b34930c2b0adc6488ca356b93 Mon Sep 17 00:00:00 2001 From: hl-valdemar Date: Mon, 20 Jul 2026 16:14:34 +0200 Subject: [PATCH] struct field declared type inference --- compiler/checker/checker.odin | 5 ++++- examples/programs/arraylist/main.bro | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/compiler/checker/checker.odin b/compiler/checker/checker.odin index dfac274..4b01df0 100644 --- a/compiler/checker/checker.odin +++ b/compiler/checker/checker.odin @@ -4744,12 +4744,15 @@ infer_compound_expr :: proc( if ok && item_ok { initialized[slot-int(item.field_start)] = true } - if !ok || !is_inferred_record_field(checker, slot) { + if !ok { _ = infer_nested_expr(checker, keyed_expr.left, locals, pkg, file, demanded, local_types) continue } field_expected := field.type if is_runtime_type(checker, field.type) else types.INVALID actual := infer_nested_expr(checker, keyed_expr.left, locals, pkg, file, demanded, local_types, field_expected) + if !is_inferred_record_field(checker, slot) { + continue + } _ = record_field_expr_candidate(checker, slot, keyed_expr.left, actual, locals, pkg, file) if is_runtime_type(checker, checker.module.types.fields[slot].type) { _ = record_demand( diff --git a/examples/programs/arraylist/main.bro b/examples/programs/arraylist/main.bro index a46f325..38aa22d 100644 --- a/examples/programs/arraylist/main.bro +++ b/examples/programs/arraylist/main.bro @@ -12,6 +12,13 @@ State :: struct { arrlist_test std.ArrayList(Token) = arraylist.init(mem.c_allocator) +init func(allocator mem.Allocator) State { + return State { + tokens = arraylist.init(allocator), + diagnostics = arraylist.init(allocator), + } +} + hide fail_alloc func(_ ?@mut anyopaque, _ usize, _ usize) ?*mut u8 { return none } @@ -34,6 +41,9 @@ hide fail_allocator mem.Allocator :: mem.Allocator { } run func() i32 ! mem.AllocError { + state State :: init(mem.c_allocator) + _ = state + values std.ArrayList(i32) = arraylist.init(mem.c_allocator) defer arraylist.deinit(&values) if (values.items.len != 0 or values.capacity != 0) return 1