authorgravatar for sin-ack@users.noreply.github.comsin-ack <sin-ack@users.noreply.github.com> 2022-08-12 21:51:07+00:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-15 11:34:12+03:00
loga9c4dc84f487c4764c5787439ea87962f698d511
tree79f795fe801b9fe79dd80bcbf4eb155806331a4b
parent40eac90280db34afd31da5ad0e6be8a4795f858b

Sema: Revert sema.err to null if the Decl already has an error

Previously we would assign the error message to Sema and then never clear it even when destroying the error message, which caused memory corruption. Closes #12437

1 files changed, 2 insertions(+), 2 deletions(-)

src/Sema.zig+2-2
...@@ -1906,8 +1906,6 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {...@@ -1906,8 +1906,6 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {
1906 }1906 }
19071907
1908 const mod = sema.mod;1908 const mod = sema.mod;
1909 sema.err = err_msg;
1910
1911 {1909 {
1912 errdefer err_msg.destroy(mod.gpa);1910 errdefer err_msg.destroy(mod.gpa);
1913 if (err_msg.src_loc.lazy == .unneeded) {1911 if (err_msg.src_loc.lazy == .unneeded) {
...@@ -1925,8 +1923,10 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {...@@ -1925,8 +1923,10 @@ fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {
1925 const gop = mod.failed_decls.getOrPutAssumeCapacity(sema.owner_decl_index);1923 const gop = mod.failed_decls.getOrPutAssumeCapacity(sema.owner_decl_index);
1926 if (gop.found_existing) {1924 if (gop.found_existing) {
1927 // If there are multiple errors for the same Decl, prefer the first one added.1925 // If there are multiple errors for the same Decl, prefer the first one added.
1926 sema.err = null;
1928 err_msg.destroy(mod.gpa);1927 err_msg.destroy(mod.gpa);
1929 } else {1928 } else {
1929 sema.err = err_msg;
1930 gop.value_ptr.* = err_msg;1930 gop.value_ptr.* = err_msg;
1931 }1931 }
1932 return error.AnalysisFail;1932 return error.AnalysisFail;