aboutsummaryrefslogtreecommitdiff
path: root/test/behavior/ptrfromint.zig
diff options
context:
space:
mode:
authorEric Joldasov <bratishkaerik@getgoogleoff.me>2023-06-15 13:14:16 +0600
committerAndrew Kelley <andrew@ziglang.org>2023-06-19 12:34:42 -0700
commit50339f595aa6ec96760b1cd9f8d0e0bfc3f167fc (patch)
tree9e2b95d8e111e905e00511962dfd32c8e5bb3245 /test/behavior/ptrfromint.zig
parenta6c8ee5231230947c928bbe1c6a39eb6e1bb9c5b (diff)
downloadzig-50339f595aa6ec96760b1cd9f8d0e0bfc3f167fc.tar.gz
zig-50339f595aa6ec96760b1cd9f8d0e0bfc3f167fc.zip
all: zig fmt and rename "@XToY" to "@YFromX"
Signed-off-by: Eric Joldasov <bratishkaerik@getgoogleoff.me>
Diffstat (limited to 'test/behavior/ptrfromint.zig')
-rw-r--r--test/behavior/ptrfromint.zig48
1 files changed, 48 insertions, 0 deletions
diff --git a/test/behavior/ptrfromint.zig b/test/behavior/ptrfromint.zig
new file mode 100644
index 0000000000..c07a6df834
--- /dev/null
+++ b/test/behavior/ptrfromint.zig
@@ -0,0 +1,48 @@
+const std = @import("std");
+const builtin = @import("builtin");
+const expectEqual = std.testing.expectEqual;
+
+test "casting integer address to function pointer" {
+ addressToFunction();
+ comptime addressToFunction();
+}
+
+fn addressToFunction() void {
+ var addr: usize = 0xdeadbee0;
+ _ = @ptrFromInt(*const fn () void, addr);
+}
+
+test "mutate through ptr initialized with constant ptrFromInt value" {
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+
+ forceCompilerAnalyzeBranchHardCodedPtrDereference(false);
+}
+
+fn forceCompilerAnalyzeBranchHardCodedPtrDereference(x: bool) void {
+ const hardCodedP = @ptrFromInt(*volatile u8, 0xdeadbeef);
+ if (x) {
+ hardCodedP.* = hardCodedP.* | 10;
+ } else {
+ return;
+ }
+}
+
+test "@ptrFromInt creates null pointer" {
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+
+ const ptr = @ptrFromInt(?*u32, 0);
+ try expectEqual(@as(?*u32, null), ptr);
+}
+
+test "@ptrFromInt creates allowzero zero pointer" {
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
+ if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
+
+ const ptr = @ptrFromInt(*allowzero u32, 0);
+ try expectEqual(@as(usize, 0), @intFromPtr(ptr));
+}