authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-22 21:10:50+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-22 21:10:50+03:00
log423a19fa60d2b0a11fc2fb43b12001320c2c53c5
tree61c673ca1e0066e2a7cc718bec5d1361d022a2b7
parent03b1fbe50d302cdb961661c10bb51699b4dcbaf2

Sema: add error for dereferencing invalid payload ptr at comptime


2 files changed, 43 insertions(+), 2 deletions(-)

src/Sema.zig+10-2
......@@ -22946,8 +22946,13 @@ fn beginComptimePtrLoad(
2294622946 (try sema.coerceInMemoryAllowed(block, tv.ty, payload_ptr.container_ty, false, target, src, src)) == .ok;
2294722947 if (coerce_in_mem_ok) {
2294822948 const payload_val = switch (ptr_val.tag()) {
22949 .eu_payload_ptr => tv.val.castTag(.eu_payload).?.data,
22950 .opt_payload_ptr => if (tv.val.castTag(.opt_payload)) |some| some.data else tv.val,
22949 .eu_payload_ptr => if (tv.val.castTag(.eu_payload)) |some| some.data else {
22950 return sema.fail(block, src, "attempt to unwrap error: {s}", .{tv.val.castTag(.@"error").?.data.name});
22951 },
22952 .opt_payload_ptr => if (tv.val.castTag(.opt_payload)) |some| some.data else opt: {
22953 if (tv.val.isNull()) return sema.fail(block, src, "attempt to use null value", .{});
22954 break :opt tv.val;
22955 },
2295122956 else => unreachable,
2295222957 };
2295322958 tv.* = TypedValue{ .ty = payload_ty, .val = payload_val };
......@@ -22957,6 +22962,9 @@ fn beginComptimePtrLoad(
2295722962 deref.pointee = null;
2295822963 break :blk deref;
2295922964 },
22965 .null_value => {
22966 return sema.fail(block, src, "attempt to use null value", .{});
22967 },
2296022968
2296122969 .zero,
2296222970 .one,
test/cases/compile_errors/dereferencing_invalid_payload_ptr_at_comptime.zig created+33
......@@ -0,0 +1,33 @@
1const std = @import("std");
2
3comptime {
4 var val: u8 = 15;
5 var opt_ptr: ?*const u8 = &val;
6
7 const payload_ptr = &opt_ptr.?;
8 opt_ptr = null;
9 _ = payload_ptr.*.*;
10}
11comptime {
12 var opt: ?u8 = 15;
13
14 const payload_ptr = &opt.?;
15 opt = null;
16 _ = payload_ptr.*;
17}
18comptime {
19 var val: u8 = 15;
20 var err_union: anyerror!u8 = val;
21
22 const payload_ptr = &(err_union catch unreachable);
23 err_union = error.Foo;
24 _ = payload_ptr.*;
25}
26
27// error
28// backend=stage2
29// target=native
30//
31// :9:20: error: attempt to use null value
32// :16:20: error: attempt to use null value
33// :24:20: error: attempt to unwrap error: Foo