@@ -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
0 commit comments