diff --git a/base/runtime/core_builtin_soa.odin b/base/runtime/core_builtin_soa.odin index 48c48f305..a2962e1d0 100644 --- a/base/runtime/core_builtin_soa.odin +++ b/base/runtime/core_builtin_soa.odin @@ -437,6 +437,12 @@ _append_soa_elem :: proc(#no_alias array: ^$T/#soa[dynamic]$E, zero_memory: bool err = _reserve_soa(array, cap, zero_memory, loc) // do not 'or_return' here as it could be a partial success } + if size_of(E) == 0 { + footer := raw_soa_footer(array) + footer.len += 1 + return 1, nil + } + if size_of(E) > 0 && cap(array)-len(array) > 0 { footer := raw_soa_footer(array) // Field stores are generated by the compiler's #soa @@ -480,10 +486,14 @@ _append_soa_elems :: proc(#no_alias array: ^$T/#soa[dynamic]$E, zero_memory: boo footer := raw_soa_footer(array) if size_of(E) > 0 && arg_len > 0 { - offset := footer.len FIELD_COUNT :: len(E) when intrinsics.type_is_array(E) else intrinsics.type_struct_field_count(E) // Advance len before the copy, soa_copy_from_slice needs the final len to be set + when FIELD_COUNT != 0 { + offset := footer.len + } + footer.len += arg_len + when FIELD_COUNT == 0 { // do nothing } else when FIELD_COUNT <= 16 && ODIN_OPTIMIZATION_MODE <= .Size {