Skip to content

Commit 261a4fb

Browse files
authored
parser: fix syntax error for for c in [othermod.Struct{field: 255}] { (fix #24943) (#24978)
1 parent ec5eeb5 commit 261a4fb

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

vlib/v/parser/expr.v

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,11 @@ fn (mut p Parser) check_expr(precedence int) !ast.Expr {
8383
p.tok.pos())
8484
} else if p.tok.kind == .question && p.peek_tok.kind == .amp {
8585
node = p.prefix_expr()
86-
} else if p.inside_for_expr && p.tok.kind == .name && p.tok.lit[0].is_capital()
87-
&& p.peek_tok.kind == .lcbr && p.peek_token(2).kind in [.rcbr, .name] {
86+
} else if p.inside_for_expr && p.tok.kind == .name && ((p.tok.lit[0].is_capital()
87+
&& p.peek_tok.kind == .lcbr && p.peek_token(2).kind in [.rcbr, .name])
88+
|| (p.inside_array_lit && p.peek_tok.kind == .dot && p.peek_token(2).kind == .name
89+
&& p.peek_token(2).lit[0].is_capital() && p.peek_token(3).kind == .lcbr
90+
&& p.peek_token(4).kind in [.rcbr, .name])) {
8891
node = p.struct_init(p.mod + '.' + p.tok.lit, .normal, false)
8992
} else if p.is_generic_name() && p.peek_tok.kind == .lcbr
9093
&& p.peek_token(2).kind == .rcbr && p.peek_token(2).line_nr == p.tok.line_nr {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import v.ast
2+
3+
fn test_main() {
4+
for idx, s in [ast.Struct{
5+
scoped_name: '1'
6+
}, ast.Struct{
7+
embeds: [ast.Type(2), 3]
8+
}, ast.Struct{
9+
is_typedef: true
10+
is_union: true
11+
is_heap: true
12+
}, ast.Struct{
13+
is_minify: ast.Struct{
14+
is_anon: true
15+
}.is_generic
16+
is_shared: true
17+
}, ast.Struct{
18+
has_option: true
19+
}] {
20+
println('${idx} ${s}')
21+
if idx == 0 {
22+
assert s.scoped_name == '1'
23+
} else if idx == 1 {
24+
assert s.embeds == [ast.Type(2), 3]
25+
} else if idx == 2 {
26+
assert s.is_typedef == true
27+
assert s.is_union == true
28+
assert s.is_heap == true
29+
} else if idx == 3 {
30+
assert s.is_minify == false
31+
assert s.is_shared == true
32+
} else if idx == 4 {
33+
assert s.has_option == true
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)