From d93f1f3c72578bb343dac6431f9901d62ccf7a2e Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Fri, 10 Nov 2023 22:23:56 -0500 Subject: [PATCH] Sema: detect unneeded source locations earlier This avoids a lot of work that just needs deferred cleanup anyway. Crucially, also avoids use of undefined in `failWithNeededComptime`. --- src/Module.zig | 1 + src/Sema.zig | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Module.zig b/src/Module.zig index d475f85c14..8ba856cf68 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -1250,6 +1250,7 @@ pub const ErrorMsg = struct { comptime format: []const u8, args: anytype, ) !*ErrorMsg { + assert(src_loc.lazy != .unneeded); const err_msg = try gpa.create(ErrorMsg); errdefer gpa.destroy(err_msg); err_msg.* = try ErrorMsg.init(gpa, src_loc, format, args); diff --git a/src/Sema.zig b/src/Sema.zig index b7510cea54..7823b3ae0f 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -2438,8 +2438,9 @@ fn errMsg( src: LazySrcLoc, comptime format: []const u8, args: anytype, -) error{OutOfMemory}!*Module.ErrorMsg { +) error{ NeededSourceLocation, OutOfMemory }!*Module.ErrorMsg { const mod = sema.mod; + if (src == .unneeded) return error.NeededSourceLocation; const src_decl = mod.declPtr(block.src_decl); return Module.ErrorMsg.create(sema.gpa, src.toSrcLoc(src_decl, mod), format, args); } @@ -2455,14 +2456,13 @@ pub fn fail( return sema.failWithOwnedErrorMsg(block, err_msg); } -fn failWithOwnedErrorMsg(sema: *Sema, block: ?*Block, err_msg: *Module.ErrorMsg) CompileError { +fn failWithOwnedErrorMsg(sema: *Sema, block: ?*Block, err_msg: *Module.ErrorMsg) error{ AnalysisFail, OutOfMemory } { @setCold(true); const gpa = sema.gpa; const mod = sema.mod; ref: { errdefer err_msg.destroy(gpa); - if (err_msg.src_loc.lazy == .unneeded) return error.NeededSourceLocation; if (crash_report.is_enabled and mod.comp.debug_compile_errors) { var wip_errors: std.zig.ErrorBundle.Wip = undefined;