authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-11-10 22:23:56-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-11-10 22:35:35-05:00
logd93f1f3c72578bb343dac6431f9901d62ccf7a2e
tree400dd8935ec64d8f96746eb172429dc482b27f93
parentb5f89d681f5c9160ad866bec6ce7b552722f40ef

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`.

2 files changed, 4 insertions(+), 3 deletions(-)

src/Module.zig+1
...@@ -1250,6 +1250,7 @@ pub const ErrorMsg = struct {...@@ -1250,6 +1250,7 @@ pub const ErrorMsg = struct {
1250 comptime format: []const u8,1250 comptime format: []const u8,
1251 args: anytype,1251 args: anytype,
1252 ) !*ErrorMsg {1252 ) !*ErrorMsg {
1253 assert(src_loc.lazy != .unneeded);
1253 const err_msg = try gpa.create(ErrorMsg);1254 const err_msg = try gpa.create(ErrorMsg);
1254 errdefer gpa.destroy(err_msg);1255 errdefer gpa.destroy(err_msg);
1255 err_msg.* = try ErrorMsg.init(gpa, src_loc, format, args);1256 err_msg.* = try ErrorMsg.init(gpa, src_loc, format, args);
src/Sema.zig+3-3
...@@ -2438,8 +2438,9 @@ fn errMsg(...@@ -2438,8 +2438,9 @@ fn errMsg(
2438 src: LazySrcLoc,2438 src: LazySrcLoc,
2439 comptime format: []const u8,2439 comptime format: []const u8,
2440 args: anytype,2440 args: anytype,
2441) error{OutOfMemory}!*Module.ErrorMsg {2441) error{ NeededSourceLocation, OutOfMemory }!*Module.ErrorMsg {
2442 const mod = sema.mod;2442 const mod = sema.mod;
2443 if (src == .unneeded) return error.NeededSourceLocation;
2443 const src_decl = mod.declPtr(block.src_decl);2444 const src_decl = mod.declPtr(block.src_decl);
2444 return Module.ErrorMsg.create(sema.gpa, src.toSrcLoc(src_decl, mod), format, args);2445 return Module.ErrorMsg.create(sema.gpa, src.toSrcLoc(src_decl, mod), format, args);
2445}2446}
...@@ -2455,14 +2456,13 @@ pub fn fail(...@@ -2455,14 +2456,13 @@ pub fn fail(
2455 return sema.failWithOwnedErrorMsg(block, err_msg);2456 return sema.failWithOwnedErrorMsg(block, err_msg);
2456}2457}
24572458
2458fn failWithOwnedErrorMsg(sema: *Sema, block: ?*Block, err_msg: *Module.ErrorMsg) CompileError {2459fn failWithOwnedErrorMsg(sema: *Sema, block: ?*Block, err_msg: *Module.ErrorMsg) error{ AnalysisFail, OutOfMemory } {
2459 @setCold(true);2460 @setCold(true);
2460 const gpa = sema.gpa;2461 const gpa = sema.gpa;
2461 const mod = sema.mod;2462 const mod = sema.mod;
24622463
2463 ref: {2464 ref: {
2464 errdefer err_msg.destroy(gpa);2465 errdefer err_msg.destroy(gpa);
2465 if (err_msg.src_loc.lazy == .unneeded) return error.NeededSourceLocation;
24662466
2467 if (crash_report.is_enabled and mod.comp.debug_compile_errors) {2467 if (crash_report.is_enabled and mod.comp.debug_compile_errors) {
2468 var wip_errors: std.zig.ErrorBundle.Wip = undefined;2468 var wip_errors: std.zig.ErrorBundle.Wip = undefined;