commit cbed6bb08555222008e87cfb071adeed97b3f8a4 (tree)
parent 42755a1944f4c4a60fc7e5e66cf76e9cbdf1ce84
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date: Thu, 3 Nov 2022 02:42:18 -0400
Sema: make `InferredErrorSet` deterministic
Empirically, this `AutoHashMapUnmanaged` -> `AutoArrayHashMapUnmanaged`
change fixes all non-determinism in `ReleaseFast` build artifacts.
Closes #12183
Diffstat:
2 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/src/Module.zig b/src/Module.zig
@@ -1578,7 +1578,7 @@ pub const Fn = struct {
errors: ErrorSet.NameMap = .{},
/// Other inferred error sets which this inferred error set should include.
- inferred_error_sets: std.AutoHashMapUnmanaged(*InferredErrorSet, void) = .{},
+ inferred_error_sets: std.AutoArrayHashMapUnmanaged(*InferredErrorSet, void) = .{},
/// Whether the function returned anyerror. This is true if either of
/// the dependent functions returns anyerror.
diff --git a/src/Sema.zig b/src/Sema.zig
@@ -27509,9 +27509,7 @@ fn analyzeIsNonErrComptimeOnly(
// Try to avoid resolving inferred error set if possible.
if (ies.errors.count() != 0) break :blk;
if (ies.is_anyerror) break :blk;
- var it = ies.inferred_error_sets.keyIterator();
- while (it.next()) |other_error_set_ptr| {
- const other_ies: *Module.Fn.InferredErrorSet = other_error_set_ptr.*;
+ for (ies.inferred_error_sets.keys()) |other_ies| {
if (ies == other_ies) continue;
try sema.resolveInferredErrorSet(block, src, other_ies);
if (other_ies.is_anyerror) {
@@ -29432,9 +29430,7 @@ fn resolveInferredErrorSet(
ies.is_resolved = true;
- var it = ies.inferred_error_sets.keyIterator();
- while (it.next()) |other_error_set_ptr| {
- const other_ies: *Module.Fn.InferredErrorSet = other_error_set_ptr.*;
+ for (ies.inferred_error_sets.keys()) |other_ies| {
if (ies == other_ies) continue;
try sema.resolveInferredErrorSet(block, src, other_ies);