diff --git a/src/Sema.zig b/src/Sema.zig index 6b376f3d6c..2721ed5179 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -5312,7 +5312,14 @@ fn zirDeclRef(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air const src = inst_data.src(); const decl_name = inst_data.get(sema.code); const decl_index = try sema.lookupIdentifier(block, src, decl_name); - return sema.analyzeDeclRef(decl_index); + return sema.analyzeDeclRef(decl_index) catch |err| switch (err) { + error.AnalysisFail => { + const msg = sema.err orelse return err; + try sema.errNote(block, src, msg, "referenced here", .{}); + return err; + }, + else => return err, + }; } fn zirDeclVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref { @@ -20876,7 +20883,14 @@ fn namespaceLookupRef( decl_name: []const u8, ) CompileError!?Air.Inst.Ref { const decl = (try sema.namespaceLookup(block, src, namespace, decl_name)) orelse return null; - return try sema.analyzeDeclRef(decl); + return sema.analyzeDeclRef(decl) catch |err| switch (err) { + error.AnalysisFail => { + const msg = sema.err orelse return err; + try sema.errNote(block, src, msg, "referenced here", .{}); + return err; + }, + else => return err, + }; } fn namespaceLookupVal( @@ -24979,7 +24993,14 @@ fn analyzeDeclVal( if (sema.decl_val_table.get(decl_index)) |result| { return result; } - const decl_ref = try sema.analyzeDeclRef(decl_index); + const decl_ref = sema.analyzeDeclRef(decl_index) catch |err| switch (err) { + error.AnalysisFail => { + const msg = sema.err orelse return err; + try sema.errNote(block, src, msg, "referenced here", .{}); + return err; + }, + else => return err, + }; const result = try sema.analyzeLoad(block, src, decl_ref, src); if (Air.refToIndex(result)) |index| { if (sema.air_instructions.items(.tag)[index] == .constant and !block.is_typeof) { @@ -24990,6 +25011,12 @@ fn analyzeDeclVal( } fn ensureDeclAnalyzed(sema: *Sema, decl_index: Decl.Index) CompileError!void { + const decl = sema.mod.declPtr(decl_index); + if (decl.analysis == .in_progress) { + const msg = try Module.ErrorMsg.create(sema.gpa, decl.srcLoc(), "dependency loop detected", .{}); + return sema.failWithOwnedErrorMsg(msg); + } + sema.mod.ensureDeclAnalyzed(decl_index) catch |err| { if (sema.owner_func) |owner_func| { owner_func.state = .dependency_failure; diff --git a/test/cases/compile_errors/stage1/obj/top_level_decl_dependency_loop.zig b/test/cases/compile_errors/top_level_decl_dependency_loop.zig similarity index 60% rename from test/cases/compile_errors/stage1/obj/top_level_decl_dependency_loop.zig rename to test/cases/compile_errors/top_level_decl_dependency_loop.zig index ac70285c9c..3b0e60ac02 100644 --- a/test/cases/compile_errors/stage1/obj/top_level_decl_dependency_loop.zig +++ b/test/cases/compile_errors/top_level_decl_dependency_loop.zig @@ -6,7 +6,8 @@ export fn entry() void { } // error -// backend=stage1 +// backend=stage2 // target=native // -// tmp.zig:2:19: error: dependency loop detected +// :1:1: error: dependency loop detected +// :2:19: note: referenced here