Skip to content

Commit 672bb6c

Browse files
authored
parser: fix required function members in struct (#10299)
1 parent 89d2f50 commit 672bb6c

File tree

5 files changed

+63
-1
lines changed

5 files changed

+63
-1
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
vlib/v/checker/tests/struct_required_fn_field.vv:12:6: error: field `Abc.f3` must be initialized
2+
10 | f3: fn () {}
3+
11 | }
4+
12 | _ = Abc{
5+
| ~~~~
6+
13 | f1: 123
7+
14 | f2: 789
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
struct Abc {
2+
f1 int [required]
3+
f2 int
4+
f3 fn () [attr1; required; attr2]
5+
}
6+
7+
fn main() {
8+
_ = Abc{
9+
f1: 123
10+
f3: fn () {}
11+
}
12+
_ = Abc{
13+
f1: 123
14+
f2: 789
15+
}
16+
}

vlib/v/parser/parse_type.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ pub fn (mut p Parser) parse_fn_type(name string) ast.Type {
212212
}
213213
mut return_type := ast.void_type
214214
mut return_type_pos := token.Position{}
215-
if p.tok.line_nr == line_nr && p.tok.kind.is_start_of_type() {
215+
if p.tok.line_nr == line_nr && p.tok.kind.is_start_of_type() && !p.is_attributes() {
216216
return_type_pos = p.tok.position()
217217
return_type = p.parse_type()
218218
if return_type.has_flag(.generic) {

vlib/v/parser/parser.v

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,28 @@ fn (mut p Parser) expr_list() ([]ast.Expr, []ast.Comment) {
14601460
return exprs, comments
14611461
}
14621462

1463+
fn (mut p Parser) is_attributes() bool {
1464+
if p.tok.kind != .lsbr {
1465+
return false
1466+
}
1467+
mut i := 0
1468+
for {
1469+
tok := p.peek_token(i)
1470+
if tok.kind == .eof || tok.line_nr != p.tok.line_nr {
1471+
return false
1472+
}
1473+
if tok.kind == .rsbr {
1474+
break
1475+
}
1476+
i++
1477+
}
1478+
peek_rsbr_tok := p.peek_token(i + 1)
1479+
if peek_rsbr_tok.line_nr == p.tok.line_nr && peek_rsbr_tok.kind != .rcbr {
1480+
return false
1481+
}
1482+
return true
1483+
}
1484+
14631485
// when is_top_stmt is true attrs are added to p.attrs
14641486
fn (mut p Parser) attributes() {
14651487
p.check(.lsbr)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
struct Struct {
2+
f1 fn () [required]
3+
f2 fn () [attr1; required]
4+
}
5+
6+
fn func() {
7+
}
8+
9+
fn test_struct_fields_storing_required_functions() {
10+
s := Struct{
11+
f1: func
12+
f2: func
13+
}
14+
15+
assert s.f1 == func
16+
assert s.f2 == func
17+
}

0 commit comments

Comments
 (0)