aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-10-27 15:26:59 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-10-27 15:26:59 -0700
commit6504c57176a2a7def07c975af693940fe351bb19 (patch)
tree9ab962f554730e7a2a60aed00f219af2952525d4 /src
parente494ce760428cde79b63e9a9016c4af06484eef3 (diff)
downloadzig-6504c57176a2a7def07c975af693940fe351bb19.tar.gz
zig-6504c57176a2a7def07c975af693940fe351bb19.zip
Compilation: fix crash in the compile error system
There is a table of `misc_failures` which previously did not allow multiple errors for the same enum tag. Now it allows this by freeing the previous compile error and replacing it with the new one. Typically this will happen because multiple sub-Compilation objects fail with the same problem, such as not being able to build glibc because of not having LLVM extensions enabled.
Diffstat (limited to 'src')
-rw-r--r--src/Compilation.zig6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index f458fe9f61..8ea6b545b8 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -3849,7 +3849,11 @@ fn setMiscFailure(
) Allocator.Error!void {
try comp.misc_failures.ensureUnusedCapacity(comp.gpa, 1);
const msg = try std.fmt.allocPrint(comp.gpa, format, args);
- comp.misc_failures.putAssumeCapacityNoClobber(tag, .{ .msg = msg });
+ const gop = comp.misc_failures.getOrPutAssumeCapacity(tag);
+ if (gop.found_existing) {
+ gop.value_ptr.deinit(comp.gpa);
+ }
+ gop.value_ptr.* = .{ .msg = msg };
}
pub fn dump_argv(argv: []const []const u8) void {