Commit 09ec720dab
Changed files (2)
src
test
stage1
behavior
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:
{
test/stage1/behavior/pointers.zig
@@ -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();
}