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 {...@@ -1407,7 +1407,8 @@ pub fn containerField(tree: Ast, node: Node.Index) full.ContainerField {
1407 .type_expr = data.lhs,1407 .type_expr = data.lhs,
1408 .value_expr = extra.value_expr,1408 .value_expr = extra.value_expr,
1409 .align_expr = extra.align_expr,1409 .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,
1411 });1412 });
1412}1413}
14131414
...@@ -1420,7 +1421,8 @@ pub fn containerFieldInit(tree: Ast, node: Node.Index) full.ContainerField {...@@ -1420,7 +1421,8 @@ pub fn containerFieldInit(tree: Ast, node: Node.Index) full.ContainerField {
1420 .type_expr = data.lhs,1421 .type_expr = data.lhs,
1421 .value_expr = data.rhs,1422 .value_expr = data.rhs,
1422 .align_expr = 0,1423 .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,
1424 });1426 });
1425}1427}
14261428
...@@ -1433,7 +1435,8 @@ pub fn containerFieldAlign(tree: Ast, node: Node.Index) full.ContainerField {...@@ -1433,7 +1435,8 @@ pub fn containerFieldAlign(tree: Ast, node: Node.Index) full.ContainerField {
1433 .type_expr = data.lhs,1435 .type_expr = data.lhs,
1434 .value_expr = 0,1436 .value_expr = 0,
1435 .align_expr = data.rhs,1437 .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,
1437 });1440 });
1438}1441}
14391442
test/behavior/tuple.zig+19
...@@ -397,3 +397,22 @@ test "nested runtime conditionals in tuple initializer" {...@@ -397,3 +397,22 @@ test "nested runtime conditionals in tuple initializer" {
397 };397 };
398 try expectEqualStrings("up", x[0]);398 try expectEqualStrings("up", x[0]);
399}399}
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}