Skip to content

Commit

Permalink
Merge pull request #20865 from ehaas/aro-translate-c-static-assert
Browse files Browse the repository at this point in the history
Aro translate c: Render error diagnostics properly and ignore _Static_assert decls during translation
  • Loading branch information
andrewrk authored Jul 29, 2024
2 parents f7cebf2 + 699e103 commit d60c100
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 7 deletions.
41 changes: 34 additions & 7 deletions lib/compiler/aro_translate_c.zig
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,9 @@ pub fn translate(
var tree = try pp.parse();
defer tree.deinit();

if (driver.comp.diagnostics.errors != 0) {
return error.SemanticAnalyzeFail;
// Workaround for https://github.com/Vexu/arocc/issues/603
for (comp.diagnostics.list.items) |msg| {
if (msg.kind == .@"error" or msg.kind == .@"fatal error") return error.ParsingFailed;
}

const mapper = tree.comp.string_interner.getFastTypeMapper(tree.comp.gpa) catch tree.comp.string_interner.getSlowTypeMapper();
Expand Down Expand Up @@ -227,6 +228,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void {
const decl_name = c.tree.tokSlice(data.decl.name);
try c.global_names.put(c.gpa, decl_name, {});
},
.static_assert => {},
else => unreachable,
}
}
Expand Down Expand Up @@ -304,6 +306,7 @@ fn transDecl(c: *Context, scope: *Scope, decl: NodeIndex) !void {
=> {
try transVarDecl(c, decl, null);
},
.static_assert => try warn(c, &c.global_scope.base, 0, "ignoring _Static_assert declaration", .{}),
else => unreachable,
}
}
Expand Down Expand Up @@ -1622,6 +1625,33 @@ test "Macro matching" {
try helper.checkMacro(allocator, pattern_list, "IGNORE_ME(X) ((volatile const void)(X))", "DISCARD");
}

/// Renders errors and fatal errors + associated notes (e.g. "expanded from here"); does not render warnings or associated notes
/// Terminates with exit code 1
fn renderErrorsAndExit(comp: *aro.Compilation) noreturn {
defer std.process.exit(1);

var writer = aro.Diagnostics.defaultMsgWriter(std.io.tty.detectConfig(std.io.getStdErr()));
defer writer.deinit(); // writer deinit must run *before* exit so that stderr is flushed

var saw_error = false;
for (comp.diagnostics.list.items) |msg| {
switch (msg.kind) {
.@"error", .@"fatal error" => {
saw_error = true;
aro.Diagnostics.renderMessage(comp, &writer, msg);
},
.warning => saw_error = false,
.note => {
if (saw_error) {
aro.Diagnostics.renderMessage(comp, &writer, msg);
}
},
.off => {},
.default => unreachable,
}
}
}

pub fn main() !void {
var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);
defer arena_instance.deinit();
Expand All @@ -1636,12 +1666,9 @@ pub fn main() !void {
defer aro_comp.deinit();

var tree = translate(gpa, &aro_comp, args) catch |err| switch (err) {
error.SemanticAnalyzeFail, error.FatalError => {
aro.Diagnostics.render(&aro_comp, std.io.tty.detectConfig(std.io.getStdErr()));
std.process.exit(1);
},
error.ParsingFailed, error.FatalError => renderErrorsAndExit(&aro_comp),
error.OutOfMemory => return error.OutOfMemory,
error.StreamTooLong => std.zig.fatal("StreamTooLong?", .{}),
error.StreamTooLong => std.zig.fatal("An input file was larger than 4GiB", .{}),
};
defer tree.deinit(gpa);

Expand Down
7 changes: 7 additions & 0 deletions test/cases/translate_c/_Static_assert.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
_Static_assert(1 == 1, "");

// translate-c
// target=x86_64-linux
// c_frontend=aro
//
// tmp.c:1:1: warning: ignoring _Static_assert declaration

0 comments on commit d60c100

Please sign in to comment.