authorgravatar for r00ster91@proton.meWooster <r00ster91@proton.me> 2023-03-03 09:42:34+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-03-04 01:08:03+02:00
loge0d390463865340adc8055d1e34c0bc7acf4e4c3
tree10283dc3933cd09f489595ee06dc2e1e80136d26
parent75ff34db9e93056482233f8476a06f78b4a2f3c2

Ast: properly handle sentinel-terminated slices in tuple

Co-authored-by: Veikka Tuominen <git@vexu.eu>

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

lib/std/zig/Ast.zig+6-3
......@@ -1407,7 +1407,8 @@ pub fn containerField(tree: Ast, node: Node.Index) full.ContainerField {
14071407 .type_expr = data.lhs,
14081408 .value_expr = extra.value_expr,
14091409 .align_expr = extra.align_expr,
1410 .tuple_like = tree.tokens.items(.tag)[main_token + 1] != .colon,
1410 .tuple_like = tree.tokens.items(.tag)[main_token] != .identifier or
1411 tree.tokens.items(.tag)[main_token + 1] != .colon,
14111412 });
14121413}
14131414
......@@ -1420,7 +1421,8 @@ pub fn containerFieldInit(tree: Ast, node: Node.Index) full.ContainerField {
14201421 .type_expr = data.lhs,
14211422 .value_expr = data.rhs,
14221423 .align_expr = 0,
1423 .tuple_like = tree.tokens.items(.tag)[main_token + 1] != .colon,
1424 .tuple_like = tree.tokens.items(.tag)[main_token] != .identifier or
1425 tree.tokens.items(.tag)[main_token + 1] != .colon,
14241426 });
14251427}
14261428
......@@ -1433,7 +1435,8 @@ pub fn containerFieldAlign(tree: Ast, node: Node.Index) full.ContainerField {
14331435 .type_expr = data.lhs,
14341436 .value_expr = 0,
14351437 .align_expr = data.rhs,
1436 .tuple_like = tree.tokens.items(.tag)[main_token + 1] != .colon,
1438 .tuple_like = tree.tokens.items(.tag)[main_token] != .identifier or
1439 tree.tokens.items(.tag)[main_token + 1] != .colon,
14371440 });
14381441}
14391442
test/behavior/tuple.zig+19
......@@ -397,3 +397,22 @@ test "nested runtime conditionals in tuple initializer" {
397397 };
398398 try expectEqualStrings("up", x[0]);
399399}
400
401test "sentinel slice in tuple with other fields" {
402 const S = struct {
403 a: u32,
404 b: u32,
405 };
406
407 const Submission = union(enum) {
408 open: struct { *S, [:0]const u8, u32 },
409 };
410
411 _ = Submission;
412}
413
414test "sentinel slice in tuple" {
415 const S = struct { [:0]const u8 };
416
417 _ = S;
418}