| ... | ... | @@ -2396,80 +2396,69 @@ fn failWithOwnedErrorMsg(sema: *Sema, block: ?*Block, err_msg: *Module.ErrorMsg) |
| 2396 | 2396 | const gpa = sema.gpa; |
| 2397 | 2397 | const mod = sema.mod; |
| 2398 | 2398 | |
| 2399 | | if (crash_report.is_enabled and mod.comp.debug_compile_errors) { |
| 2400 | | if (err_msg.src_loc.lazy == .unneeded) return error.NeededSourceLocation; |
| 2401 | | var wip_errors: std.zig.ErrorBundle.Wip = undefined; |
| 2402 | | wip_errors.init(gpa) catch unreachable; |
| 2403 | | Compilation.addModuleErrorMsg(mod, &wip_errors, err_msg.*) catch unreachable; |
| 2404 | | std.debug.print("compile error during Sema:\n", .{}); |
| 2405 | | var error_bundle = wip_errors.toOwnedBundle("") catch unreachable; |
| 2406 | | error_bundle.renderToStdErr(.{ .ttyconf = .no_color }); |
| 2407 | | crash_report.compilerPanic("unexpected compile error occurred", null, null); |
| 2408 | | } |
| 2409 | | |
| 2410 | 2399 | ref: { |
| 2411 | 2400 | errdefer err_msg.destroy(gpa); |
| 2412 | | if (err_msg.src_loc.lazy == .unneeded) { |
| 2413 | | return error.NeededSourceLocation; |
| 2401 | if (err_msg.src_loc.lazy == .unneeded) return error.NeededSourceLocation; |
| 2402 | |
| 2403 | if (crash_report.is_enabled and mod.comp.debug_compile_errors) { |
| 2404 | var wip_errors: std.zig.ErrorBundle.Wip = undefined; |
| 2405 | wip_errors.init(gpa) catch unreachable; |
| 2406 | Compilation.addModuleErrorMsg(mod, &wip_errors, err_msg.*) catch unreachable; |
| 2407 | std.debug.print("compile error during Sema:\n", .{}); |
| 2408 | var error_bundle = wip_errors.toOwnedBundle("") catch unreachable; |
| 2409 | error_bundle.renderToStdErr(.{ .ttyconf = .no_color }); |
| 2410 | crash_report.compilerPanic("unexpected compile error occurred", null, null); |
| 2414 | 2411 | } |
| 2412 | |
| 2415 | 2413 | try mod.failed_decls.ensureUnusedCapacity(gpa, 1); |
| 2416 | 2414 | try mod.failed_files.ensureUnusedCapacity(gpa, 1); |
| 2417 | 2415 | |
| 2418 | | var func_index: InternPool.Index = .none; |
| 2419 | 2416 | if (block) |start_block| { |
| 2420 | 2417 | var block_it = start_block; |
| 2421 | 2418 | while (block_it.inlining) |inlining| { |
| 2422 | | func_index = inlining.func; |
| 2419 | try sema.errNote( |
| 2420 | inlining.call_block, |
| 2421 | inlining.call_src, |
| 2422 | err_msg, |
| 2423 | "called from here", |
| 2424 | .{}, |
| 2425 | ); |
| 2423 | 2426 | block_it = inlining.call_block; |
| 2424 | | try sema.errNote(block_it, inlining.call_src, err_msg, "called from here", .{}); |
| 2425 | 2427 | } |
| 2426 | | } |
| 2427 | 2428 | |
| 2428 | | const max_references = blk: { |
| 2429 | | if (mod.comp.reference_trace) |num| break :blk num; |
| 2430 | | // Do not add multiple traces without explicit request. |
| 2431 | | if (mod.failed_decls.count() != 0) break :ref; |
| 2432 | | break :blk default_reference_trace_len; |
| 2433 | | }; |
| 2429 | const max_references = refs: { |
| 2430 | if (mod.comp.reference_trace) |num| break :refs num; |
| 2431 | // Do not add multiple traces without explicit request. |
| 2432 | if (mod.failed_decls.count() > 0) break :ref; |
| 2433 | break :refs default_reference_trace_len; |
| 2434 | }; |
| 2434 | 2435 | |
| 2435 | | var referenced_by = if (sema.owner_func_index != .none) |
| 2436 | | mod.funcOwnerDeclIndex(sema.owner_func_index) |
| 2437 | | else |
| 2438 | | sema.owner_decl_index; |
| 2439 | | var reference_stack = std.ArrayList(Module.ErrorMsg.Trace).init(gpa); |
| 2440 | | defer reference_stack.deinit(); |
| 2441 | | |
| 2442 | | // Avoid infinite loops. |
| 2443 | | var seen = std.AutoHashMap(Decl.Index, void).init(gpa); |
| 2444 | | defer seen.deinit(); |
| 2445 | | |
| 2446 | | var cur_reference_trace: u32 = 0; |
| 2447 | | while (sema.mod.reference_table.get(referenced_by)) |ref| : (cur_reference_trace += 1) { |
| 2448 | | const gop = try seen.getOrPut(ref.referencer); |
| 2449 | | if (gop.found_existing) break; |
| 2450 | | if (cur_reference_trace < max_references) { |
| 2451 | | const decl = sema.mod.declPtr(ref.referencer); |
| 2452 | | try reference_stack.append(.{ |
| 2453 | | .decl = decl.name.toOptional(), |
| 2454 | | .src_loc = ref.src.toSrcLoc(decl, mod), |
| 2455 | | }); |
| 2436 | var referenced_by = if (sema.owner_func_index != .none) |
| 2437 | mod.funcOwnerDeclIndex(sema.owner_func_index) |
| 2438 | else |
| 2439 | sema.owner_decl_index; |
| 2440 | var reference_stack = std.ArrayList(Module.ErrorMsg.Trace).init(gpa); |
| 2441 | defer reference_stack.deinit(); |
| 2442 | |
| 2443 | // Avoid infinite loops. |
| 2444 | var seen = std.AutoHashMap(Decl.Index, void).init(gpa); |
| 2445 | defer seen.deinit(); |
| 2446 | |
| 2447 | while (mod.reference_table.get(referenced_by)) |ref| { |
| 2448 | const gop = try seen.getOrPut(ref.referencer); |
| 2449 | if (gop.found_existing) break; |
| 2450 | if (reference_stack.items.len < max_references) { |
| 2451 | const decl = mod.declPtr(ref.referencer); |
| 2452 | try reference_stack.append(.{ |
| 2453 | .decl = decl.name, |
| 2454 | .src_loc = ref.src.toSrcLoc(decl, mod), |
| 2455 | }); |
| 2456 | } |
| 2457 | referenced_by = ref.referencer; |
| 2456 | 2458 | } |
| 2457 | | referenced_by = ref.referencer; |
| 2458 | | } |
| 2459 | | if (sema.mod.comp.reference_trace == null and cur_reference_trace > 0) { |
| 2460 | | try reference_stack.append(.{ |
| 2461 | | .decl = .none, |
| 2462 | | .src_loc = undefined, |
| 2463 | | .hidden = 0, |
| 2464 | | }); |
| 2465 | | } else if (cur_reference_trace > max_references) { |
| 2466 | | try reference_stack.append(.{ |
| 2467 | | .decl = undefined, |
| 2468 | | .src_loc = undefined, |
| 2469 | | .hidden = cur_reference_trace - max_references, |
| 2470 | | }); |
| 2459 | err_msg.reference_trace = try reference_stack.toOwnedSlice(); |
| 2460 | err_msg.hidden_references = @intCast(seen.count() -| max_references); |
| 2471 | 2461 | } |
| 2472 | | err_msg.reference_trace = try reference_stack.toOwnedSlice(); |
| 2473 | 2462 | } |
| 2474 | 2463 | const ip = &mod.intern_pool; |
| 2475 | 2464 | if (sema.owner_func_index != .none) { |
| ... | ... | @@ -7399,7 +7388,8 @@ fn analyzeCall( |
| 7399 | 7388 | var block_it = block; |
| 7400 | 7389 | while (block_it.inlining) |parent_inlining| { |
| 7401 | 7390 | if (!parent_inlining.has_comptime_args and parent_inlining.func == module_fn_index) { |
| 7402 | | return sema.fail(block, call_src, "inline call is recursive", .{}); |
| 7391 | const err_msg = try sema.errMsg(block, call_src, "inline call is recursive", .{}); |
| 7392 | return sema.failWithOwnedErrorMsg(null, err_msg); |
| 7403 | 7393 | } |
| 7404 | 7394 | block_it = parent_inlining.call_block; |
| 7405 | 7395 | } |