stage2: comptime slice of pointer to hardcoded address

This commit is contained in:
Robin Voetter 2021-10-24 20:37:09 +02:00
parent 0942bf73c9
commit 7062c8a886
3 changed files with 19 additions and 1 deletions

View File

@ -8001,7 +8001,12 @@ fn analyzePtrArithmetic(
const offset_int = offset_val.toUnsignedInt();
if (ptr_val.getUnsignedInt()) |addr| {
const target = sema.mod.getTarget();
const elem_ty = ptr_ty.childType();
const ptr_child_ty = ptr_ty.childType();
const elem_ty = if (ptr_ty.isSinglePointer() and ptr_child_ty.zigTypeTag() == .Array)
ptr_child_ty.childType()
else
ptr_child_ty;
const elem_size = elem_ty.abiSize(target);
const new_addr = switch (air_tag) {
.ptr_add => addr + elem_size * offset_int,

View File

@ -65,6 +65,7 @@ test {
if (builtin.zig_is_stage2) {
// When all comptime_memory.zig tests pass, #9646 can be closed.
// _ = @import("behavior/comptime_memory.zig");
_ = @import("behavior/slice_stage2.zig");
} else {
_ = @import("behavior/align_stage1.zig");
_ = @import("behavior/alignof.zig");

View File

@ -0,0 +1,12 @@
const std = @import("std");
const expect = std.testing.expect;
const x = @intToPtr([*]i32, 0x1000)[0..0x500];
const y = x[0x100..];
test "compile time slice of pointer to hard coded address" {
try expect(@ptrToInt(x) == 0x1000);
try expect(x.len == 0x500);
try expect(@ptrToInt(y) == 0x1400);
try expect(y.len == 0x400);
}