| ... | @@ -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(); |
| ... | @@ -227,6 +228,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void { | ... | @@ -227,6 +228,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void { |
| 227 | const decl_name = c.tree.tokSlice(data.decl.name); | 228 | const decl_name = c.tree.tokSlice(data.decl.name); |
| 228 | try c.global_names.put(c.gpa, decl_name, {}); | 229 | try c.global_names.put(c.gpa, decl_name, {}); |
| 229 | }, | 230 | }, |
| | 231 | .static_assert => {}, |
| 230 | else => unreachable, | 232 | else => unreachable, |
| 231 | } | 233 | } |
| 232 | } | 234 | } |
| ... | @@ -304,6 +306,7 @@ fn transDecl(c: *Context, scope: *Scope, decl: NodeIndex) !void { | ... | @@ -304,6 +306,7 @@ fn transDecl(c: *Context, scope: *Scope, decl: NodeIndex) !void { |
| 304 | => { | 306 | => { |
| 305 | try transVarDecl(c, decl, null); | 307 | try transVarDecl(c, decl, null); |
| 306 | }, | 308 | }, |
| | 309 | .static_assert => try warn(c, &c.global_scope.base, 0, "ignoring _Static_assert declaration", .{}), |
| 307 | else => unreachable, | 310 | else => unreachable, |
| 308 | } | 311 | } |
| 309 | } | 312 | } |
| ... | @@ -1622,6 +1625,33 @@ test "Macro matching" { | ... | @@ -1622,6 +1625,33 @@ test "Macro matching" { |
| 1622 | try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((volatile const void)(X))", "DISCARD"); | 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 | pub fn main() !void { | 1655 | pub fn main() !void { |
| 1626 | var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator); | 1656 | var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator); |
| 1627 | defer arena_instance.deinit(); | 1657 | defer arena_instance.deinit(); |
| ... | @@ -1636,12 +1666,9 @@ pub fn main() !void { | ... | @@ -1636,12 +1666,9 @@ pub fn main() !void { |
| 1636 | defer aro_comp.deinit(); | 1666 | defer aro_comp.deinit(); |
| 1637 | | 1667 | |
| 1638 | var tree = translate(gpa, &aro_comp, args) catch |err| switch (err) { | 1668 | var tree = translate(gpa, &aro_comp, args) catch |err| switch (err) { |
| 1639 | error.SemanticAnalyzeFail, error.FatalError => { | 1669 | 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, | 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 | defer tree.deinit(gpa); | 1673 | defer tree.deinit(gpa); |
| 1647 | | 1674 | |