From f2814caaf04fc041a028d5ede4fb4db5ee2f19ae Mon Sep 17 00:00:00 2001 From: mlugg Date: Tue, 24 Oct 2023 05:16:49 +0100 Subject: [PATCH] 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`. --- lib/std/mem.zig | 8 +++++++- src/Sema.zig | 1 - 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/std/mem.zig b/lib/std/mem.zig index a060db710c..dcd8d1fe1d 100644 --- 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 index db54beec09..922ae64861 100644 --- 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;