aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-07-22 21:10:50 +0300
committerVeikka Tuominen <git@vexu.eu>2022-07-22 21:10:50 +0300
commit423a19fa60d2b0a11fc2fb43b12001320c2c53c5 (patch)
tree61c673ca1e0066e2a7cc718bec5d1361d022a2b7 /src/Sema.zig
parent03b1fbe50d302cdb961661c10bb51699b4dcbaf2 (diff)
downloadzig-423a19fa60d2b0a11fc2fb43b12001320c2c53c5.tar.gz
zig-423a19fa60d2b0a11fc2fb43b12001320c2c53c5.zip
Sema: add error for dereferencing invalid payload ptr at comptime
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 76b5dcb8c0..8023e60c7d 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -22946,8 +22946,13 @@ fn beginComptimePtrLoad(
(try sema.coerceInMemoryAllowed(block, tv.ty, payload_ptr.container_ty, false, target, src, src)) == .ok;
if (coerce_in_mem_ok) {
const payload_val = switch (ptr_val.tag()) {
- .eu_payload_ptr => tv.val.castTag(.eu_payload).?.data,
- .opt_payload_ptr => if (tv.val.castTag(.opt_payload)) |some| some.data else tv.val,
+ .eu_payload_ptr => if (tv.val.castTag(.eu_payload)) |some| some.data else {
+ return sema.fail(block, src, "attempt to unwrap error: {s}", .{tv.val.castTag(.@"error").?.data.name});
+ },
+ .opt_payload_ptr => if (tv.val.castTag(.opt_payload)) |some| some.data else opt: {
+ if (tv.val.isNull()) return sema.fail(block, src, "attempt to use null value", .{});
+ break :opt tv.val;
+ },
else => unreachable,
};
tv.* = TypedValue{ .ty = payload_ty, .val = payload_val };
@@ -22957,6 +22962,9 @@ fn beginComptimePtrLoad(
deref.pointee = null;
break :blk deref;
},
+ .null_value => {
+ return sema.fail(block, src, "attempt to use null value", .{});
+ },
.zero,
.one,