authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2025-09-14 16:41:44+03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-09-24 20:01:19-07:00
logd83c76eb5af687210e3cc856b3f808f7e5f5e68f
tree2013762f112f58f33af58cde7d7c710d9e46204b
parente05073b9e4a7a7a860779d3977a98ee6cd4b6391

update aro & translate-c


17 files changed, 278 insertions(+), 196 deletions(-)

lib/compiler/aro/aro/Attribute.zig+1-6
......@@ -792,12 +792,7 @@ pub fn normalize(name: []const u8) []const u8 {
792792}
793793
794794fn ignoredAttrErr(p: *Parser, tok: TokenIndex, attr: Attribute.Tag, context: []const u8) !void {
795 const strings_top = p.strings.items.len;
796 defer p.strings.items.len = strings_top;
797
798 try p.strings.print("attribute '{s}' ignored on {s}", .{ @tagName(attr), context });
799 const str = try p.comp.diagnostics.arena.allocator().dupe(u8, p.strings.items[strings_top..]);
800 try p.errStr(.ignored_attribute, tok, str);
795 try p.err(tok, .ignored_attribute, .{ @tagName(attr), context });
801796}
802797
803798pub fn applyParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic) !QualType {
lib/compiler/aro/aro/Compilation.zig+45-12
......@@ -132,6 +132,8 @@ sources: std.StringArrayHashMapUnmanaged(Source) = .empty,
132132/// Allocated into `gpa`, but keys are externally managed.
133133include_dirs: std.ArrayList([]const u8) = .empty,
134134/// Allocated into `gpa`, but keys are externally managed.
135iquote_include_dirs: std.ArrayList([]const u8) = .empty,
136/// Allocated into `gpa`, but keys are externally managed.
135137system_include_dirs: std.ArrayList([]const u8) = .empty,
136138/// Allocated into `gpa`, but keys are externally managed.
137139after_include_dirs: std.ArrayList([]const u8) = .empty,
......@@ -192,6 +194,7 @@ pub fn deinit(comp: *Compilation) void {
192194 }
193195 comp.sources.deinit(gpa);
194196 comp.include_dirs.deinit(gpa);
197 comp.iquote_include_dirs.deinit(gpa);
195198 comp.system_include_dirs.deinit(gpa);
196199 comp.after_include_dirs.deinit(gpa);
197200 comp.framework_dirs.deinit(gpa);
......@@ -240,12 +243,26 @@ fn generateSystemDefines(comp: *Compilation, w: *std.Io.Writer) !void {
240243 const ptr_width = comp.target.ptrBitWidth();
241244 const is_gnu = comp.langopts.standard.isGNU();
242245
243 if (comp.langopts.gnuc_version > 0) {
244 try w.print("#define __GNUC__ {d}\n", .{comp.langopts.gnuc_version / 10_000});
245 try w.print("#define __GNUC_MINOR__ {d}\n", .{comp.langopts.gnuc_version / 100 % 100});
246 try w.print("#define __GNUC_PATCHLEVEL__ {d}\n", .{comp.langopts.gnuc_version % 100});
246 const gnuc_version = comp.langopts.gnuc_version orelse comp.langopts.emulate.defaultGccVersion();
247 if (gnuc_version > 0) {
248 try w.print("#define __GNUC__ {d}\n", .{gnuc_version / 10_000});
249 try w.print("#define __GNUC_MINOR__ {d}\n", .{gnuc_version / 100 % 100});
250 try w.print("#define __GNUC_PATCHLEVEL__ {d}\n", .{gnuc_version % 100});
247251 }
248252
253 try w.writeAll(
254 \\#define __ARO_EMULATE_CLANG__ 1
255 \\#define __ARO_EMULATE_GCC__ 2
256 \\#define __ARO_EMULATE_MSVC__ 3
257 \\
258 );
259 const emulated = switch (comp.langopts.emulate) {
260 .clang => "__ARO_EMULATE_CLANG__",
261 .gcc => "__ARO_EMULATE_GCC__",
262 .msvc => "__ARO_EMULATE_MSVC__",
263 };
264 try w.print("#define __ARO_EMULATE__ {s}\n", .{emulated});
265
249266 if (comp.code_gen_options.optimization_level.hasAnyOptimizations()) {
250267 try define(w, "__OPTIMIZE__");
251268 }
......@@ -330,6 +347,8 @@ fn generateSystemDefines(comp: *Compilation, w: *std.Io.Writer) !void {
330347 => try define(w, "__APPLE__"),
331348 .wasi => try define(w, "__wasi__"),
332349 .emscripten => try define(w, "__EMSCRIPTEN__"),
350 .@"3ds" => try define(w, "__3DS__"),
351 .vita => try define(w, "__vita__"),
333352 else => {},
334353 }
335354
......@@ -431,10 +450,13 @@ fn generateSystemDefines(comp: *Compilation, w: *std.Io.Writer) !void {
431450 .{ .f16c, "__F16C__" },
432451 .{ .gfni, "__GFNI__" },
433452 .{ .evex512, "__EVEX512__" },
434 .{ .avx10_1_256, "__AVX10_1__" },
435 .{ .avx10_1_512, "__AVX10_1_512__" },
436 .{ .avx10_2_256, "__AVX10_2__" },
437 .{ .avx10_2_512, "__AVX10_2_512__" },
453
454 .{ .avx10_1, "__AVX10_1__" },
455 .{ .avx10_1, "__AVX10_1_512__" },
456
457 .{ .avx10_2, "__AVX10_2__" },
458 .{ .avx10_2, "__AVX10_2_512__" },
459
438460 .{ .avx512cd, "__AVX512CD__" },
439461 .{ .avx512vpopcntdq, "__AVX512VPOPCNTDQ__" },
440462 .{ .avx512vnni, "__AVX512VNNI__" },
......@@ -935,7 +957,7 @@ fn generateSystemDefines(comp: *Compilation, w: *std.Io.Writer) !void {
935957pub fn generateBuiltinMacros(comp: *Compilation, system_defines_mode: SystemDefinesMode) AddSourceError!Source {
936958 try comp.type_store.initNamedTypes(comp);
937959
938 var allocating: std.io.Writer.Allocating = try .initCapacity(comp.gpa, 2 << 13);
960 var allocating: std.Io.Writer.Allocating = try .initCapacity(comp.gpa, 2 << 13);
939961 defer allocating.deinit();
940962
941963 comp.writeBuiltinMacros(system_defines_mode, &allocating.writer) catch |err| switch (err) {
......@@ -1297,6 +1319,11 @@ fn generateIntWidth(comp: *Compilation, w: *std.Io.Writer, name: []const u8, qt:
12971319 try w.print("#define __{s}_WIDTH__ {d}\n", .{ name, qt.sizeof(comp) * 8 });
12981320}
12991321
1322fn generateIntMaxAndWidth(comp: *Compilation, w: *std.Io.Writer, name: []const u8, qt: QualType) !void {
1323 try comp.generateIntMax(w, name, qt);
1324 try comp.generateIntWidth(w, name, qt);
1325}
1326
13001327fn generateSizeofType(comp: *Compilation, w: *std.Io.Writer, name: []const u8, qt: QualType) !void {
13011328 try w.print("#define {s} {d}\n", .{ name, qt.sizeof(comp) });
13021329}
......@@ -1597,7 +1624,7 @@ pub fn hasInclude(
15971624 which: WhichInclude,
15981625 opt_dep_file: ?*DepFile,
15991626) Compilation.Error!bool {
1600 if (try FindInclude.run(comp, filename, switch (which) {
1627 if (try FindInclude.run(comp, filename, include_type, switch (which) {
16011628 .next => .{ .only_search_after_dir = comp.getSource(includer_token_source).path },
16021629 .first => switch (include_type) {
16031630 .quotes => .{ .allow_same_dir = comp.getSource(includer_token_source).path },
......@@ -1629,6 +1656,7 @@ const FindInclude = struct {
16291656 fn run(
16301657 comp: *Compilation,
16311658 include_path: []const u8,
1659 include_type: IncludeType,
16321660 search_strat: union(enum) {
16331661 allow_same_dir: []const u8,
16341662 only_search,
......@@ -1663,7 +1691,12 @@ const FindInclude = struct {
16631691 find.wait_for = std.fs.path.dirname(other_file);
16641692 },
16651693 }
1666
1694 switch (include_type) {
1695 .quotes => for (comp.iquote_include_dirs.items) |dir| {
1696 if (try find.checkIncludeDir(dir, .user)) |res| return res;
1697 },
1698 .angle_brackets => {},
1699 }
16671700 for (comp.include_dirs.items) |dir| {
16681701 if (try find.checkIncludeDir(dir, .user)) |res| return res;
16691702 }
......@@ -1876,7 +1909,7 @@ pub fn findInclude(
18761909 /// include vs include_next
18771910 which: WhichInclude,
18781911) Compilation.Error!?Source {
1879 const found = try FindInclude.run(comp, filename, switch (which) {
1912 const found = try FindInclude.run(comp, filename, include_type, switch (which) {
18801913 .next => .{ .only_search_after_dir = comp.getSource(includer_token.source).path },
18811914 .first => switch (include_type) {
18821915 .quotes => .{ .allow_same_dir = comp.getSource(includer_token.source).path },
lib/compiler/aro/aro/Diagnostics.zig+18-9
......@@ -194,6 +194,7 @@ pub const Option = enum {
194194 @"microsoft-anon-tag",
195195 @"out-of-scope-function",
196196 @"date-time",
197 @"variadic-macro-arguments-omitted",
197198 @"attribute-todo",
198199
199200 /// GNU extensions
......@@ -496,27 +497,35 @@ pub fn formatArgs(w: *std.Io.Writer, fmt: []const u8, args: anytype) std.Io.Writ
496497 else => switch (@typeInfo(@TypeOf(arg))) {
497498 .int, .comptime_int => try Diagnostics.formatInt(w, fmt[i..], arg),
498499 .pointer => try Diagnostics.formatString(w, fmt[i..], arg),
499 else => unreachable,
500 else => comptime unreachable,
500501 },
501502 };
502503 }
503504 try w.writeAll(fmt[i..]);
504505}
505506
506pub fn formatString(w: *std.Io.Writer, fmt: []const u8, str: []const u8) std.Io.Writer.Error!usize {
507 const template = "{s}";
508 const i = std.mem.indexOf(u8, fmt, template).?;
507pub fn templateIndex(w: *std.Io.Writer, fmt: []const u8, template: []const u8) std.Io.Writer.Error!usize {
508 const i = std.mem.indexOf(u8, fmt, template) orelse {
509 if (@import("builtin").mode == .Debug) {
510 std.debug.panic("template `{s}` not found in format string `{s}`", .{ template, fmt });
511 }
512 try w.print("template `{s}` not found in format string `{s}` (this is a bug in arocc)", .{ template, fmt });
513 return 0;
514 };
509515 try w.writeAll(fmt[0..i]);
510 try w.writeAll(str);
511516 return i + template.len;
512517}
513518
519pub fn formatString(w: *std.Io.Writer, fmt: []const u8, str: []const u8) std.Io.Writer.Error!usize {
520 const i = templateIndex(w, fmt, "{s}");
521 try w.writeAll(str);
522 return i;
523}
524
514525pub fn formatInt(w: *std.Io.Writer, fmt: []const u8, int: anytype) std.Io.Writer.Error!usize {
515 const template = "{d}";
516 const i = std.mem.indexOf(u8, fmt, template).?;
517 try w.writeAll(fmt[0..i]);
526 const i = templateIndex(w, fmt, "{d}");
518527 try w.printInt(int, 10, .lower, .{});
519 return i + template.len;
528 return i;
520529}
521530
522531fn addMessage(d: *Diagnostics, msg: Message) Compilation.Error!void {
lib/compiler/aro/aro/Driver.zig+20-6
......@@ -203,6 +203,7 @@ pub const usage =
203203 \\ -fuse-line-directives Use `#line <num>` linemarkers in preprocessed output
204204 \\ -fno-use-line-directives
205205 \\ Use `# <num>` linemarkers in preprocessed output
206 \\ -iquote <dir> Add directory to QUOTE include search path
206207 \\ -I <dir> Add directory to include search path
207208 \\ -idirafter <dir> Add directory to AFTER include search path
208209 \\ -isystem <dir> Add directory to SYSTEM include search path
......@@ -275,7 +276,7 @@ pub fn parseArgs(
275276 var i: usize = 1;
276277 var comment_arg: []const u8 = "";
277278 var hosted: ?bool = null;
278 var gnuc_version: []const u8 = "4.2.1"; // default value set by clang
279 var gnuc_version: ?[]const u8 = null;
279280 var pic_arg: []const u8 = "";
280281 var declspec_attrs: ?bool = null;
281282 var ms_extensions: ?bool = null;
......@@ -529,6 +530,17 @@ pub fn parseArgs(
529530 path = args[i];
530531 }
531532 try d.comp.system_include_dirs.append(d.comp.gpa, path);
533 } else if (mem.startsWith(u8, arg, "-iquote")) {
534 var path = arg["-iquote".len..];
535 if (path.len == 0) {
536 i += 1;
537 if (i >= args.len) {
538 try d.err("expected argument after -iquote", .{});
539 continue;
540 }
541 path = args[i];
542 }
543 try d.comp.iquote_include_dirs.append(d.comp.gpa, path);
532544 } else if (mem.startsWith(u8, arg, "-F")) {
533545 var path = arg["-F".len..];
534546 if (path.len == 0) {
......@@ -784,11 +796,13 @@ pub fn parseArgs(
784796 d.comp.target.os.tag = .freestanding;
785797 }
786798 }
787 const version = GCCVersion.parse(gnuc_version);
788 if (version.major == -1) {
789 return d.fatal("invalid value '{0s}' in '-fgnuc-version={0s}'", .{gnuc_version});
799 if (gnuc_version) |unwrapped| {
800 const version = GCCVersion.parse(unwrapped);
801 if (version.major == -1) {
802 return d.fatal("invalid value '{s}' in '-fgnuc-version={s}'", .{ unwrapped, unwrapped });
803 }
804 d.comp.langopts.gnuc_version = version.toUnsigned();
790805 }
791 d.comp.langopts.gnuc_version = version.toUnsigned();
792806 const pic_level, const is_pie = try d.getPICMode(pic_arg);
793807 d.comp.code_gen_options.pic_level = pic_level;
794808 d.comp.code_gen_options.is_pie = is_pie;
......@@ -1039,7 +1053,7 @@ fn getRandomFilename(d: *Driver, buf: *[std.fs.max_name_bytes]u8, extension: []c
10391053
10401054 const fmt_template = "/tmp/{s}{s}";
10411055 const fmt_args = .{
1042 random_name,
1056 @as([]const u8, &random_name),
10431057 extension,
10441058 };
10451059 return std.fmt.bufPrint(buf, fmt_template, fmt_args) catch return d.fatal("Filename too long for filesystem: " ++ fmt_template, fmt_args);
lib/compiler/aro/aro/Driver/GCCVersion.zig+1-1
......@@ -57,7 +57,7 @@ pub fn parse(text: []const u8) GCCVersion {
5757 var good = bad;
5858
5959 var it = mem.splitScalar(u8, text, '.');
60 const first = it.next().?;
60 const first = it.first();
6161 const second = it.next() orelse "";
6262 const rest = it.next() orelse "";
6363
lib/compiler/aro/aro/LangOpts.zig+9-1
......@@ -7,6 +7,14 @@ pub const Compiler = enum {
77 clang,
88 gcc,
99 msvc,
10
11 pub fn defaultGccVersion(self: Compiler) u32 {
12 return switch (self) {
13 .clang => 4 * 10_000 + 2 * 100 + 1,
14 .gcc => 7 * 10_000 + 1 * 100 + 0,
15 .msvc => 0,
16 };
17 }
1018};
1119
1220/// The floating-point evaluation method for intermediate results within a single expression
......@@ -139,7 +147,7 @@ preserve_comments_in_macros: bool = false,
139147/// Used ONLY for generating __GNUC__ and related macros. Does not control the presence/absence of any features
140148/// Encoded as major * 10,000 + minor * 100 + patch
141149/// e.g. 4.2.1 == 40201
142gnuc_version: u32 = 0,
150gnuc_version: ?u32 = null,
143151
144152pub fn setStandard(self: *LangOpts, name: []const u8) error{InvalidStandard}!void {
145153 self.standard = Standard.NameMap.get(name) orelse return error.InvalidStandard;
lib/compiler/aro/aro/Parser.zig+40-36
......@@ -469,7 +469,7 @@ fn formatArgs(p: *Parser, w: *std.Io.Writer, fmt: []const u8, args: anytype) !vo
469469 else => switch (@typeInfo(@TypeOf(arg))) {
470470 .int, .comptime_int => try Diagnostics.formatInt(w, fmt[i..], arg),
471471 .pointer => try Diagnostics.formatString(w, fmt[i..], arg),
472 else => unreachable,
472 else => comptime unreachable,
473473 },
474474 };
475475 }
......@@ -477,22 +477,18 @@ fn formatArgs(p: *Parser, w: *std.Io.Writer, fmt: []const u8, args: anytype) !vo
477477}
478478
479479fn formatTokenId(w: *std.Io.Writer, fmt: []const u8, tok_id: Tree.Token.Id) !usize {
480 const template = "{tok_id}";
481 const i = std.mem.indexOf(u8, fmt, template).?;
482 try w.writeAll(fmt[0..i]);
480 const i = Diagnostics.templateIndex(w, fmt, "{tok_id}");
483481 try w.writeAll(tok_id.symbol());
484 return i + template.len;
482 return i;
485483}
486484
487485fn formatQualType(p: *Parser, w: *std.Io.Writer, fmt: []const u8, qt: QualType) !usize {
488 const template = "{qt}";
489 const i = std.mem.indexOf(u8, fmt, template).?;
490 try w.writeAll(fmt[0..i]);
486 const i = Diagnostics.templateIndex(w, fmt, "{qt}");
491487 try w.writeByte('\'');
492488 try qt.print(p.comp, w);
493489 try w.writeByte('\'');
494490
495 if (qt.isC23Auto()) return i + template.len;
491 if (qt.isC23Auto()) return i;
496492 if (qt.get(p.comp, .vector)) |vector_ty| {
497493 try w.print(" (vector of {d} '", .{vector_ty.len});
498494 try vector_ty.elem.printDesugared(p.comp, w);
......@@ -502,14 +498,11 @@ fn formatQualType(p: *Parser, w: *std.Io.Writer, fmt: []const u8, qt: QualType)
502498 try qt.printDesugared(p.comp, w);
503499 try w.writeAll("')");
504500 }
505 return i + template.len;
501 return i;
506502}
507503
508504fn formatResult(p: *Parser, w: *std.Io.Writer, fmt: []const u8, res: Result) !usize {
509 const template = "{value}";
510 const i = std.mem.indexOf(u8, fmt, template).?;
511 try w.writeAll(fmt[0..i]);
512
505 const i = Diagnostics.templateIndex(w, fmt, "{value}");
513506 switch (res.val.opt_ref) {
514507 .none => try w.writeAll("(none)"),
515508 .null => try w.writeAll("nullptr_t"),
......@@ -521,8 +514,7 @@ fn formatResult(p: *Parser, w: *std.Io.Writer, fmt: []const u8, res: Result) !us
521514 },
522515 },
523516 }
524
525 return i + template.len;
517 return i;
526518}
527519
528520const Normalized = struct {
......@@ -532,10 +524,8 @@ const Normalized = struct {
532524 return .{ .str = str };
533525 }
534526
535 pub fn format(ctx: Normalized, w: *std.Io.Writer, fmt_str: []const u8) !usize {
536 const template = "{normalized}";
537 const i = std.mem.indexOf(u8, fmt_str, template).?;
538 try w.writeAll(fmt_str[0..i]);
527 pub fn format(ctx: Normalized, w: *std.Io.Writer, fmt: []const u8) !usize {
528 const i = Diagnostics.templateIndex(w, fmt, "{normalized}");
539529 var it: std.unicode.Utf8Iterator = .{
540530 .bytes = ctx.str,
541531 .i = 0,
......@@ -557,7 +547,7 @@ const Normalized = struct {
557547 });
558548 }
559549 }
560 return i + template.len;
550 return i;
561551 }
562552};
563553
......@@ -568,12 +558,10 @@ const Codepoint = struct {
568558 return .{ .codepoint = codepoint };
569559 }
570560
571 pub fn format(ctx: Codepoint, w: *std.Io.Writer, fmt_str: []const u8) !usize {
572 const template = "{codepoint}";
573 const i = std.mem.indexOf(u8, fmt_str, template).?;
574 try w.writeAll(fmt_str[0..i]);
561 pub fn format(ctx: Codepoint, w: *std.Io.Writer, fmt: []const u8) !usize {
562 const i = Diagnostics.templateIndex(w, fmt, "{codepoint}");
575563 try w.print("{X:0>4}", .{ctx.codepoint});
576 return i + template.len;
564 return i;
577565 }
578566};
579567
......@@ -584,12 +572,10 @@ const Escaped = struct {
584572 return .{ .str = str };
585573 }
586574
587 pub fn format(ctx: Escaped, w: *std.Io.Writer, fmt_str: []const u8) !usize {
588 const template = "{s}";
589 const i = std.mem.indexOf(u8, fmt_str, template).?;
590 try w.writeAll(fmt_str[0..i]);
575 pub fn format(ctx: Escaped, w: *std.Io.Writer, fmt: []const u8) !usize {
576 const i = Diagnostics.templateIndex(w, fmt, "{s}");
591577 try std.zig.stringEscape(ctx.str, w);
592 return i + template.len;
578 return i;
593579 }
594580};
595581
......@@ -626,11 +612,11 @@ pub fn errValueChanged(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, re
626612fn checkDeprecatedUnavailable(p: *Parser, ty: QualType, usage_tok: TokenIndex, decl_tok: TokenIndex) !void {
627613 if (ty.getAttribute(p.comp, .@"error")) |@"error"| {
628614 const msg_str = p.comp.interner.get(@"error".msg.ref()).bytes;
629 try p.err(usage_tok, .error_attribute, .{ p.tokSlice(@"error".__name_tok), std.zig.fmtString(msg_str) });
615 try p.err(usage_tok, .error_attribute, .{ p.tokSlice(@"error".__name_tok), Escaped.init(msg_str) });
630616 }
631617 if (ty.getAttribute(p.comp, .warning)) |warning| {
632618 const msg_str = p.comp.interner.get(warning.msg.ref()).bytes;
633 try p.err(usage_tok, .warning_attribute, .{ p.tokSlice(warning.__name_tok), std.zig.fmtString(msg_str) });
619 try p.err(usage_tok, .warning_attribute, .{ p.tokSlice(warning.__name_tok), Escaped.init(msg_str) });
634620 }
635621 if (ty.getAttribute(p.comp, .unavailable)) |unavailable| {
636622 try p.errDeprecated(usage_tok, .unavailable, unavailable.msg);
......@@ -4734,7 +4720,7 @@ fn asmOperand(p: *Parser, names: *std.ArrayList(?TokenIndex), constraints: *Node
47344720 try constraints.append(gpa, constraint.node);
47354721
47364722 const l_paren = p.eatToken(.l_paren) orelse {
4737 try p.err(p.tok_i, .expected_token, .{ p.tok_ids[p.tok_i], .l_paren });
4723 try p.err(p.tok_i, .expected_token, .{ p.tok_ids[p.tok_i], Token.Id.l_paren });
47384724 return error.ParsingFailed;
47394725 };
47404726 const maybe_res = try p.expr();
......@@ -10221,12 +10207,30 @@ test "Node locations" {
1022110207 try std.testing.expectEqual(0, comp.diagnostics.total);
1022210208 for (tree.root_decls.items[tree.root_decls.items.len - 3 ..], 0..) |node, i| {
1022310209 const slice = tree.tokSlice(node.tok(&tree));
10224 const expected = switch (i) {
10210 const expected_slice = switch (i) {
1022510211 0 => "foo",
1022610212 1 => "bar",
1022710213 2 => "main",
1022810214 else => unreachable,
1022910215 };
10230 try std.testing.expectEqualStrings(expected, slice);
10216 try std.testing.expectEqualStrings(expected_slice, slice);
10217
10218 const loc = node.loc(&tree).expand(&comp);
10219 const expected_col: u32 = switch (i) {
10220 0 => 5,
10221 1 => 5,
10222 2 => 5,
10223 else => unreachable,
10224 };
10225 try std.testing.expectEqual(expected_col, loc.col);
10226
10227 const expected_line_no = i + 1;
10228 try std.testing.expectEqual(expected_line_no, loc.line_no);
10229
10230 const expected_source_path = "file.c";
10231 try std.testing.expectEqualStrings(expected_source_path, loc.path);
10232
10233 const expected_source_kind = Source.Kind.user;
10234 try std.testing.expectEqual(expected_source_kind, loc.kind);
1023110235 }
1023210236}
lib/compiler/aro/aro/Preprocessor.zig+4-1
......@@ -1703,7 +1703,10 @@ fn expandFuncMacro(
17031703 else
17041704 &[1]TokenWithExpansionLocs{tokFromRaw(raw_next)},
17051705 .macro_param, .macro_param_no_expand => getPasteArgs(args.items[raw_next.end]),
1706 .keyword_va_args => variable_arguments.items,
1706 .keyword_va_args => if (variable_arguments.items.len == 0) blk: {
1707 try pp.err(raw_next, .no_argument_variadic_macro, .{});
1708 break :blk &[1]TokenWithExpansionLocs{.{ .id = .placemarker, .loc = .{ .id = .generated } }};
1709 } else variable_arguments.items,
17071710 .keyword_va_opt => blk: {
17081711 try pp.expandVaOpt(&va_opt_buf, raw_next, variable_arguments.items.len != 0);
17091712 if (va_opt_buf.items.len == 0) break;
lib/compiler/aro/aro/Preprocessor/Diagnostic.zig+7
......@@ -449,3 +449,10 @@ pub const date_time: Diagnostic = .{
449449 .opt = .@"date-time",
450450 .show_in_system_headers = true,
451451};
452
453pub const no_argument_variadic_macro: Diagnostic = .{
454 .fmt = "passing no argument for the '...' parameter of a variadic macro is incompatible with C standards before C23",
455 .opt = .@"variadic-macro-arguments-omitted",
456 .kind = .off,
457 .extension = true,
458};
lib/compiler/aro/aro/Tree.zig+2-2
......@@ -1699,9 +1699,9 @@ pub const Node = union(enum) {
16991699 return tree.nodes.items(.tok)[@intFromEnum(index)];
17001700 }
17011701
1702 pub fn loc(index: Index, tree: *const Tree) ?Source.Location {
1702 pub fn loc(index: Index, tree: *const Tree) Source.Location {
17031703 const tok_i = index.tok(tree);
1704 return tree.tokens.items(.loc)[@intFromEnum(tok_i)];
1704 return tree.tokens.items(.loc)[tok_i];
17051705 }
17061706
17071707 pub fn qt(index: Index, tree: *const Tree) QualType {
lib/compiler/aro/aro/target.zig+3-1
......@@ -681,10 +681,12 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 {
681681 .driverkit => "driverkit",
682682 .visionos => "xros",
683683 .serenity => "serenity",
684 .vulkan => "vulkan",
684685 .managarm => "managarm",
686 .@"3ds",
687 .vita,
685688 .opencl,
686689 .opengl,
687 .vulkan,
688690 .plan9,
689691 .other,
690692 => "unknown",
lib/compiler/aro/aro/text_literal.zig+4-7
......@@ -154,17 +154,14 @@ pub const Ascii = struct {
154154 return .{ .val = @intCast(val) };
155155 }
156156
157 pub fn format(ctx: Ascii, w: *std.Io.Writer, fmt_str: []const u8) !usize {
158 const template = "{c}";
159 const i = std.mem.indexOf(u8, fmt_str, template).?;
160 try w.writeAll(fmt_str[0..i]);
161
157 pub fn format(ctx: Ascii, w: *std.Io.Writer, fmt: []const u8) !usize {
158 const i = Diagnostics.templateIndex(w, fmt, "{c}");
162159 if (std.ascii.isPrint(ctx.val)) {
163160 try w.writeByte(ctx.val);
164161 } else {
165162 try w.print("x{x:0>2}", .{ctx.val});
166163 }
167 return i + template.len;
164 return i;
168165 }
169166};
170167
......@@ -345,7 +342,7 @@ pub const Parser = struct {
345342 else => switch (@typeInfo(@TypeOf(arg))) {
346343 .int, .comptime_int => try Diagnostics.formatInt(w, fmt[i..], arg),
347344 .pointer => try Diagnostics.formatString(w, fmt[i..], arg),
348 else => unreachable,
345 else => comptime unreachable,
349346 },
350347 };
351348 }
lib/compiler/translate-c/MacroTranslator.zig+59-52
......@@ -175,8 +175,10 @@ pub fn transMacro(mt: *MacroTranslator) ParseError!void {
175175}
176176
177177fn createMacroFn(mt: *MacroTranslator, name: []const u8, ref: ZigNode, proto_alias: *ast.Payload.Func) !ZigNode {
178 var fn_params = std.array_list.Managed(ast.Payload.Param).init(mt.t.gpa);
179 defer fn_params.deinit();
178 const gpa = mt.t.gpa;
179 const arena = mt.t.arena;
180 var fn_params: std.ArrayList(ast.Payload.Param) = .empty;
181 defer fn_params.deinit(gpa);
180182
181183 var block_scope = try Scope.Block.init(mt.t, &mt.t.global_scope.base, false);
182184 defer block_scope.deinit();
......@@ -184,7 +186,7 @@ fn createMacroFn(mt: *MacroTranslator, name: []const u8, ref: ZigNode, proto_ali
184186 for (proto_alias.data.params) |param| {
185187 const param_name = try block_scope.makeMangledName(param.name orelse "arg");
186188
187 try fn_params.append(.{
189 try fn_params.append(gpa, .{
188190 .name = param_name,
189191 .type = param.type,
190192 .is_noalias = param.is_noalias,
......@@ -198,27 +200,28 @@ fn createMacroFn(mt: *MacroTranslator, name: []const u8, ref: ZigNode, proto_ali
198200 else
199201 unreachable;
200202
201 const unwrap_expr = try ZigTag.unwrap.create(mt.t.arena, init);
202 const args = try mt.t.arena.alloc(ZigNode, fn_params.items.len);
203 const unwrap_expr = try ZigTag.unwrap.create(arena, init);
204 const args = try arena.alloc(ZigNode, fn_params.items.len);
203205 for (fn_params.items, 0..) |param, i| {
204 args[i] = try ZigTag.identifier.create(mt.t.arena, param.name.?);
206 args[i] = try ZigTag.identifier.create(arena, param.name.?);
205207 }
206 const call_expr = try ZigTag.call.create(mt.t.arena, .{
208 const call_expr = try ZigTag.call.create(arena, .{
207209 .lhs = unwrap_expr,
208210 .args = args,
209211 });
210 const return_expr = try ZigTag.@"return".create(mt.t.arena, call_expr);
211 const block = try ZigTag.block_single.create(mt.t.arena, return_expr);
212 const return_expr = try ZigTag.@"return".create(arena, call_expr);
213 const block = try ZigTag.block_single.create(arena, return_expr);
212214
213 return ZigTag.pub_inline_fn.create(mt.t.arena, .{
215 return ZigTag.pub_inline_fn.create(arena, .{
214216 .name = name,
215 .params = try mt.t.arena.dupe(ast.Payload.Param, fn_params.items),
217 .params = try arena.dupe(ast.Payload.Param, fn_params.items),
216218 .return_type = proto_alias.data.return_type,
217219 .body = block,
218220 });
219221}
220222
221223fn parseCExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
224 const arena = mt.t.arena;
222225 // TODO parseCAssignExpr here
223226 var block_scope = try Scope.Block.init(mt.t, scope, true);
224227 defer block_scope.deinit();
......@@ -229,14 +232,14 @@ fn parseCExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
229232 var last = node;
230233 while (true) {
231234 // suppress result
232 const ignore = try ZigTag.discard.create(mt.t.arena, .{ .should_skip = false, .value = last });
235 const ignore = try ZigTag.discard.create(arena, .{ .should_skip = false, .value = last });
233236 try block_scope.statements.append(mt.t.gpa, ignore);
234237
235238 last = try mt.parseCCondExpr(&block_scope.base);
236239 if (!mt.eat(.comma)) break;
237240 }
238241
239 const break_node = try ZigTag.break_val.create(mt.t.arena, .{
242 const break_node = try ZigTag.break_val.create(arena, .{
240243 .label = block_scope.label,
241244 .val = last,
242245 });
......@@ -245,10 +248,11 @@ fn parseCExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
245248}
246249
247250fn parseCNumLit(mt: *MacroTranslator) ParseError!ZigNode {
251 const arena = mt.t.arena;
248252 const lit_bytes = mt.tokSlice();
249253 mt.i += 1;
250254
251 var bytes = try std.ArrayListUnmanaged(u8).initCapacity(mt.t.arena, lit_bytes.len + 3);
255 var bytes = try std.ArrayListUnmanaged(u8).initCapacity(arena, lit_bytes.len + 3);
252256
253257 const prefix = aro.Tree.Token.NumberPrefix.fromString(lit_bytes);
254258 switch (prefix) {
......@@ -330,7 +334,7 @@ fn parseCNumLit(mt: *MacroTranslator) ParseError!ZigNode {
330334 }
331335
332336 if (is_float) {
333 const type_node = try ZigTag.type.create(mt.t.arena, switch (suffix) {
337 const type_node = try ZigTag.type.create(arena, switch (suffix) {
334338 .F16 => "f16",
335339 .F => "f32",
336340 .None => "f64",
......@@ -339,10 +343,10 @@ fn parseCNumLit(mt: *MacroTranslator) ParseError!ZigNode {
339343 .Q, .F128 => "f128",
340344 else => unreachable,
341345 });
342 const rhs = try ZigTag.float_literal.create(mt.t.arena, bytes.items);
343 return ZigTag.as.create(mt.t.arena, .{ .lhs = type_node, .rhs = rhs });
346 const rhs = try ZigTag.float_literal.create(arena, bytes.items);
347 return ZigTag.as.create(arena, .{ .lhs = type_node, .rhs = rhs });
344348 } else {
345 const type_node = try ZigTag.type.create(mt.t.arena, switch (suffix) {
349 const type_node = try ZigTag.type.create(arena, switch (suffix) {
346350 .None => "c_int",
347351 .U => "c_uint",
348352 .L => "c_long",
......@@ -365,11 +369,11 @@ fn parseCNumLit(mt: *MacroTranslator) ParseError!ZigNode {
365369 else => unreachable,
366370 };
367371
368 const literal_node = try ZigTag.integer_literal.create(mt.t.arena, bytes.items);
372 const literal_node = try ZigTag.integer_literal.create(arena, bytes.items);
369373 if (guaranteed_to_fit) {
370 return ZigTag.as.create(mt.t.arena, .{ .lhs = type_node, .rhs = literal_node });
374 return ZigTag.as.create(arena, .{ .lhs = type_node, .rhs = literal_node });
371375 } else {
372 return mt.t.createHelperCallNode(.promoteIntLiteral, &.{ type_node, literal_node, try ZigTag.enum_literal.create(mt.t.arena, @tagName(prefix)) });
376 return mt.t.createHelperCallNode(.promoteIntLiteral, &.{ type_node, literal_node, try ZigTag.enum_literal.create(arena, @tagName(prefix)) });
373377 }
374378 }
375379}
......@@ -563,6 +567,7 @@ fn escapeUnprintables(mt: *MacroTranslator) ![]const u8 {
563567}
564568
565569fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
570 const arena = mt.t.arena;
566571 const tok = mt.peek();
567572 switch (tok) {
568573 .char_literal,
......@@ -573,12 +578,12 @@ fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
573578 => {
574579 const slice = mt.tokSlice();
575580 if (slice[0] != '\'' or slice[1] == '\\' or slice.len == 3) {
576 return ZigTag.char_literal.create(mt.t.arena, try mt.escapeUnprintables());
581 return ZigTag.char_literal.create(arena, try mt.escapeUnprintables());
577582 } else {
578583 mt.i += 1;
579584
580 const str = try std.fmt.allocPrint(mt.t.arena, "0x{x}", .{slice[1 .. slice.len - 1]});
581 return ZigTag.integer_literal.create(mt.t.arena, str);
585 const str = try std.fmt.allocPrint(arena, "0x{x}", .{slice[1 .. slice.len - 1]});
586 return ZigTag.integer_literal.create(arena, str);
582587 }
583588 },
584589 .string_literal,
......@@ -586,7 +591,7 @@ fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
586591 .string_literal_utf_8,
587592 .string_literal_utf_32,
588593 .string_literal_wide,
589 => return ZigTag.string_literal.create(mt.t.arena, try mt.escapeUnprintables()),
594 => return ZigTag.string_literal.create(arena, try mt.escapeUnprintables()),
590595 .pp_num => return mt.parseCNumLit(),
591596 .l_paren => {
592597 mt.i += 1;
......@@ -600,7 +605,7 @@ fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
600605 mt.i += 1;
601606
602607 const mangled_name = scope.getAlias(param) orelse param;
603 return try ZigTag.identifier.create(mt.t.arena, mangled_name);
608 return try ZigTag.identifier.create(arena, mangled_name);
604609 },
605610 .identifier, .extended_identifier => {
606611 const slice = mt.tokSlice();
......@@ -608,17 +613,17 @@ fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
608613
609614 const mangled_name = scope.getAlias(slice) orelse slice;
610615 if (Translator.builtin_typedef_map.get(mangled_name)) |ty| {
611 return ZigTag.type.create(mt.t.arena, ty);
616 return ZigTag.type.create(arena, ty);
612617 }
613618 if (builtins.map.get(mangled_name)) |builtin| {
614 const builtin_identifier = try ZigTag.identifier.create(mt.t.arena, "__builtin");
615 return ZigTag.field_access.create(mt.t.arena, .{
619 const builtin_identifier = try ZigTag.identifier.create(arena, "__builtin");
620 return ZigTag.field_access.create(arena, .{
616621 .lhs = builtin_identifier,
617622 .field_name = builtin.name,
618623 });
619624 }
620625
621 const identifier = try ZigTag.identifier.create(mt.t.arena, mangled_name);
626 const identifier = try ZigTag.identifier.create(arena, mangled_name);
622627 scope.skipVariableDiscard(mangled_name);
623628 refs_var: {
624629 const ident_node = mt.t.global_scope.sym_table.get(slice) orelse break :refs_var;
......@@ -1114,6 +1119,8 @@ fn parseCPostfixExpr(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNode) P
11141119}
11151120
11161121fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNode) ParseError!ZigNode {
1122 const gpa = mt.t.gpa;
1123 const arena = mt.t.arena;
11171124 var node = type_name orelse try mt.parseCPrimaryExpr(scope);
11181125 while (true) {
11191126 switch (mt.peek()) {
......@@ -1122,39 +1129,39 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo
11221129 const field_name = mt.tokSlice();
11231130 try mt.expect(.identifier);
11241131
1125 node = try ZigTag.field_access.create(mt.t.arena, .{ .lhs = node, .field_name = field_name });
1132 node = try ZigTag.field_access.create(arena, .{ .lhs = node, .field_name = field_name });
11261133 },
11271134 .arrow => {
11281135 mt.i += 1;
11291136 const field_name = mt.tokSlice();
11301137 try mt.expect(.identifier);
11311138
1132 const deref = try ZigTag.deref.create(mt.t.arena, node);
1133 node = try ZigTag.field_access.create(mt.t.arena, .{ .lhs = deref, .field_name = field_name });
1139 const deref = try ZigTag.deref.create(arena, node);
1140 node = try ZigTag.field_access.create(arena, .{ .lhs = deref, .field_name = field_name });
11341141 },
11351142 .l_bracket => {
11361143 mt.i += 1;
11371144
11381145 const index_val = try mt.macroIntFromBool(try mt.parseCExpr(scope));
1139 const index = try ZigTag.as.create(mt.t.arena, .{
1140 .lhs = try ZigTag.type.create(mt.t.arena, "usize"),
1141 .rhs = try ZigTag.int_cast.create(mt.t.arena, index_val),
1146 const index = try ZigTag.as.create(arena, .{
1147 .lhs = try ZigTag.type.create(arena, "usize"),
1148 .rhs = try ZigTag.int_cast.create(arena, index_val),
11421149 });
1143 node = try ZigTag.array_access.create(mt.t.arena, .{ .lhs = node, .rhs = index });
1150 node = try ZigTag.array_access.create(arena, .{ .lhs = node, .rhs = index });
11441151 try mt.expect(.r_bracket);
11451152 },
11461153 .l_paren => {
11471154 mt.i += 1;
11481155
11491156 if (mt.eat(.r_paren)) {
1150 node = try ZigTag.call.create(mt.t.arena, .{ .lhs = node, .args = &.{} });
1157 node = try ZigTag.call.create(arena, .{ .lhs = node, .args = &.{} });
11511158 } else {
1152 var args = std.array_list.Managed(ZigNode).init(mt.t.gpa);
1153 defer args.deinit();
1159 var args: std.ArrayList(ZigNode) = .empty;
1160 defer args.deinit(gpa);
11541161
11551162 while (true) {
11561163 const arg = try mt.parseCCondExpr(scope);
1157 try args.append(arg);
1164 try args.append(gpa, arg);
11581165
11591166 const next_id = mt.peek();
11601167 switch (next_id) {
......@@ -1171,7 +1178,7 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo
11711178 },
11721179 }
11731180 }
1174 node = try ZigTag.call.create(mt.t.arena, .{ .lhs = node, .args = try mt.t.arena.dupe(ZigNode, args.items) });
1181 node = try ZigTag.call.create(arena, .{ .lhs = node, .args = try arena.dupe(ZigNode, args.items) });
11751182 }
11761183 },
11771184 .l_brace => {
......@@ -1179,8 +1186,8 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo
11791186
11801187 // Check for designated field initializers
11811188 if (mt.peek() == .period) {
1182 var init_vals = std.array_list.Managed(ast.Payload.ContainerInitDot.Initializer).init(mt.t.gpa);
1183 defer init_vals.deinit();
1189 var init_vals: std.ArrayList(ast.Payload.ContainerInitDot.Initializer) = .empty;
1190 defer init_vals.deinit(gpa);
11841191
11851192 while (true) {
11861193 try mt.expect(.period);
......@@ -1189,7 +1196,7 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo
11891196 try mt.expect(.equal);
11901197
11911198 const val = try mt.parseCCondExpr(scope);
1192 try init_vals.append(.{ .name = name, .value = val });
1199 try init_vals.append(gpa, .{ .name = name, .value = val });
11931200
11941201 const next_id = mt.peek();
11951202 switch (next_id) {
......@@ -1206,17 +1213,17 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo
12061213 },
12071214 }
12081215 }
1209 const tuple_node = try ZigTag.container_init_dot.create(mt.t.arena, try mt.t.arena.dupe(ast.Payload.ContainerInitDot.Initializer, init_vals.items));
1210 node = try ZigTag.std_mem_zeroinit.create(mt.t.arena, .{ .lhs = node, .rhs = tuple_node });
1216 const tuple_node = try ZigTag.container_init_dot.create(arena, try arena.dupe(ast.Payload.ContainerInitDot.Initializer, init_vals.items));
1217 node = try ZigTag.std_mem_zeroinit.create(arena, .{ .lhs = node, .rhs = tuple_node });
12111218 continue;
12121219 }
12131220
1214 var init_vals = std.array_list.Managed(ZigNode).init(mt.t.gpa);
1215 defer init_vals.deinit();
1221 var init_vals: std.ArrayList(ZigNode) = .empty;
1222 defer init_vals.deinit(gpa);
12161223
12171224 while (true) {
12181225 const val = try mt.parseCCondExpr(scope);
1219 try init_vals.append(val);
1226 try init_vals.append(gpa, val);
12201227
12211228 const next_id = mt.peek();
12221229 switch (next_id) {
......@@ -1233,8 +1240,8 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo
12331240 },
12341241 }
12351242 }
1236 const tuple_node = try ZigTag.tuple.create(mt.t.arena, try mt.t.arena.dupe(ZigNode, init_vals.items));
1237 node = try ZigTag.std_mem_zeroinit.create(mt.t.arena, .{ .lhs = node, .rhs = tuple_node });
1243 const tuple_node = try ZigTag.tuple.create(arena, try arena.dupe(ZigNode, init_vals.items));
1244 node = try ZigTag.std_mem_zeroinit.create(arena, .{ .lhs = node, .rhs = tuple_node });
12381245 },
12391246 .plus_plus, .minus_minus => {
12401247 try mt.fail("TODO postfix inc/dec expr", .{});
lib/compiler/translate-c/PatternList.zig+10-10
......@@ -91,11 +91,11 @@ const Pattern = struct {
9191 fn init(pl: *Pattern, allocator: mem.Allocator, template: Template) Error!void {
9292 const source = template[0];
9393 const impl = template[1];
94 var tok_list = std.array_list.Managed(CToken).init(allocator);
95 defer tok_list.deinit();
94 var tok_list: std.ArrayList(CToken) = .empty;
95 defer tok_list.deinit(allocator);
9696
9797 pl.* = .{
98 .slicer = try tokenizeMacro(source, &tok_list),
98 .slicer = try tokenizeMacro(allocator, source, &tok_list),
9999 .impl = impl,
100100 };
101101 }
......@@ -170,7 +170,7 @@ pub fn match(pl: PatternList, ms: MacroSlicer) Error!?Impl {
170170 return null;
171171}
172172
173fn tokenizeMacro(source: []const u8, tok_list: *std.array_list.Managed(CToken)) Error!MacroSlicer {
173fn tokenizeMacro(allocator: mem.Allocator, source: []const u8, tok_list: *std.ArrayList(CToken)) Error!MacroSlicer {
174174 var param_count: u32 = 0;
175175 var param_buf: [8][]const u8 = undefined;
176176
......@@ -207,7 +207,7 @@ fn tokenizeMacro(source: []const u8, tok_list: *std.array_list.Managed(CToken))
207207 const slice = source[tok.start..tok.end];
208208 for (param_buf[0..param_count], 0..) |param, i| {
209209 if (std.mem.eql(u8, param, slice)) {
210 try tok_list.append(.{
210 try tok_list.append(allocator, .{
211211 .id = .macro_param,
212212 .source = .unused,
213213 .end = @intCast(i),
......@@ -224,12 +224,12 @@ fn tokenizeMacro(source: []const u8, tok_list: *std.array_list.Managed(CToken))
224224 .nl, .eof => break,
225225 else => {},
226226 }
227 try tok_list.append(tok);
227 try tok_list.append(allocator, tok);
228228 }
229229
230230 return .{
231231 .source = source,
232 .tokens = try tok_list.toOwnedSlice(),
232 .tokens = try tok_list.toOwnedSlice(allocator),
233233 .params = param_count,
234234 };
235235}
......@@ -243,9 +243,9 @@ test "Macro matching" {
243243 source: []const u8,
244244 comptime expected_match: ?Impl,
245245 ) !void {
246 var tok_list = std.array_list.Managed(CToken).init(allocator);
247 defer tok_list.deinit();
248 const ms = try tokenizeMacro(source, &tok_list);
246 var tok_list: std.ArrayList(CToken) = .empty;
247 defer tok_list.deinit(allocator);
248 const ms = try tokenizeMacro(allocator, source, &tok_list);
249249 defer allocator.free(ms.tokens);
250250
251251 const matched = try pattern_list.match(ms);
lib/compiler/translate-c/Translator.zig+26-25
......@@ -216,10 +216,10 @@ pub fn translate(options: Options) mem.Allocator.Error![]u8 {
216216
217217 try translator.global_scope.processContainerMemberFns();
218218
219 var aw: std.Io.Writer.Allocating = .init(gpa);
220 defer aw.deinit();
219 var allocating: std.Io.Writer.Allocating = .init(gpa);
220 defer allocating.deinit();
221221
222 aw.writer.writeAll(
222 allocating.writer.writeAll(
223223 \\pub const __builtin = @import("std").zig.c_translation.builtins;
224224 \\pub const __helpers = @import("std").zig.c_translation.helpers;
225225 \\
......@@ -231,8 +231,8 @@ pub fn translate(options: Options) mem.Allocator.Error![]u8 {
231231 gpa.free(zig_ast.source);
232232 zig_ast.deinit(gpa);
233233 }
234 zig_ast.render(gpa, &aw.writer, .{}) catch return error.OutOfMemory;
235 return aw.toOwnedSlice();
234 zig_ast.render(gpa, &allocating.writer, .{}) catch return error.OutOfMemory;
235 return allocating.toOwnedSlice();
236236}
237237
238238fn prepopulateGlobalNameTable(t: *Translator) !void {
......@@ -489,11 +489,12 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
489489 break :init ZigTag.opaque_literal.init();
490490 }
491491
492 var fields = try std.array_list.Managed(ast.Payload.Container.Field).initCapacity(t.gpa, record_ty.fields.len);
493 defer fields.deinit();
492 var fields: std.ArrayList(ast.Payload.Container.Field) = .empty;
493 defer fields.deinit(t.gpa);
494 try fields.ensureUnusedCapacity(t.gpa, record_ty.fields.len);
494495
495 var functions = std.array_list.Managed(ZigNode).init(t.gpa);
496 defer functions.deinit();
496 var functions: std.ArrayList(ZigNode) = .empty;
497 defer functions.deinit(t.gpa);
497498
498499 var unnamed_field_count: u32 = 0;
499500
......@@ -558,7 +559,7 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
558559 field_name = try std.fmt.allocPrint(t.arena, "_{s}", .{field_name});
559560
560561 const member = try t.createFlexibleMemberFn(member_name, field_name);
561 try functions.append(member);
562 try functions.append(t.gpa, member);
562563
563564 break :field_type zero_array;
564565 }
......@@ -600,7 +601,7 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
600601 const padding_bits = record_ty.layout.?.size_bits;
601602 const alignment_bits = record_ty.layout.?.field_alignment_bits;
602603
603 try fields.append(.{
604 try fields.append(t.gpa, .{
604605 .name = "_padding",
605606 .type = try ZigTag.type.create(t.arena, try std.fmt.allocPrint(t.arena, "u{d}", .{padding_bits})),
606607 .alignment = @divExact(alignment_bits, 8),
......@@ -1789,8 +1790,8 @@ fn transSwitch(t: *Translator, scope: *Scope, switch_stmt: Node.SwitchStmt) Tran
17891790 defer cond_scope.deinit();
17901791 const switch_expr = try t.transExpr(&cond_scope.base, switch_stmt.cond, .used);
17911792
1792 var cases = std.array_list.Managed(ZigNode).init(t.gpa);
1793 defer cases.deinit();
1793 var cases: std.ArrayList(ZigNode) = .empty;
1794 defer cases.deinit(t.gpa);
17941795 var has_default = false;
17951796
17961797 const body_node = switch_stmt.body.get(t.tree);
......@@ -1803,21 +1804,21 @@ fn transSwitch(t: *Translator, scope: *Scope, switch_stmt: Node.SwitchStmt) Tran
18031804 for (body, 0..) |stmt, i| {
18041805 switch (stmt.get(t.tree)) {
18051806 .case_stmt => {
1806 var items = std.array_list.Managed(ZigNode).init(t.gpa);
1807 defer items.deinit();
1807 var items: std.ArrayList(ZigNode) = .empty;
1808 defer items.deinit(t.gpa);
18081809 const sub = try t.transCaseStmt(base_scope, stmt, &items);
18091810 const res = try t.transSwitchProngStmt(base_scope, sub, body[i..]);
18101811
18111812 if (items.items.len == 0) {
18121813 has_default = true;
18131814 const switch_else = try ZigTag.switch_else.create(t.arena, res);
1814 try cases.append(switch_else);
1815 try cases.append(t.gpa, switch_else);
18151816 } else {
18161817 const switch_prong = try ZigTag.switch_prong.create(t.arena, .{
18171818 .cases = try t.arena.dupe(ZigNode, items.items),
18181819 .cond = res,
18191820 });
1820 try cases.append(switch_prong);
1821 try cases.append(t.gpa, switch_prong);
18211822 }
18221823 },
18231824 .default_stmt => |default_stmt| {
......@@ -1833,7 +1834,7 @@ fn transSwitch(t: *Translator, scope: *Scope, switch_stmt: Node.SwitchStmt) Tran
18331834 const res = try t.transSwitchProngStmt(base_scope, sub, body[i..]);
18341835
18351836 const switch_else = try ZigTag.switch_else.create(t.arena, res);
1836 try cases.append(switch_else);
1837 try cases.append(t.gpa, switch_else);
18371838 },
18381839 else => {}, // collected in transSwitchProngStmt
18391840 }
......@@ -1841,7 +1842,7 @@ fn transSwitch(t: *Translator, scope: *Scope, switch_stmt: Node.SwitchStmt) Tran
18411842
18421843 if (!has_default) {
18431844 const else_prong = try ZigTag.switch_else.create(t.arena, ZigTag.empty_block.init());
1844 try cases.append(else_prong);
1845 try cases.append(t.gpa, else_prong);
18451846 }
18461847
18471848 const switch_node = try ZigTag.@"switch".create(t.arena, .{
......@@ -1861,7 +1862,7 @@ fn transCaseStmt(
18611862 t: *Translator,
18621863 scope: *Scope,
18631864 stmt: Node.Index,
1864 items: *std.array_list.Managed(ZigNode),
1865 items: *std.ArrayList(ZigNode),
18651866) TransError!Node.Index {
18661867 var sub = stmt;
18671868 var seen_default = false;
......@@ -1886,7 +1887,7 @@ fn transCaseStmt(
18861887 break :blk try ZigTag.ellipsis3.create(t.arena, .{ .lhs = start_node, .rhs = end_node });
18871888 } else try t.transExpr(scope, case_stmt.start, .used);
18881889
1889 try items.append(expr);
1890 try items.append(t.gpa, expr);
18901891 sub = case_stmt.body;
18911892 },
18921893 else => return sub,
......@@ -3873,7 +3874,7 @@ fn createNumberNode(t: *Translator, num: anytype, num_kind: enum { int, float })
38733874
38743875fn createCharLiteralNode(t: *Translator, narrow: bool, val: u32) TransError!ZigNode {
38753876 return ZigTag.char_literal.create(t.arena, if (narrow)
3876 try std.fmt.allocPrint(t.arena, "'{f}'", .{std.zig.fmtChar(@intCast(val))})
3877 try std.fmt.allocPrint(t.arena, "'{f}'", .{std.zig.fmtChar(@as(u8, @intCast(val)))})
38773878 else
38783879 try std.fmt.allocPrint(t.arena, "'\\u{{{x}}}'", .{val}));
38793880}
......@@ -3986,8 +3987,8 @@ fn createFlexibleMemberFn(
39863987// =================
39873988
39883989fn transMacros(t: *Translator) !void {
3989 var tok_list = std.array_list.Managed(CToken).init(t.gpa);
3990 defer tok_list.deinit();
3990 var tok_list: std.ArrayList(CToken) = .empty;
3991 defer tok_list.deinit(t.gpa);
39913992
39923993 var pattern_list = try PatternList.init(t.gpa);
39933994 defer pattern_list.deinit(t.gpa);
......@@ -3999,7 +4000,7 @@ fn transMacros(t: *Translator) !void {
39994000 }
40004001
40014002 tok_list.items.len = 0;
4002 try tok_list.ensureUnusedCapacity(macro.tokens.len);
4003 try tok_list.ensureUnusedCapacity(t.gpa, macro.tokens.len);
40034004 for (macro.tokens) |tok| {
40044005 switch (tok.id) {
40054006 .invalid => continue,
lib/compiler/translate-c/ast.zig+23-23
......@@ -798,9 +798,8 @@ pub const Payload = struct {
798798pub fn render(gpa: Allocator, nodes: []const Node) !std.zig.Ast {
799799 var ctx: Context = .{
800800 .gpa = gpa,
801 .buf = std.array_list.Managed(u8).init(gpa),
802801 };
803 defer ctx.buf.deinit();
802 defer ctx.buf.deinit(gpa);
804803 defer ctx.nodes.deinit(gpa);
805804 defer ctx.extra_data.deinit(gpa);
806805 defer ctx.tokens.deinit(gpa);
......@@ -813,7 +812,7 @@ pub fn render(gpa: Allocator, nodes: []const Node) !std.zig.Ast {
813812 try ctx.tokens.ensureTotalCapacity(gpa, estimated_tokens_count);
814813 // Estimate that each each token is 3 bytes long.
815814 const estimated_buf_len = estimated_tokens_count * 3;
816 try ctx.buf.ensureTotalCapacity(estimated_buf_len);
815 try ctx.buf.ensureTotalCapacity(gpa, estimated_buf_len);
817816
818817 ctx.nodes.appendAssumeCapacity(.{
819818 .tag = .root,
......@@ -822,12 +821,12 @@ pub fn render(gpa: Allocator, nodes: []const Node) !std.zig.Ast {
822821 });
823822
824823 const root_members = blk: {
825 var result = std.array_list.Managed(NodeIndex).init(gpa);
826 defer result.deinit();
824 var result: std.ArrayList(NodeIndex) = .empty;
825 defer result.deinit(gpa);
827826
828827 for (nodes) |node| {
829828 const res = (try renderNodeOpt(&ctx, node)) orelse continue;
830 try result.append(res);
829 try result.append(gpa, res);
831830 }
832831 break :blk try ctx.listToSpan(result.items);
833832 };
......@@ -843,7 +842,7 @@ pub fn render(gpa: Allocator, nodes: []const Node) !std.zig.Ast {
843842 });
844843
845844 return .{
846 .source = try ctx.buf.toOwnedSliceSentinel(0),
845 .source = try ctx.buf.toOwnedSliceSentinel(gpa, 0),
847846 .tokens = ctx.tokens.toOwnedSlice(),
848847 .nodes = ctx.nodes.toOwnedSlice(),
849848 .extra_data = try ctx.extra_data.toOwnedSlice(gpa),
......@@ -859,14 +858,14 @@ const TokenTag = std.zig.Token.Tag;
859858
860859const Context = struct {
861860 gpa: Allocator,
862 buf: std.array_list.Managed(u8),
863 nodes: std.zig.Ast.NodeList = .{},
861 buf: std.ArrayList(u8) = .empty,
862 nodes: std.zig.Ast.NodeList = .empty,
864863 extra_data: std.ArrayListUnmanaged(u32) = .empty,
865 tokens: std.zig.Ast.TokenList = .{},
864 tokens: std.zig.Ast.TokenList = .empty,
866865
867866 fn addTokenFmt(c: *Context, tag: TokenTag, comptime format: []const u8, args: anytype) Allocator.Error!TokenIndex {
868867 const start_index = c.buf.items.len;
869 try c.buf.print(format ++ " ", args);
868 try c.buf.print(c.gpa, format ++ " ", args);
870869
871870 try c.tokens.append(c.gpa, .{
872871 .tag = tag,
......@@ -925,8 +924,8 @@ fn renderNodeOpt(c: *Context, node: Node) Allocator.Error!?NodeIndex {
925924 switch (node.tag()) {
926925 .warning => {
927926 const payload = node.castTag(.warning).?.data;
928 try c.buf.appendSlice(payload);
929 try c.buf.append('\n');
927 try c.buf.appendSlice(c.gpa, payload);
928 try c.buf.append(c.gpa, '\n');
930929 return null;
931930 },
932931 .discard => {
......@@ -1687,12 +1686,12 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
16871686 }
16881687 const l_brace = try c.addToken(.l_brace, "{");
16891688
1690 var stmts = std.array_list.Managed(NodeIndex).init(c.gpa);
1691 defer stmts.deinit();
1689 var stmts: std.ArrayList(NodeIndex) = .empty;
1690 defer stmts.deinit(c.gpa);
16921691 for (payload.stmts) |stmt| {
16931692 const res = (try renderNodeOpt(c, stmt)) orelse continue;
16941693 try addSemicolonIfNeeded(c, stmt);
1695 try stmts.append(res);
1694 try stmts.append(c.gpa, res);
16961695 }
16971696 const span = try c.listToSpan(stmts.items);
16981697 _ = try c.addToken(.r_brace, "}");
......@@ -2830,8 +2829,8 @@ fn renderFunc(c: *Context, node: Node) !NodeIndex {
28302829 const fn_token = try c.addToken(.keyword_fn, "fn");
28312830 if (payload.name) |some| _ = try c.addIdentifier(some);
28322831
2833 const params = try renderParams(c, payload.params, payload.is_var_args);
2834 defer params.deinit();
2832 var params = try renderParams(c, payload.params, payload.is_var_args);
2833 defer params.deinit(c.gpa);
28352834 var span: NodeSubRange = undefined;
28362835 if (params.items.len > 1) span = try c.listToSpan(params.items);
28372836
......@@ -2998,8 +2997,8 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex {
29982997 const fn_token = try c.addToken(.keyword_fn, "fn");
29992998 _ = try c.addIdentifier(payload.name);
30002999
3001 const params = try renderParams(c, payload.params, false);
3002 defer params.deinit();
3000 var params = try renderParams(c, payload.params, false);
3001 defer params.deinit(c.gpa);
30033002 var span: NodeSubRange = undefined;
30043003 if (params.items.len > 1) span = try c.listToSpan(params.items);
30053004
......@@ -3035,10 +3034,11 @@ fn renderMacroFunc(c: *Context, node: Node) !NodeIndex {
30353034 });
30363035}
30373036
3038fn renderParams(c: *Context, params: []Payload.Param, is_var_args: bool) !std.array_list.Managed(NodeIndex) {
3037fn renderParams(c: *Context, params: []Payload.Param, is_var_args: bool) !std.ArrayList(NodeIndex) {
30393038 _ = try c.addToken(.l_paren, "(");
3040 var rendered = try std.array_list.Managed(NodeIndex).initCapacity(c.gpa, @max(params.len, 1));
3041 errdefer rendered.deinit();
3039 var rendered: std.ArrayList(NodeIndex) = .empty;
3040 errdefer rendered.deinit(c.gpa);
3041 try rendered.ensureUnusedCapacity(c.gpa, @max(params.len, 1));
30423042
30433043 for (params, 0..) |param, i| {
30443044 if (i != 0) _ = try c.addToken(.comma, ",");
lib/compiler/translate-c/main.zig+6-4
......@@ -110,7 +110,7 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: [][:0]u8) !void {
110110 defer macro_buf.deinit(gpa);
111111
112112 var discard_buf: [256]u8 = undefined;
113 var discarding: std.io.Writer.Discarding = .init(&discard_buf);
113 var discarding: std.Io.Writer.Discarding = .init(&discard_buf);
114114 assert(!try d.parseArgs(&discarding.writer, &macro_buf, aro_args));
115115 if (macro_buf.items.len > std.math.maxInt(u32)) {
116116 return d.fatal("user provided macro source exceeded max size", .{});
......@@ -206,9 +206,11 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: [][:0]u8) !void {
206206 out_file_path = path;
207207 }
208208
209 var out_writer = out_file.writer(&.{});
210 out_writer.interface.writeAll(rendered_zig) catch
211 return d.fatal("failed to write result to '{s}': {s}", .{ out_file_path, aro.Driver.errorDescription(out_writer.err.?) });
209 var out_writer = out_file.writer(&out_buf);
210 out_writer.interface.writeAll(rendered_zig) catch {};
211 out_writer.interface.flush() catch {};
212 if (out_writer.err) |write_err|
213 return d.fatal("failed to write result to '{s}': {s}", .{ out_file_path, aro.Driver.errorDescription(write_err) });
212214
213215 if (fast_exit) process.exit(0);
214216}