mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
fix comptime @ptrCast of pointers to arrays
This commit is contained in:
parent
f7574f44c1
commit
09ec720dab
25
src/ir.cpp
25
src/ir.cpp
@ -18585,12 +18585,27 @@ static IrInstruction *ir_analyze_instruction_elem_ptr(IrAnalyze *ira, IrInstruct
|
||||
case ConstPtrSpecialDiscard:
|
||||
zig_unreachable();
|
||||
case ConstPtrSpecialRef:
|
||||
mem_size = 1;
|
||||
old_size = 1;
|
||||
new_index = index;
|
||||
if (array_ptr_val->data.x_ptr.data.ref.pointee->type->id == ZigTypeIdArray) {
|
||||
ConstExprValue *array_val = array_ptr_val->data.x_ptr.data.ref.pointee;
|
||||
new_index = index;
|
||||
ZigType *array_type = array_val->type;
|
||||
mem_size = array_type->data.array.len;
|
||||
if (array_type->data.array.sentinel != nullptr) {
|
||||
mem_size += 1;
|
||||
}
|
||||
old_size = mem_size;
|
||||
|
||||
out_val->data.x_ptr.special = ConstPtrSpecialRef;
|
||||
out_val->data.x_ptr.data.ref.pointee = array_ptr_val->data.x_ptr.data.ref.pointee;
|
||||
out_val->data.x_ptr.special = ConstPtrSpecialBaseArray;
|
||||
out_val->data.x_ptr.data.base_array.array_val = array_val;
|
||||
out_val->data.x_ptr.data.base_array.elem_index = new_index;
|
||||
} else {
|
||||
mem_size = 1;
|
||||
old_size = 1;
|
||||
new_index = index;
|
||||
|
||||
out_val->data.x_ptr.special = ConstPtrSpecialRef;
|
||||
out_val->data.x_ptr.data.ref.pointee = array_ptr_val->data.x_ptr.data.ref.pointee;
|
||||
}
|
||||
break;
|
||||
case ConstPtrSpecialBaseArray:
|
||||
{
|
||||
|
||||
@ -204,13 +204,12 @@ test "assign null directly to C pointer and test null equality" {
|
||||
test "null terminated pointer" {
|
||||
const S = struct {
|
||||
fn doTheTest() void {
|
||||
var array_with_zero = [_]u8{'h', 'e', 'l', 'l', 'o', 0};
|
||||
var array_with_zero = [_:0]u8{'h', 'e', 'l', 'l', 'o'};
|
||||
var zero_ptr: [*:0]const u8 = @ptrCast([*:0]const u8, &array_with_zero);
|
||||
var no_zero_ptr: [*]const u8 = zero_ptr;
|
||||
expect(std.mem.eql(u8, std.mem.toSliceConst(u8, no_zero_ptr), "hello"));
|
||||
}
|
||||
};
|
||||
S.doTheTest();
|
||||
// TODO test fails at comptime
|
||||
//comptime S.doTheTest();
|
||||
comptime S.doTheTest();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user