Commit f2814caaf0

mlugg <mlugg@mlugg.co.uk>
2023-10-24 06:16:49
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`.
1 parent 67caf68
Changed files (2)
lib
src
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,
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;