authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-23 11:14:11-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-04-23 11:14:11-07:00
log183ee0965fac6322651666834776d9832cc95ddd
tree3d92ed486046259fcdb110e7c2570fcdc1b2900b
parent0262dda9b82ab75c7f35908456e82545a5781b99

AstGen: compile error for unable to infer array size


2 files changed, 21 insertions(+), 3 deletions(-)

BRANCH_TODO+3
......@@ -34,6 +34,9 @@
3434
3535 * sort compile errors before presenting them to eliminate nondeterministic error reporting
3636
37 * when handling decls, catch the error and continue, so that
38 AstGen can report more than one compile error.
39
3740 const container_name_hash: Scope.NameHash = if (found_pkg) |pkg|
3841 pkg.namespace_hash
3942 else
src/AstGen.zig+18-3
......@@ -2455,9 +2455,16 @@ fn arrayType(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) !Z
24552455 const astgen = gz.astgen;
24562456 const tree = &astgen.file.tree;
24572457 const node_datas = tree.nodes.items(.data);
2458 const node_tags = tree.nodes.items(.tag);
2459 const main_tokens = tree.nodes.items(.main_token);
24582460
2459 // TODO check for [_]T
2460 const len = try expr(gz, scope, .{ .ty = .usize_type }, node_datas[node].lhs);
2461 const len_node = node_datas[node].lhs;
2462 if (node_tags[len_node] == .identifier and
2463 mem.eql(u8, tree.tokenSlice(main_tokens[len_node]), "_"))
2464 {
2465 return astgen.failNode(len_node, "unable to infer array size", .{});
2466 }
2467 const len = try expr(gz, scope, .{ .ty = .usize_type }, len_node);
24612468 const elem_type = try typeExpr(gz, scope, node_datas[node].rhs);
24622469
24632470 const result = try gz.addBin(.array_type, len, elem_type);
......@@ -2468,9 +2475,17 @@ fn arrayTypeSentinel(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.I
24682475 const astgen = gz.astgen;
24692476 const tree = &astgen.file.tree;
24702477 const node_datas = tree.nodes.items(.data);
2478 const node_tags = tree.nodes.items(.tag);
2479 const main_tokens = tree.nodes.items(.main_token);
24712480 const extra = tree.extraData(node_datas[node].rhs, ast.Node.ArrayTypeSentinel);
24722481
2473 const len = try expr(gz, scope, .{ .ty = .usize_type }, node_datas[node].lhs);
2482 const len_node = node_datas[node].lhs;
2483 if (node_tags[len_node] == .identifier and
2484 mem.eql(u8, tree.tokenSlice(main_tokens[len_node]), "_"))
2485 {
2486 return astgen.failNode(len_node, "unable to infer array size", .{});
2487 }
2488 const len = try expr(gz, scope, .{ .ty = .usize_type }, len_node);
24742489 const elem_type = try typeExpr(gz, scope, extra.elem_type);
24752490 const sentinel = try expr(gz, scope, .{ .ty = elem_type }, extra.sentinel);
24762491