authorgravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2024-07-29 09:33:21-07:00
committergravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2024-07-29 10:25:55-07:00
logd7b9bbecaf6ba3ee924d7744ea720c67bc8f0a1b
treede01c648e95a53807948e5ebd9be1ba85277be0d
parent390c7d84b24355ba3346ec1214a0a8de8a7c5df3
signaturebadge-check Signed by SSH key SHA256:cf2/TFgSxv2uRX26INvFSw25Prr1Dy9H8MiRXgLpok4

aro_translate_c: Render errors properly

The error count is not set until the diagnostics are actually rendered

1 files changed, 31 insertions(+), 6 deletions(-)

lib/compiler/aro_translate_c.zig+31-6
...@@ -123,8 +123,9 @@ pub fn translate(...@@ -123,8 +123,9 @@ pub fn translate(
123 var tree = try pp.parse();123 var tree = try pp.parse();
124 defer tree.deinit();124 defer tree.deinit();
125125
126 if (driver.comp.diagnostics.errors != 0) {126 // Workaround for https://github.com/Vexu/arocc/issues/603
127 return error.SemanticAnalyzeFail;127 for (comp.diagnostics.list.items) |msg| {
128 if (msg.kind == .@"error" or msg.kind == .@"fatal error") return error.ParsingFailed;
128 }129 }
129130
130 const mapper = tree.comp.string_interner.getFastTypeMapper(tree.comp.gpa) catch tree.comp.string_interner.getSlowTypeMapper();131 const mapper = tree.comp.string_interner.getFastTypeMapper(tree.comp.gpa) catch tree.comp.string_interner.getSlowTypeMapper();
...@@ -1622,6 +1623,33 @@ test "Macro matching" {...@@ -1622,6 +1623,33 @@ test "Macro matching" {
1622 try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((volatile const void)(X))", "DISCARD");1623 try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((volatile const void)(X))", "DISCARD");
1623}1624}
16241625
1626/// Renders errors and fatal errors + associated notes (e.g. "expanded from here"); does not render warnings or associated notes
1627/// Terminates with exit code 1
1628fn renderErrorsAndExit(comp: *aro.Compilation) noreturn {
1629 defer std.process.exit(1);
1630
1631 var writer = aro.Diagnostics.defaultMsgWriter(std.io.tty.detectConfig(std.io.getStdErr()));
1632 defer writer.deinit(); // writer deinit must run *before* exit so that stderr is flushed
1633
1634 var saw_error = false;
1635 for (comp.diagnostics.list.items) |msg| {
1636 switch (msg.kind) {
1637 .@"error", .@"fatal error" => {
1638 saw_error = true;
1639 aro.Diagnostics.renderMessage(comp, &writer, msg);
1640 },
1641 .warning => saw_error = false,
1642 .note => {
1643 if (saw_error) {
1644 aro.Diagnostics.renderMessage(comp, &writer, msg);
1645 }
1646 },
1647 .off => {},
1648 .default => unreachable,
1649 }
1650 }
1651}
1652
1625pub fn main() !void {1653pub fn main() !void {
1626 var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);1654 var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);
1627 defer arena_instance.deinit();1655 defer arena_instance.deinit();
...@@ -1636,10 +1664,7 @@ pub fn main() !void {...@@ -1636,10 +1664,7 @@ pub fn main() !void {
1636 defer aro_comp.deinit();1664 defer aro_comp.deinit();
16371665
1638 var tree = translate(gpa, &aro_comp, args) catch |err| switch (err) {1666 var tree = translate(gpa, &aro_comp, args) catch |err| switch (err) {
1639 error.SemanticAnalyzeFail, error.FatalError => {1667 error.ParsingFailed, error.FatalError => renderErrorsAndExit(&aro_comp),
1640 aro.Diagnostics.render(&aro_comp, std.io.tty.detectConfig(std.io.getStdErr()));
1641 std.process.exit(1);
1642 },
1643 error.OutOfMemory => return error.OutOfMemory,1668 error.OutOfMemory => return error.OutOfMemory,
1644 error.StreamTooLong => std.zig.fatal("StreamTooLong?", .{}),1669 error.StreamTooLong => std.zig.fatal("StreamTooLong?", .{}),
1645 };1670 };