mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-13 22:03:42 +00:00
Support for in for FCD arrays
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user