| ... | @@ -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(); |
| 125 | | 125 | |
| 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 | } |
| 129 | | 130 | |
| 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 | } |
| 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 | pub fn main() !void { | 1653 | pub 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(); |
| 1637 | | 1665 | |
| 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 | }; |