mirror of
https://github.com/ziglang/zig.git
synced 2024-11-17 01:23:54 +00:00
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.
This commit is contained in:
parent
b75d86027d
commit
c9858f833c
@ -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.
|
||||
|
31
src/Sema.zig
31
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,
|
||||
|
Loading…
Reference in New Issue
Block a user