mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: fix array_init cast type error
This commit is contained in:
parent
bec3e07635
commit
3a340cbffc
@ -1338,6 +1338,13 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) {
|
|||||||
c.expected_type = table.void_type
|
c.expected_type = table.void_type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (mut c Checker) check_array_init_para_type(para string, expr ast.Expr, pos token.Position) {
|
||||||
|
sym := c.table.get_type_symbol(c.expr(expr))
|
||||||
|
if sym.kind !in [.int, .any_int] {
|
||||||
|
c.error('array $para needs to be an int', pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) table.Type {
|
pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) table.Type {
|
||||||
// println('checker: array init $array_init.pos.line_nr $c.file.path')
|
// println('checker: array init $array_init.pos.line_nr $c.file.path')
|
||||||
mut elem_type := table.void_type
|
mut elem_type := table.void_type
|
||||||
@ -1345,14 +1352,10 @@ pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) table.Type {
|
|||||||
if array_init.typ != table.void_type {
|
if array_init.typ != table.void_type {
|
||||||
if array_init.exprs.len == 0 {
|
if array_init.exprs.len == 0 {
|
||||||
if array_init.has_cap {
|
if array_init.has_cap {
|
||||||
if c.expr(array_init.cap_expr) !in [table.int_type, table.any_int_type] {
|
c.check_array_init_para_type('cap', array_init.cap_expr, array_init.pos)
|
||||||
c.error('array cap needs to be an int', array_init.pos)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if array_init.has_len {
|
if array_init.has_len {
|
||||||
if c.expr(array_init.len_expr) !in [table.int_type, table.any_int_type] {
|
c.check_array_init_para_type('len', array_init.len_expr, array_init.pos)
|
||||||
c.error('array len needs to be an int', array_init.pos)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sym := c.table.get_type_symbol(array_init.elem_type)
|
sym := c.table.get_type_symbol(array_init.elem_type)
|
||||||
@ -1363,16 +1366,6 @@ pub fn (mut c Checker) array_init(mut array_init ast.ArrayInit) table.Type {
|
|||||||
}
|
}
|
||||||
// a = []
|
// a = []
|
||||||
if array_init.exprs.len == 0 {
|
if array_init.exprs.len == 0 {
|
||||||
if array_init.has_cap {
|
|
||||||
if c.expr(array_init.cap_expr) !in [table.int_type, table.any_int_type] {
|
|
||||||
c.error('array cap needs to be an int', array_init.pos)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if array_init.has_len {
|
|
||||||
if c.expr(array_init.len_expr) !in [table.int_type, table.any_int_type] {
|
|
||||||
c.error('array len needs to be an int', array_init.pos)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
type_sym := c.table.get_type_symbol(c.expected_type)
|
type_sym := c.table.get_type_symbol(c.expected_type)
|
||||||
if type_sym.kind != .array {
|
if type_sym.kind != .array {
|
||||||
c.error('array_init: no type specified (maybe: `[]Type{}` instead of `[]`)', array_init.pos)
|
c.error('array_init: no type specified (maybe: `[]Type{}` instead of `[]`)', array_init.pos)
|
||||||
|
@ -155,3 +155,17 @@ fn test_array_init_in_struct_field() {
|
|||||||
println(m)
|
println(m)
|
||||||
assert m.ar.str() == '[1.2, 1.2, 1.2, 1.2]'
|
assert m.ar.str() == '[1.2, 1.2, 1.2, 1.2]'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Aaa {
|
||||||
|
pub mut:
|
||||||
|
a []int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_array_init_cast_type_in_struct_field() {
|
||||||
|
size := u32(5)
|
||||||
|
st := &Aaa{
|
||||||
|
a: []int{len: int(size)}
|
||||||
|
}
|
||||||
|
println(st)
|
||||||
|
assert st.a.str() == '[0, 0, 0, 0, 0]'
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user