commit f2814caaf04fc041a028d5ede4fb4db5ee2f19ae (tree)
parent 67caf685056bcdbbe4e696cada927615b0dd6fe9
Author: mlugg <mlugg@mlugg.co.uk>
Date: Tue, 24 Oct 2023 05:16:49 +0100
Sema: don't allow undef values through resolveDefinedValue in typeof block
This logic is not correct in most cases. If any instruction needs to
operate with different semantics within `@TypeOf`, it should be made to
do so explicitly.
This broke a line in `std.mem`: I have opted to fix this in std for now,
since as far as I know it's not yet been discussed which operations (if
any) should be special-cased like this within `@TypeOf`.
Diffstat:
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/lib/std/mem.zig b/lib/std/mem.zig
@@ -3666,7 +3666,13 @@ fn ReverseIterator(comptime T: type) type {
@compileError("expected slice or pointer to array, found '" ++ @typeName(T) ++ "'");
};
const Element = std.meta.Elem(Pointer);
- const ElementPointer = @TypeOf(&@as(Pointer, undefined)[0]);
+ const ElementPointer = @Type(.{ .Pointer = ptr: {
+ var ptr = @typeInfo(Pointer).Pointer;
+ ptr.size = .One;
+ ptr.child = Element;
+ ptr.sentinel = null;
+ break :ptr ptr;
+ } });
return struct {
ptr: Pointer,
index: usize,
diff --git a/src/Sema.zig b/src/Sema.zig
@@ -2104,7 +2104,6 @@ fn resolveDefinedValue(
const mod = sema.mod;
const val = try sema.resolveValue(air_ref) orelse return null;
if (val.isUndef(mod)) {
- if (block.is_typeof) return null;
return sema.failWithUseOfUndef(block, src);
}
return val;