authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-18 23:54:47-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-02-19 00:04:31-07:00
log914540ddb5867efe5c1823c281641897bc4cd22a
tree3fae3be246291d26fb10c2ff3a4b415e3d51ec12
parent9010bd8aec612d5a14e4be800c80b72025fac2c5

astgen: fix remaining compile errors

Now it builds and what remains in this branch is: * fix the stage2 compiler regressions from this branch * finish the rest of zig fmt test cases, get them passing * Merge in Vexu's translate-c AST branch & fix translate-c regressions

6 files changed, 37 insertions(+), 32 deletions(-)

src/astgen.zig+23-18
......@@ -381,7 +381,7 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) In
381381 return addZIRNoOp(mod, scope, src, .unreachable_safe);
382382 },
383383 .@"return" => return ret(mod, scope, node),
384 .field_access => return field(mod, scope, rl, node),
384 .field_access => return fieldAccess(mod, scope, rl, node),
385385 .float_literal => return floatLiteral(mod, scope, rl, node),
386386
387387 .if_simple => return ifExpr(mod, scope, rl, tree.ifSimple(node)),
......@@ -1423,17 +1423,17 @@ fn arrayTypeSentinel(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.
14231423fn containerField(
14241424 mod: *Module,
14251425 scope: *Scope,
1426 node: *ast.Node.ContainerField,
1426 field: ast.full.ContainerField,
14271427) InnerError!*zir.Inst {
14281428 const tree = scope.tree();
14291429 const token_starts = tree.tokens.items(.start);
14301430
1431 const src = token_starts[tree.firstToken(node)];
1432 const name = try mod.identifierTokenString(scope, node.name_token);
1431 const src = token_starts[field.ast.name_token];
1432 const name = try mod.identifierTokenString(scope, field.ast.name_token);
14331433
1434 if (node.comptime_token == null and node.value_expr == null and node.align_expr == null) {
1435 if (node.type_expr) |some| {
1436 const ty = try typeExpr(mod, scope, some);
1434 if (field.comptime_token == null and field.ast.value_expr == 0 and field.ast.align_expr == 0) {
1435 if (field.ast.type_expr != 0) {
1436 const ty = try typeExpr(mod, scope, field.ast.type_expr);
14371437 return addZIRInst(mod, scope, src, zir.Inst.ContainerFieldTyped, .{
14381438 .bytes = name,
14391439 .ty = ty,
......@@ -1445,9 +1445,11 @@ fn containerField(
14451445 }
14461446 }
14471447
1448 const ty = if (node.type_expr) |some| try typeExpr(mod, scope, some) else null;
1449 const alignment = if (node.align_expr) |some| try expr(mod, scope, .none, some) else null;
1450 const init = if (node.value_expr) |some| try expr(mod, scope, .none, some) else null;
1448 const ty = if (field.ast.type_expr != 0) try typeExpr(mod, scope, field.ast.type_expr) else null;
1449 // TODO result location should be alignment type
1450 const alignment = if (field.ast.align_expr != 0) try expr(mod, scope, .none, field.ast.align_expr) else null;
1451 // TODO result location should be the field type
1452 const init = if (field.ast.value_expr != 0) try expr(mod, scope, .none, field.ast.value_expr) else null;
14511453
14521454 return addZIRInst(mod, scope, src, zir.Inst.ContainerField, .{
14531455 .bytes = name,
......@@ -1455,7 +1457,7 @@ fn containerField(
14551457 .ty = ty,
14561458 .init = init,
14571459 .alignment = alignment,
1458 .is_comptime = node.comptime_token != null,
1460 .is_comptime = field.comptime_token != null,
14591461 });
14601462}
14611463
......@@ -1485,12 +1487,15 @@ fn containerDecl(
14851487 defer fields.deinit();
14861488
14871489 for (container_decl.ast.members) |member| {
1488 switch (node_tags[member]) {
1489 .container_field_init, .container_field_align, .container_field => {
1490 try fields.append(try containerField(mod, &gen_scope.base, member));
1491 },
1490 // TODO just handle these cases differently since they end up with different ZIR
1491 // instructions anyway. It will be simpler & have fewer branches.
1492 const field = switch (node_tags[member]) {
1493 .container_field_init => try containerField(mod, &gen_scope.base, tree.containerFieldInit(member)),
1494 .container_field_align => try containerField(mod, &gen_scope.base, tree.containerFieldAlign(member)),
1495 .container_field => try containerField(mod, &gen_scope.base, tree.containerField(member)),
14921496 else => continue,
1493 }
1497 };
1498 try fields.append(field);
14941499 }
14951500
14961501 var decl_arena = std.heap.ArenaAllocator.init(mod.gpa);
......@@ -1847,7 +1852,7 @@ fn tokenIdentEql(mod: *Module, scope: *Scope, token1: ast.TokenIndex, token2: as
18471852 return mem.eql(u8, ident_name_1, ident_name_2);
18481853}
18491854
1850pub fn field(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) InnerError!*zir.Inst {
1855pub fn fieldAccess(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) InnerError!*zir.Inst {
18511856 const tree = scope.tree();
18521857 const token_starts = tree.tokens.items(.start);
18531858 const main_tokens = tree.nodes.items(.main_token);
......@@ -3269,7 +3274,7 @@ fn asRlPtr(
32693274 rl: ResultLoc,
32703275 src: usize,
32713276 result_ptr: *zir.Inst,
3272 operand_node: *ast.Node,
3277 operand_node: ast.Node.Index,
32733278 dest_type: *zir.Inst,
32743279) InnerError!*zir.Inst {
32753280 // Detect whether this expr() call goes into rvalue() to store the result into the
src/link.zig+2-2
......@@ -550,11 +550,11 @@ pub const File = struct {
550550 id_symlink_basename,
551551 &prev_digest_buf,
552552 ) catch |err| b: {
553 log.debug("archive new_digest={} readFile error: {s}", .{ digest, @errorName(err) });
553 log.debug("archive new_digest={x} readFile error: {s}", .{ digest, @errorName(err) });
554554 break :b prev_digest_buf[0..0];
555555 };
556556 if (mem.eql(u8, prev_digest, &digest)) {
557 log.debug("archive digest={} match - skipping invocation", .{digest});
557 log.debug("archive digest={x} match - skipping invocation", .{digest});
558558 base.lock = man.toOwnedLock();
559559 return;
560560 }
src/link/Coff.zig+3-3
......@@ -892,17 +892,17 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
892892 id_symlink_basename,
893893 &prev_digest_buf,
894894 ) catch |err| blk: {
895 log.debug("COFF LLD new_digest={} error: {s}", .{ digest, @errorName(err) });
895 log.debug("COFF LLD new_digest={x} error: {s}", .{ digest, @errorName(err) });
896896 // Handle this as a cache miss.
897897 break :blk prev_digest_buf[0..0];
898898 };
899899 if (mem.eql(u8, prev_digest, &digest)) {
900 log.debug("COFF LLD digest={} match - skipping invocation", .{digest});
900 log.debug("COFF LLD digest={x} match - skipping invocation", .{digest});
901901 // Hot diggity dog! The output binary is already there.
902902 self.base.lock = man.toOwnedLock();
903903 return;
904904 }
905 log.debug("COFF LLD prev_digest={} new_digest={}", .{ prev_digest, digest });
905 log.debug("COFF LLD prev_digest={x} new_digest={x}", .{ prev_digest, digest });
906906
907907 // We are about to change the output file to be different, so we invalidate the build hash now.
908908 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {
src/link/Elf.zig+3-3
......@@ -1365,17 +1365,17 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
13651365 id_symlink_basename,
13661366 &prev_digest_buf,
13671367 ) catch |err| blk: {
1368 log.debug("ELF LLD new_digest={} error: {s}", .{ digest, @errorName(err) });
1368 log.debug("ELF LLD new_digest={x} error: {s}", .{ digest, @errorName(err) });
13691369 // Handle this as a cache miss.
13701370 break :blk prev_digest_buf[0..0];
13711371 };
13721372 if (mem.eql(u8, prev_digest, &digest)) {
1373 log.debug("ELF LLD digest={} match - skipping invocation", .{digest});
1373 log.debug("ELF LLD digest={x} match - skipping invocation", .{digest});
13741374 // Hot diggity dog! The output binary is already there.
13751375 self.base.lock = man.toOwnedLock();
13761376 return;
13771377 }
1378 log.debug("ELF LLD prev_digest={} new_digest={}", .{ prev_digest, digest });
1378 log.debug("ELF LLD prev_digest={x} new_digest={x}", .{ prev_digest, digest });
13791379
13801380 // We are about to change the output file to be different, so we invalidate the build hash now.
13811381 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {
src/link/MachO.zig+3-3
......@@ -556,17 +556,17 @@ fn linkWithLLD(self: *MachO, comp: *Compilation) !void {
556556 id_symlink_basename,
557557 &prev_digest_buf,
558558 ) catch |err| blk: {
559 log.debug("MachO LLD new_digest={} error: {s}", .{ digest, @errorName(err) });
559 log.debug("MachO LLD new_digest={x} error: {s}", .{ digest, @errorName(err) });
560560 // Handle this as a cache miss.
561561 break :blk prev_digest_buf[0..0];
562562 };
563563 if (mem.eql(u8, prev_digest, &digest)) {
564 log.debug("MachO LLD digest={} match - skipping invocation", .{digest});
564 log.debug("MachO LLD digest={x} match - skipping invocation", .{digest});
565565 // Hot diggity dog! The output binary is already there.
566566 self.base.lock = man.toOwnedLock();
567567 return;
568568 }
569 log.debug("MachO LLD prev_digest={} new_digest={}", .{ prev_digest, digest });
569 log.debug("MachO LLD prev_digest={x} new_digest={x}", .{ prev_digest, digest });
570570
571571 // We are about to change the output file to be different, so we invalidate the build hash now.
572572 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {
src/link/Wasm.zig+3-3
......@@ -333,17 +333,17 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
333333 id_symlink_basename,
334334 &prev_digest_buf,
335335 ) catch |err| blk: {
336 log.debug("WASM LLD new_digest={} error: {s}", .{ digest, @errorName(err) });
336 log.debug("WASM LLD new_digest={x} error: {s}", .{ digest, @errorName(err) });
337337 // Handle this as a cache miss.
338338 break :blk prev_digest_buf[0..0];
339339 };
340340 if (mem.eql(u8, prev_digest, &digest)) {
341 log.debug("WASM LLD digest={} match - skipping invocation", .{digest});
341 log.debug("WASM LLD digest={x} match - skipping invocation", .{digest});
342342 // Hot diggity dog! The output binary is already there.
343343 self.base.lock = man.toOwnedLock();
344344 return;
345345 }
346 log.debug("WASM LLD prev_digest={} new_digest={}", .{ prev_digest, digest });
346 log.debug("WASM LLD prev_digest={x} new_digest={x}", .{ prev_digest, digest });
347347
348348 // We are about to change the output file to be different, so we invalidate the build hash now.
349349 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {