| ... | ... | @@ -123,8 +123,9 @@ pub fn translate( |
| 123 | 123 | var tree = try pp.parse(); |
| 124 | 124 | defer tree.deinit(); |
| 125 | 125 | |
| 126 | | if (driver.comp.diagnostics.errors != 0) { |
| 127 | | return error.SemanticAnalyzeFail; |
| 126 | // Workaround for https://github.com/Vexu/arocc/issues/603 |
| 127 | for (comp.diagnostics.list.items) |msg| { |
| 128 | if (msg.kind == .@"error" or msg.kind == .@"fatal error") return error.ParsingFailed; |
| 128 | 129 | } |
| 129 | 130 | |
| 130 | 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 | 1623 | try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((volatile const void)(X))", "DISCARD"); |
| 1623 | 1624 | } |
| 1624 | 1625 | |
| 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 |
| 1628 | fn 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 | |
| 1625 | 1653 | pub fn main() !void { |
| 1626 | 1654 | var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator); |
| 1627 | 1655 | defer arena_instance.deinit(); |
| ... | ... | @@ -1636,10 +1664,7 @@ pub fn main() !void { |
| 1636 | 1664 | defer aro_comp.deinit(); |
| 1637 | 1665 | |
| 1638 | 1666 | var tree = translate(gpa, &aro_comp, args) catch |err| switch (err) { |
| 1639 | | error.SemanticAnalyzeFail, error.FatalError => { |
| 1640 | | aro.Diagnostics.render(&aro_comp, std.io.tty.detectConfig(std.io.getStdErr())); |
| 1641 | | std.process.exit(1); |
| 1642 | | }, |
| 1667 | error.ParsingFailed, error.FatalError => renderErrorsAndExit(&aro_comp), |
| 1643 | 1668 | error.OutOfMemory => return error.OutOfMemory, |
| 1644 | 1669 | error.StreamTooLong => std.zig.fatal("StreamTooLong?", .{}), |
| 1645 | 1670 | }; |