mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
parser, checker: fix generic struct init with field struct init (#18052)
This commit is contained in:
parent
13b4cd9d58
commit
f4b7f83121
@ -324,7 +324,7 @@ fn (mut c Checker) struct_init(mut node ast.StructInit, is_field_zero_struct_ini
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
gtyp_name := c.table.sym(gtyp).name
|
gtyp_name := c.table.sym(gtyp).name
|
||||||
if gtyp_name !in c.table.cur_fn.generic_names {
|
if gtyp_name.len == 1 && gtyp_name !in c.table.cur_fn.generic_names {
|
||||||
cur_generic_names := '(' + c.table.cur_fn.generic_names.join(',') + ')'
|
cur_generic_names := '(' + c.table.cur_fn.generic_names.join(',') + ')'
|
||||||
c.error('generic struct init type parameter `${gtyp_name}` must be within the parameters `${cur_generic_names}` of the current generic function',
|
c.error('generic struct init type parameter `${gtyp_name}` must be within the parameters `${cur_generic_names}` of the current generic function',
|
||||||
node.pos)
|
node.pos)
|
||||||
|
@ -398,6 +398,7 @@ fn (mut p Parser) struct_init(typ_str string, kind ast.StructInitKind, is_option
|
|||||||
first_pos := (if kind == .short_syntax && p.prev_tok.kind == .lcbr { p.prev_tok } else { p.tok }).pos()
|
first_pos := (if kind == .short_syntax && p.prev_tok.kind == .lcbr { p.prev_tok } else { p.tok }).pos()
|
||||||
p.struct_init_generic_types = []ast.Type{}
|
p.struct_init_generic_types = []ast.Type{}
|
||||||
mut typ := if kind == .short_syntax { ast.void_type } else { p.parse_type() }
|
mut typ := if kind == .short_syntax { ast.void_type } else { p.parse_type() }
|
||||||
|
struct_init_generic_types := p.struct_init_generic_types.clone()
|
||||||
if is_option {
|
if is_option {
|
||||||
typ = typ.set_flag(.option)
|
typ = typ.set_flag(.option)
|
||||||
}
|
}
|
||||||
@ -492,7 +493,7 @@ fn (mut p Parser) struct_init(typ_str string, kind ast.StructInitKind, is_option
|
|||||||
is_short_syntax: kind == .short_syntax
|
is_short_syntax: kind == .short_syntax
|
||||||
is_anon: kind == .anon
|
is_anon: kind == .anon
|
||||||
pre_comments: pre_comments
|
pre_comments: pre_comments
|
||||||
generic_types: p.struct_init_generic_types
|
generic_types: struct_init_generic_types
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
struct Child {
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Test[T] {
|
||||||
|
child Child
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new[T]() Test[T] {
|
||||||
|
return Test[T]{
|
||||||
|
child: Child{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generic_struct_init_with_field_struct_init() {
|
||||||
|
t := new[int]()
|
||||||
|
println(t)
|
||||||
|
assert t.child == Child{}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user