diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-07-22 21:10:50 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-07-22 21:10:50 +0300 |
| commit | 423a19fa60d2b0a11fc2fb43b12001320c2c53c5 (patch) | |
| tree | 61c673ca1e0066e2a7cc718bec5d1361d022a2b7 /src/Sema.zig | |
| parent | 03b1fbe50d302cdb961661c10bb51699b4dcbaf2 (diff) | |
| download | zig-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.zig | 12 |
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, |
