Commit ad168db727

Bogdan Romanyuk <65823030+wrongnull@users.noreply.github.com>
2023-10-17 22:05:55
Sema: disallow `@intFromPtr` for comptime-only types
1 parent 5c8912d
Changed files (3)
src
test
behavior
cases
src/Sema.zig
@@ -9891,6 +9891,17 @@ fn zirIntFromPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!
     if (!ptr_ty.isPtrAtRuntime(mod)) {
         return sema.fail(block, ptr_src, "expected pointer, found '{}'", .{ptr_ty.fmt(mod)});
     }
+    const pointee_ty = ptr_ty.childType(mod);
+    if (try sema.typeRequiresComptime(ptr_ty)) {
+        const msg = msg: {
+            const msg = try sema.errMsg(block, ptr_src, "comptime-only type '{}' has no pointer address", .{pointee_ty.fmt(mod)});
+            errdefer msg.destroy(sema.gpa);
+            const src_decl = mod.declPtr(block.src_decl);
+            try sema.explainWhyTypeIsComptime(msg, ptr_src.toSrcLoc(src_decl, mod), pointee_ty);
+            break :msg msg;
+        };
+        return sema.failWithOwnedErrorMsg(block, msg);
+    }
     if (try sema.resolveMaybeUndefValIntable(operand)) |operand_val| ct: {
         if (!is_vector) {
             return Air.internedToRef((try mod.intValue(
test/behavior/pointers.zig
@@ -499,22 +499,6 @@ test "ptrCast comptime known slice to C pointer" {
     try std.testing.expectEqualStrings(s, std.mem.sliceTo(p, 0));
 }
 
-test "intFromPtr on a generic function" {
-    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
-    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
-    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
-
-    const S = struct {
-        fn generic(i: anytype) @TypeOf(i) {
-            return i;
-        }
-        fn doTheTest(a: anytype) !void {
-            try expect(@intFromPtr(a) != 0);
-        }
-    };
-    try S.doTheTest(&S.generic);
-}
-
 test "pointer alignment and element type include call expression" {
     const S = struct {
         fn T() type {
test/cases/compile_errors/@intFromPtr_with_bad_type.zig
@@ -0,0 +1,11 @@
+const x = 42;
+const y = @intFromPtr(&x);
+pub export fn entry() void {
+    _ = y;
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :2:23: error: comptime-only type 'comptime_int' has no pointer address