zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit b0e8bf15f5017cf101eb31f74dd264eaf136045f (tree)
parent 71e2a56e3ef7aba10cc0648aab786973cf8416bc
Author: Veikka Tuominen <git@vexu.eu>
Date:   Wed, 25 May 2022 17:39:55 +0300

Sema: add error for dereferencing comptime value at runtime

Diffstat:
Msrc/Sema.zig | 3+++
Atest/cases/compile_errors/dereference_anyopaque.zig | 50++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -20961,6 +20961,9 @@ fn analyzeLoad( } } + const valid_rt = try sema.validateRunTimeType(block, src, elem_ty, false); + if (!valid_rt) return sema.failWithNeededComptime(block, src); + try sema.requireRuntimeBlock(block, src); return block.addTyOp(.load, elem_ty, ptr); } diff --git a/test/cases/compile_errors/dereference_anyopaque.zig b/test/cases/compile_errors/dereference_anyopaque.zig @@ -0,0 +1,50 @@ +const std = @import("std"); + +const Error = error{Something}; + +fn next() Error!void { + return; +} + +fn parse(comptime T: type, allocator: std.mem.Allocator) !void { + parseFree(T, undefined, allocator); + _ = (try next()) != null; +} + +fn parseFree(comptime T: type, value: T, allocator: std.mem.Allocator) void { + switch (@typeInfo(T)) { + .Struct => |structInfo| { + inline for (structInfo.fields) |field| { + if (!field.is_comptime) + parseFree(field.field_type, undefined, allocator); + } + }, + .Pointer => |ptrInfo| { + switch (ptrInfo.size) { + .One => { + parseFree(ptrInfo.child, value.*, allocator); + }, + .Slice => { + for (value) |v| + parseFree(ptrInfo.child, v, allocator); + }, + else => unreachable, + } + }, + else => unreachable, + } +} + +pub export fn entry() void { + const allocator = std.testing.allocator_instance.allocator(); + _ = parse(std.StringArrayHashMap(bool), allocator) catch return; +} + +// error +// backend=llvm +// +// :11:22: error: comparison of 'void' with null +// :25:51: error: unable to resolve comptime value +// :25:51: error: unable to resolve comptime value +// :25:51: error: unable to resolve comptime value +// :25:51: error: unable to resolve comptime value