ir: Various fixes for comptime ptr handling

* Correctly fold ptrToInt on optional types
* Generate null as ConstPtrSpecialNull in intToPtr
* Correctly stop ptrToInt on ?*T where T is zero-sized

Closes #4535
This commit is contained in:
LemonBoy
2020-02-25 13:10:29 +01:00
committed by Andrew Kelley
parent 89812217b4
commit 55ea855e2c
3 changed files with 42 additions and 7 deletions

View File

@@ -3,6 +3,15 @@ const builtin = @import("builtin");
const Target = @import("std").Target;
pub fn addCases(cases: *tests.CompileErrorContext) void {
cases.addTest("@ptrToInt with pointer to zero-sized type",
\\export fn entry() void {
\\ var pointer: ?*u0 = null;
\\ var x = @ptrToInt(pointer);
\\}
, &[_][]const u8{
"tmp.zig:3:23: error: pointer to size 0 type has no address",
});
cases.addTest("slice to pointer conversion mismatch",
\\pub fn bytesAsSlice(bytes: var) [*]align(1) const u16 {
\\ return @ptrCast([*]align(1) const u16, bytes.ptr)[0..1];

View File

@@ -318,3 +318,15 @@ test "pointer arithmetic affects the alignment" {
expect(@typeInfo(@TypeOf(ptr4)).Pointer.alignment == 4);
}
}
test "@ptrToInt on null optional at comptime" {
{
const pointer = @intToPtr(?*u8, 0x000);
const x = @ptrToInt(pointer);
comptime expect(0 == @ptrToInt(pointer));
}
{
const pointer = @intToPtr(?*u8, 0xf00);
comptime expect(0xf00 == @ptrToInt(pointer));
}
}