aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2022-11-03 02:42:18 -0400
committerAndrew Kelley <andrew@ziglang.org>2022-11-04 00:00:10 -0400
commitcbed6bb08555222008e87cfb071adeed97b3f8a4 (patch)
treee5824a89f3f037909cfceae8fee7b8bfc765af70 /src
parent42755a1944f4c4a60fc7e5e66cf76e9cbdf1ce84 (diff)
downloadzig-cbed6bb08555222008e87cfb071adeed97b3f8a4.tar.gz
zig-cbed6bb08555222008e87cfb071adeed97b3f8a4.zip
Sema: make `InferredErrorSet` deterministic
Empirically, this `AutoHashMapUnmanaged` -> `AutoArrayHashMapUnmanaged` change fixes all non-determinism in `ReleaseFast` build artifacts. Closes #12183
Diffstat (limited to 'src')
-rw-r--r--src/Module.zig2
-rw-r--r--src/Sema.zig8
2 files changed, 3 insertions, 7 deletions
diff --git a/src/Module.zig b/src/Module.zig
index 2bda1707b2..6ef5389360 100644
--- 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
index b2a0dfa779..bd956d32bc 100644
--- 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);