authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-03 17:10:39+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-03 17:10:39+03:00
log4ab60dc18b44cffad88d470c567920bcc34b1214
tree7934f9921f955d38cf155643e8ff434e87f555fb
parentb79929b2eaa634b756fe374372d59718f4f8479a

Sema: add error for dependency loops


3 files changed, 43 insertions(+), 15 deletions(-)

src/Sema.zig+30-3
......@@ -5312,7 +5312,14 @@ fn zirDeclRef(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
53125312 const src = inst_data.src();
53135313 const decl_name = inst_data.get(sema.code);
53145314 const decl_index = try sema.lookupIdentifier(block, src, decl_name);
5315 return sema.analyzeDeclRef(decl_index);
5315 return sema.analyzeDeclRef(decl_index) catch |err| switch (err) {
5316 error.AnalysisFail => {
5317 const msg = sema.err orelse return err;
5318 try sema.errNote(block, src, msg, "referenced here", .{});
5319 return err;
5320 },
5321 else => return err,
5322 };
53165323}
53175324
53185325fn zirDeclVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -20876,7 +20883,14 @@ fn namespaceLookupRef(
2087620883 decl_name: []const u8,
2087720884) CompileError!?Air.Inst.Ref {
2087820885 const decl = (try sema.namespaceLookup(block, src, namespace, decl_name)) orelse return null;
20879 return try sema.analyzeDeclRef(decl);
20886 return sema.analyzeDeclRef(decl) catch |err| switch (err) {
20887 error.AnalysisFail => {
20888 const msg = sema.err orelse return err;
20889 try sema.errNote(block, src, msg, "referenced here", .{});
20890 return err;
20891 },
20892 else => return err,
20893 };
2088020894}
2088120895
2088220896fn namespaceLookupVal(
......@@ -24979,7 +24993,14 @@ fn analyzeDeclVal(
2497924993 if (sema.decl_val_table.get(decl_index)) |result| {
2498024994 return result;
2498124995 }
24982 const decl_ref = try sema.analyzeDeclRef(decl_index);
24996 const decl_ref = sema.analyzeDeclRef(decl_index) catch |err| switch (err) {
24997 error.AnalysisFail => {
24998 const msg = sema.err orelse return err;
24999 try sema.errNote(block, src, msg, "referenced here", .{});
25000 return err;
25001 },
25002 else => return err,
25003 };
2498325004 const result = try sema.analyzeLoad(block, src, decl_ref, src);
2498425005 if (Air.refToIndex(result)) |index| {
2498525006 if (sema.air_instructions.items(.tag)[index] == .constant and !block.is_typeof) {
......@@ -24990,6 +25011,12 @@ fn analyzeDeclVal(
2499025011}
2499125012
2499225013fn ensureDeclAnalyzed(sema: *Sema, decl_index: Decl.Index) CompileError!void {
25014 const decl = sema.mod.declPtr(decl_index);
25015 if (decl.analysis == .in_progress) {
25016 const msg = try Module.ErrorMsg.create(sema.gpa, decl.srcLoc(), "dependency loop detected", .{});
25017 return sema.failWithOwnedErrorMsg(msg);
25018 }
25019
2499325020 sema.mod.ensureDeclAnalyzed(decl_index) catch |err| {
2499425021 if (sema.owner_func) |owner_func| {
2499525022 owner_func.state = .dependency_failure;
test/cases/compile_errors/stage1/obj/top_level_decl_dependency_loop.zig deleted-12
......@@ -1,12 +0,0 @@
1const a : @TypeOf(b) = 0;
2const b : @TypeOf(a) = 0;
3export fn entry() void {
4 const c = a + b;
5 _ = c;
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:2:19: error: dependency loop detected
test/cases/compile_errors/top_level_decl_dependency_loop.zig created+13
......@@ -0,0 +1,13 @@
1const a : @TypeOf(b) = 0;
2const b : @TypeOf(a) = 0;
3export fn entry() void {
4 const c = a + b;
5 _ = c;
6}
7
8// error
9// backend=stage2
10// target=native
11//
12// :1:1: error: dependency loop detected
13// :2:19: note: referenced here