| ... | ... | @@ -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(); |
| ... | ... | @@ -227,6 +228,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void { |
| 227 | 228 | const decl_name = c.tree.tokSlice(data.decl.name); |
| 228 | 229 | try c.global_names.put(c.gpa, decl_name, {}); |
| 229 | 230 | }, |
| 231 | .static_assert => {}, |
| 230 | 232 | else => unreachable, |
| 231 | 233 | } |
| 232 | 234 | } |
| ... | ... | @@ -304,6 +306,7 @@ fn transDecl(c: *Context, scope: *Scope, decl: NodeIndex) !void { |
| 304 | 306 | => { |
| 305 | 307 | try transVarDecl(c, decl, null); |
| 306 | 308 | }, |
| 309 | .static_assert => try warn(c, &c.global_scope.base, 0, "ignoring _Static_assert declaration", .{}), |
| 307 | 310 | else => unreachable, |
| 308 | 311 | } |
| 309 | 312 | } |
| ... | ... | @@ -1622,6 +1625,33 @@ test "Macro matching" { |
| 1622 | 1625 | try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((volatile const void)(X))", "DISCARD"); |
| 1623 | 1626 | } |
| 1624 | 1627 | |
| 1628 | /// Renders errors and fatal errors + associated notes (e.g. "expanded from here"); does not render warnings or associated notes |
| 1629 | /// Terminates with exit code 1 |
| 1630 | fn renderErrorsAndExit(comp: *aro.Compilation) noreturn { |
| 1631 | defer std.process.exit(1); |
| 1632 | |
| 1633 | var writer = aro.Diagnostics.defaultMsgWriter(std.io.tty.detectConfig(std.io.getStdErr())); |
| 1634 | defer writer.deinit(); // writer deinit must run *before* exit so that stderr is flushed |
| 1635 | |
| 1636 | var saw_error = false; |
| 1637 | for (comp.diagnostics.list.items) |msg| { |
| 1638 | switch (msg.kind) { |
| 1639 | .@"error", .@"fatal error" => { |
| 1640 | saw_error = true; |
| 1641 | aro.Diagnostics.renderMessage(comp, &writer, msg); |
| 1642 | }, |
| 1643 | .warning => saw_error = false, |
| 1644 | .note => { |
| 1645 | if (saw_error) { |
| 1646 | aro.Diagnostics.renderMessage(comp, &writer, msg); |
| 1647 | } |
| 1648 | }, |
| 1649 | .off => {}, |
| 1650 | .default => unreachable, |
| 1651 | } |
| 1652 | } |
| 1653 | } |
| 1654 | |
| 1625 | 1655 | pub fn main() !void { |
| 1626 | 1656 | var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator); |
| 1627 | 1657 | defer arena_instance.deinit(); |
| ... | ... | @@ -1636,12 +1666,9 @@ pub fn main() !void { |
| 1636 | 1666 | defer aro_comp.deinit(); |
| 1637 | 1667 | |
| 1638 | 1668 | 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 | | }, |
| 1669 | error.ParsingFailed, error.FatalError => renderErrorsAndExit(&aro_comp), |
| 1643 | 1670 | error.OutOfMemory => return error.OutOfMemory, |
| 1644 | | error.StreamTooLong => std.zig.fatal("StreamTooLong?", .{}), |
| 1671 | error.StreamTooLong => std.zig.fatal("An input file was larger than 4GiB", .{}), |
| 1645 | 1672 | }; |
| 1646 | 1673 | defer tree.deinit(gpa); |
| 1647 | 1674 | |