Support for in for FCD arrays

This commit is contained in:
gingerBill
2026-03-16 12:21:41 +00:00
parent 5fa274cb6a
commit e87564b205
2 changed files with 23 additions and 0 deletions

View File

@@ -1846,6 +1846,12 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags)
array_add(&vals, t_int);
break;
case Type_FixedCapacityDynamicArray:
is_possibly_addressable = operand.mode == Addressing_Variable || is_ptr;
array_add(&vals, t->FixedCapacityDynamicArray.elem);
array_add(&vals, t_int);
break;
case Type_DynamicArray:
is_possibly_addressable = true;
array_add(&vals, t->DynamicArray.elem);

View File

@@ -486,6 +486,14 @@ gb_internal void lb_build_range_indexed(lbProcedure *p, lbValue expr, Type *val_
}
break;
}
case Type_FixedCapacityDynamicArray: {
if (val_type != nullptr) {
lbValue data = lb_emit_struct_ep(p, expr, 0);
val = lb_emit_load(p, lb_emit_array_ep(p, data, idx));
}
break;
}
case Type_Slice: {
if (val_type != nullptr) {
lbValue elem = lb_slice_elem(p, expr);
@@ -1365,6 +1373,15 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc
lb_build_range_indexed(p, array, val0_type, count_ptr.addr, &val, &key, &loop, &done, rs->reverse);
break;
}
case Type_FixedCapacityDynamicArray: {
lbValue array = lb_build_addr_ptr(p, expr);
if (is_type_pointer(type_deref(array.type))) {
array = lb_emit_load(p, array);
}
lbValue count_ptr = lb_emit_struct_ep(p, array, 1);
lb_build_range_indexed(p, array, val0_type, count_ptr, &val, &key, &loop, &done, rs->reverse);
break;
}
case Type_DynamicArray: {
lbValue count_ptr = {};
lbValue array = lb_build_addr_ptr(p, expr);