diff --git a/src/Module.zig b/src/Module.zig index 154c7426d2..fdf61c4bf6 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -4854,7 +4854,12 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: Allocator) Sem error.GenericPoison => unreachable, error.ComptimeReturn => unreachable, error.ComptimeBreak => unreachable, - error.AnalysisFail => {}, + error.AnalysisFail => { + // In this case our function depends on a type that had a compile error. + // We should not try to lower this function. + decl.analysis = .dependency_failure; + return error.AnalysisFail; + }, else => |e| return e, }; @@ -4867,7 +4872,12 @@ pub fn analyzeFnBody(mod: *Module, decl: *Decl, func: *Fn, arena: Allocator) Sem error.GenericPoison => unreachable, error.ComptimeReturn => unreachable, error.ComptimeBreak => unreachable, - error.AnalysisFail => {}, + error.AnalysisFail => { + // In this case our function depends on a type that had a compile error. + // We should not try to lower this function. + decl.analysis = .dependency_failure; + return error.AnalysisFail; + }, else => |e| return e, }; } diff --git a/src/Sema.zig b/src/Sema.zig index d333e03ad2..65550bec00 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -1639,7 +1639,13 @@ fn failWithOwnedErrorMsg(sema: *Sema, block: *Block, err_msg: *Module.ErrorMsg) sema.owner_decl.analysis = .sema_failure; sema.owner_decl.generation = mod.generation; } - mod.failed_decls.putAssumeCapacityNoClobber(sema.owner_decl, err_msg); + const gop = mod.failed_decls.getOrPutAssumeCapacity(sema.owner_decl); + if (gop.found_existing) { + // If there are multiple errors for the same Decl, prefer the first one added. + err_msg.destroy(mod.gpa); + } else { + gop.value_ptr.* = err_msg; + } return error.AnalysisFail; }