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...@@ -381,7 +381,7 @@ pub fn expr(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) In
381 return addZIRNoOp(mod, scope, src, .unreachable_safe);381 return addZIRNoOp(mod, scope, src, .unreachable_safe);
382 },382 },
383 .@"return" => return ret(mod, scope, node),383 .@"return" => return ret(mod, scope, node),
384 .field_access => return field(mod, scope, rl, node),384 .field_access => return fieldAccess(mod, scope, rl, node),
385 .float_literal => return floatLiteral(mod, scope, rl, node),385 .float_literal => return floatLiteral(mod, scope, rl, node),
386386
387 .if_simple => return ifExpr(mod, scope, rl, tree.ifSimple(node)),387 .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....@@ -1423,17 +1423,17 @@ fn arrayTypeSentinel(mod: *Module, scope: *Scope, rl: ResultLoc, node: ast.Node.
1423fn containerField(1423fn containerField(
1424 mod: *Module,1424 mod: *Module,
1425 scope: *Scope,1425 scope: *Scope,
1426 node: *ast.Node.ContainerField,1426 field: ast.full.ContainerField,
1427) InnerError!*zir.Inst {1427) InnerError!*zir.Inst {
1428 const tree = scope.tree();1428 const tree = scope.tree();
1429 const token_starts = tree.tokens.items(.start);1429 const token_starts = tree.tokens.items(.start);
14301430
1431 const src = token_starts[tree.firstToken(node)];1431 const src = token_starts[field.ast.name_token];
1432 const name = try mod.identifierTokenString(scope, node.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) {1434 if (field.comptime_token == null and field.ast.value_expr == 0 and field.ast.align_expr == 0) {
1435 if (node.type_expr) |some| {1435 if (field.ast.type_expr != 0) {
1436 const ty = try typeExpr(mod, scope, some);1436 const ty = try typeExpr(mod, scope, field.ast.type_expr);
1437 return addZIRInst(mod, scope, src, zir.Inst.ContainerFieldTyped, .{1437 return addZIRInst(mod, scope, src, zir.Inst.ContainerFieldTyped, .{
1438 .bytes = name,1438 .bytes = name,
1439 .ty = ty,1439 .ty = ty,
...@@ -1445,9 +1445,11 @@ fn containerField(...@@ -1445,9 +1445,11 @@ fn containerField(
1445 }1445 }
1446 }1446 }
14471447
1448 const ty = if (node.type_expr) |some| try typeExpr(mod, scope, some) else null;1448 const ty = if (field.ast.type_expr != 0) try typeExpr(mod, scope, field.ast.type_expr) else null;
1449 const alignment = if (node.align_expr) |some| try expr(mod, scope, .none, some) else null;1449 // TODO result location should be alignment type
1450 const init = if (node.value_expr) |some| try expr(mod, scope, .none, some) else null;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
1452 return addZIRInst(mod, scope, src, zir.Inst.ContainerField, .{1454 return addZIRInst(mod, scope, src, zir.Inst.ContainerField, .{
1453 .bytes = name,1455 .bytes = name,
...@@ -1455,7 +1457,7 @@ fn containerField(...@@ -1455,7 +1457,7 @@ fn containerField(
1455 .ty = ty,1457 .ty = ty,
1456 .init = init,1458 .init = init,
1457 .alignment = alignment,1459 .alignment = alignment,
1458 .is_comptime = node.comptime_token != null,1460 .is_comptime = field.comptime_token != null,
1459 });1461 });
1460}1462}
14611463
...@@ -1485,12 +1487,15 @@ fn containerDecl(...@@ -1485,12 +1487,15 @@ fn containerDecl(
1485 defer fields.deinit();1487 defer fields.deinit();
14861488
1487 for (container_decl.ast.members) |member| {1489 for (container_decl.ast.members) |member| {
1488 switch (node_tags[member]) {1490 // TODO just handle these cases differently since they end up with different ZIR
1489 .container_field_init, .container_field_align, .container_field => {1491 // instructions anyway. It will be simpler & have fewer branches.
1490 try fields.append(try containerField(mod, &gen_scope.base, member));1492 const field = switch (node_tags[member]) {
1491 },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)),
1492 else => continue,1496 else => continue,
1493 }1497 };
1498 try fields.append(field);
1494 }1499 }
14951500
1496 var decl_arena = std.heap.ArenaAllocator.init(mod.gpa);1501 var decl_arena = std.heap.ArenaAllocator.init(mod.gpa);
...@@ -1847,7 +1852,7 @@ fn tokenIdentEql(mod: *Module, scope: *Scope, token1: ast.TokenIndex, token2: as...@@ -1847,7 +1852,7 @@ fn tokenIdentEql(mod: *Module, scope: *Scope, token1: ast.TokenIndex, token2: as
1847 return mem.eql(u8, ident_name_1, ident_name_2);1852 return mem.eql(u8, ident_name_1, ident_name_2);
1848}1853}
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 {
1851 const tree = scope.tree();1856 const tree = scope.tree();
1852 const token_starts = tree.tokens.items(.start);1857 const token_starts = tree.tokens.items(.start);
1853 const main_tokens = tree.nodes.items(.main_token);1858 const main_tokens = tree.nodes.items(.main_token);
...@@ -3269,7 +3274,7 @@ fn asRlPtr(...@@ -3269,7 +3274,7 @@ fn asRlPtr(
3269 rl: ResultLoc,3274 rl: ResultLoc,
3270 src: usize,3275 src: usize,
3271 result_ptr: *zir.Inst,3276 result_ptr: *zir.Inst,
3272 operand_node: *ast.Node,3277 operand_node: ast.Node.Index,
3273 dest_type: *zir.Inst,3278 dest_type: *zir.Inst,
3274) InnerError!*zir.Inst {3279) InnerError!*zir.Inst {
3275 // Detect whether this expr() call goes into rvalue() to store the result into the3280 // 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 {...@@ -550,11 +550,11 @@ pub const File = struct {
550 id_symlink_basename,550 id_symlink_basename,
551 &prev_digest_buf,551 &prev_digest_buf,
552 ) catch |err| b: {552 ) 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) });
554 break :b prev_digest_buf[0..0];554 break :b prev_digest_buf[0..0];
555 };555 };
556 if (mem.eql(u8, prev_digest, &digest)) {556 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});
558 base.lock = man.toOwnedLock();558 base.lock = man.toOwnedLock();
559 return;559 return;
560 }560 }
src/link/Coff.zig+3-3
...@@ -892,17 +892,17 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {...@@ -892,17 +892,17 @@ fn linkWithLLD(self: *Coff, comp: *Compilation) !void {
892 id_symlink_basename,892 id_symlink_basename,
893 &prev_digest_buf,893 &prev_digest_buf,
894 ) catch |err| blk: {894 ) 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) });
896 // Handle this as a cache miss.896 // Handle this as a cache miss.
897 break :blk prev_digest_buf[0..0];897 break :blk prev_digest_buf[0..0];
898 };898 };
899 if (mem.eql(u8, prev_digest, &digest)) {899 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});
901 // Hot diggity dog! The output binary is already there.901 // Hot diggity dog! The output binary is already there.
902 self.base.lock = man.toOwnedLock();902 self.base.lock = man.toOwnedLock();
903 return;903 return;
904 }904 }
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
907 // We are about to change the output file to be different, so we invalidate the build hash now.907 // We are about to change the output file to be different, so we invalidate the build hash now.
908 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {908 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 {...@@ -1365,17 +1365,17 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
1365 id_symlink_basename,1365 id_symlink_basename,
1366 &prev_digest_buf,1366 &prev_digest_buf,
1367 ) catch |err| blk: {1367 ) 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) });
1369 // Handle this as a cache miss.1369 // Handle this as a cache miss.
1370 break :blk prev_digest_buf[0..0];1370 break :blk prev_digest_buf[0..0];
1371 };1371 };
1372 if (mem.eql(u8, prev_digest, &digest)) {1372 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});
1374 // Hot diggity dog! The output binary is already there.1374 // Hot diggity dog! The output binary is already there.
1375 self.base.lock = man.toOwnedLock();1375 self.base.lock = man.toOwnedLock();
1376 return;1376 return;
1377 }1377 }
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
1380 // We are about to change the output file to be different, so we invalidate the build hash now.1380 // We are about to change the output file to be different, so we invalidate the build hash now.
1381 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {1381 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 {...@@ -556,17 +556,17 @@ fn linkWithLLD(self: *MachO, comp: *Compilation) !void {
556 id_symlink_basename,556 id_symlink_basename,
557 &prev_digest_buf,557 &prev_digest_buf,
558 ) catch |err| blk: {558 ) 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) });
560 // Handle this as a cache miss.560 // Handle this as a cache miss.
561 break :blk prev_digest_buf[0..0];561 break :blk prev_digest_buf[0..0];
562 };562 };
563 if (mem.eql(u8, prev_digest, &digest)) {563 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});
565 // Hot diggity dog! The output binary is already there.565 // Hot diggity dog! The output binary is already there.
566 self.base.lock = man.toOwnedLock();566 self.base.lock = man.toOwnedLock();
567 return;567 return;
568 }568 }
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
571 // We are about to change the output file to be different, so we invalidate the build hash now.571 // We are about to change the output file to be different, so we invalidate the build hash now.
572 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {572 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 {...@@ -333,17 +333,17 @@ fn linkWithLLD(self: *Wasm, comp: *Compilation) !void {
333 id_symlink_basename,333 id_symlink_basename,
334 &prev_digest_buf,334 &prev_digest_buf,
335 ) catch |err| blk: {335 ) 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) });
337 // Handle this as a cache miss.337 // Handle this as a cache miss.
338 break :blk prev_digest_buf[0..0];338 break :blk prev_digest_buf[0..0];
339 };339 };
340 if (mem.eql(u8, prev_digest, &digest)) {340 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});
342 // Hot diggity dog! The output binary is already there.342 // Hot diggity dog! The output binary is already there.
343 self.base.lock = man.toOwnedLock();343 self.base.lock = man.toOwnedLock();
344 return;344 return;
345 }345 }
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
348 // We are about to change the output file to be different, so we invalidate the build hash now.348 // We are about to change the output file to be different, so we invalidate the build hash now.
349 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {349 directory.handle.deleteFile(id_symlink_basename) catch |err| switch (err) {