Commit c9858f833c

Andrew Kelley <andrew@ziglang.org>
2022-04-18 15:28:49
stage2: fix building stage3 in release mode
Previously, comptime function calls could cause a crash in the hash function due to a lazy value depending on an unresolved type.
1 parent b75d860
Changed files (2)
src/Module.zig
@@ -205,7 +205,7 @@ pub const MemoizedCall = struct {
 
         // The generic function Decl is guaranteed to be the first dependency
         // of each of its instantiations.
-        std.hash.autoHash(&hasher, @ptrToInt(key.func));
+        std.hash.autoHash(&hasher, key.func);
 
         // This logic must be kept in sync with the logic in `analyzeCall` that
         // computes the hash.
src/Sema.zig
@@ -5012,7 +5012,12 @@ fn analyzeCall(
                             // parameter or return type.
                             return error.GenericPoison;
                         },
-                        else => {},
+                        else => {
+                            // Needed so that lazy values do not trigger
+                            // assertion due to type not being resolved
+                            // when the hash function is called.
+                            try sema.resolveLazyValue(&child_block, arg_src, arg_val);
+                        },
                     }
                     should_memoize = should_memoize and !arg_val.canMutateComptimeVarState();
                     memoized_call_key.args[arg_i] = .{
@@ -5039,7 +5044,12 @@ fn analyzeCall(
                             // parameter or return type.
                             return error.GenericPoison;
                         },
-                        else => {},
+                        else => {
+                            // Needed so that lazy values do not trigger
+                            // assertion due to type not being resolved
+                            // when the hash function is called.
+                            try sema.resolveLazyValue(&child_block, arg_src, arg_val);
+                        },
                     }
                     should_memoize = should_memoize and !arg_val.canMutateComptimeVarState();
                     memoized_call_key.args[arg_i] = .{
@@ -21601,6 +21611,23 @@ pub fn resolveFnTypes(
     }
 }
 
+/// Make it so that calling hash() and eql() on `val` will not assert due
+/// to a type not having its layout resolved.
+fn resolveLazyValue(
+    sema: *Sema,
+    block: *Block,
+    src: LazySrcLoc,
+    val: Value,
+) CompileError!void {
+    switch (val.tag()) {
+        .lazy_align => {
+            const ty = val.castTag(.lazy_align).?.data;
+            return sema.resolveTypeLayout(block, src, ty);
+        },
+        else => return,
+    }
+}
+
 pub fn resolveTypeLayout(
     sema: *Sema,
     block: *Block,