@@ -19971,6 +19971,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
19971
19971
buf_write_value_bytes(codegen, (uint8_t*)buf_ptr(&buf), pointee);
19972
19972
if ((err = buf_read_value_bytes(ira, codegen, source_node, (uint8_t*)buf_ptr(&buf), out_val)))
19973
19973
return err;
19974
+ buf_deinit(&buf);
19974
19975
return ErrorNone;
19975
19976
}
19976
19977
@@ -19990,7 +19991,31 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
19990
19991
dst_size, buf_ptr(&pointee->type->name), src_size));
19991
19992
return ErrorSemanticAnalyzeFail;
19992
19993
}
19993
- case ConstPtrSpecialSubArray:
19994
+ case ConstPtrSpecialSubArray: {
19995
+ ZigValue *array_val = ptr_val->data.x_ptr.data.base_array.array_val;
19996
+ assert(array_val->type->id == ZigTypeIdArray);
19997
+ if (array_val->data.x_array.special != ConstArraySpecialNone)
19998
+ zig_panic("TODO");
19999
+ if (dst_size > src_size) {
20000
+ size_t elem_index = ptr_val->data.x_ptr.data.base_array.elem_index;
20001
+ opt_ir_add_error_node(ira, codegen, source_node,
20002
+ buf_sprintf("attempt to read %" ZIG_PRI_usize " bytes from %s at index %" ZIG_PRI_usize " which is %" ZIG_PRI_usize " bytes",
20003
+ dst_size, buf_ptr(&array_val->type->name), elem_index, src_size));
20004
+ return ErrorSemanticAnalyzeFail;
20005
+ }
20006
+ size_t elem_size = src_size;
20007
+ size_t elem_count = (dst_size % elem_size == 0) ? (dst_size / elem_size) : (dst_size / elem_size + 1);
20008
+ Buf buf = BUF_INIT;
20009
+ buf_resize(&buf, elem_count * elem_size);
20010
+ for (size_t i = 0; i < elem_count; i += 1) {
20011
+ ZigValue *elem_val = &array_val->data.x_array.data.s_none.elements[i];
20012
+ buf_write_value_bytes(codegen, (uint8_t*)buf_ptr(&buf) + (i * elem_size), elem_val);
20013
+ }
20014
+ if ((err = buf_read_value_bytes(ira, codegen, source_node, (uint8_t*)buf_ptr(&buf), out_val)))
20015
+ return err;
20016
+ buf_deinit(&buf);
20017
+ return ErrorNone;
20018
+ }
19994
20019
case ConstPtrSpecialBaseArray: {
19995
20020
ZigValue *array_val = ptr_val->data.x_ptr.data.base_array.array_val;
19996
20021
assert(array_val->type->id == ZigTypeIdArray);
@@ -20014,6 +20039,7 @@ static Error ir_read_const_ptr(IrAnalyze *ira, CodeGen *codegen, AstNode *source
20014
20039
}
20015
20040
if ((err = buf_read_value_bytes(ira, codegen, source_node, (uint8_t*)buf_ptr(&buf), out_val)))
20016
20041
return err;
20042
+ buf_deinit(&buf);
20017
20043
return ErrorNone;
20018
20044
}
20019
20045
case ConstPtrSpecialBaseStruct:
0 commit comments