From 7cd94d212361bc5662e8cc6959cd32edca1df03a Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 15 May 2021 21:20:06 -0700 Subject: [PATCH] stage2: omit Decl compile errors from failed AstGen files Just like when new parse errors occur during an update, when new AstGen errors occur during an update, we do not reveal compile errors for Decl objects which are inside of a newly failed File. Once the File passes AstGen successfully, it will be compared with the previously succeeded ZIR and the saved Decl compile errors will be handled properly. --- src/Compilation.zig | 32 ++++++++++++++------------------ src/Module.zig | 7 +++++++ test/stage2/test.zig | 7 +++---- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/Compilation.zig b/src/Compilation.zig index ac26b89926e73d4a9e4935053b41cbeb1ba55bfa..6e6fab5cc213d47b65b205ff4007397adae1cd7d 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -1696,17 +1696,15 @@ pub fn totalErrorCount(self: *Compilation) usize { // the previous parse success, including compile errors, but we cannot // emit them until the file succeeds parsing. for (module.failed_decls.items()) |entry| { - if (entry.key.namespace.file_scope.status == .parse_failure) { - continue; + if (entry.key.namespace.file_scope.okToReportErrors()) { + total += 1; } - total += 1; } if (module.emit_h) |emit_h| { for (emit_h.failed_decls.items()) |entry| { - if (entry.key.namespace.file_scope.status == .parse_failure) { - continue; + if (entry.key.namespace.file_scope.okToReportErrors()) { + total += 1; } - total += 1; } } } @@ -1767,21 +1765,19 @@ pub fn getAllErrorsAlloc(self: *Compilation) !AllErrors { } } for (module.failed_decls.items()) |entry| { - if (entry.key.namespace.file_scope.status == .parse_failure) { + // Skip errors for Decls within files that had a parse failure. + // We'll try again once parsing succeeds. + if (entry.key.namespace.file_scope.okToReportErrors()) { + try AllErrors.add(module, &arena, &errors, entry.value.*); + } + } + if (module.emit_h) |emit_h| { + for (emit_h.failed_decls.items()) |entry| { // Skip errors for Decls within files that had a parse failure. // We'll try again once parsing succeeds. - continue; - } - try AllErrors.add(module, &arena, &errors, entry.value.*); - } - if (module.emit_h) |emit_h| { - for (emit_h.failed_decls.items()) |entry| { - if (entry.key.namespace.file_scope.status == .parse_failure) { - // Skip errors for Decls within files that had a parse failure. - // We'll try again once parsing succeeds. - continue; + if (entry.key.namespace.file_scope.okToReportErrors()) { + try AllErrors.add(module, &arena, &errors, entry.value.*); } - try AllErrors.add(module, &arena, &errors, entry.value.*); } } for (module.failed_exports.items()) |entry| { diff --git a/src/Module.zig b/src/Module.zig index f31b2438193f8a7d31af796c3206533c797e2d3e..2227e47d728843d7a1821d05e5ee531d96a79d74 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -1138,6 +1138,13 @@ pub const Scope = struct { const loc = std.zig.findLineColumn(file.source.bytes, src); std.debug.print("{s}:{d}:{d}\n", .{ file.sub_file_path, loc.line + 1, loc.column + 1 }); } + + pub fn okToReportErrors(file: File) bool { + return switch (file.status) { + .parse_failure, .astgen_failure => false, + else => true, + }; + } }; /// This is the context needed to semantically analyze ZIR instructions and diff --git a/test/stage2/test.zig b/test/stage2/test.zig index 56fe2b026ff34f77ce55983748939ab44862c914..dfe3e7cbdfb23d9fd55979a982883e58b7ced131 100644 --- a/test/stage2/test.zig +++ b/test/stage2/test.zig @@ -1225,7 +1225,7 @@ pub fn addCases(ctx: *TestContext) !void { { var case = ctx.obj("variable shadowing", linux_x64); case.addError( - \\pub export fn _start() noreturn { + \\export fn _start() noreturn { \\ var i: u32 = 10; \\ var i: u32 = 10; \\ unreachable; @@ -1251,7 +1251,7 @@ pub fn addCases(ctx: *TestContext) !void { var case = ctx.obj("@compileLog", linux_x64); // The other compile error prevents emission of a "found compile log" statement. case.addError( - \\pub export fn _start() noreturn { + \\export fn _start() noreturn { \\ const b = true; \\ var f: u32 = 1; \\ @compileLog(b, 20, f, x); @@ -1293,10 +1293,9 @@ pub fn addCases(ctx: *TestContext) !void { \\ _ = foo; \\} \\extern var foo: i32; - \\pub export fn _start() void {} , &[_][]const u8{":2:9: error: unable to resolve comptime value"}); case.addError( - \\pub export fn _start() void { + \\export fn entry() void { \\ _ = foo; \\} \\extern var foo; -- 2.54.0