checker: add checks for map key/value types (#6283)
parent
81778e507f
commit
8ef55bd8c9
|
@ -343,6 +343,17 @@ pub fn (mut c Checker) struct_decl(decl ast.StructDecl) {
|
|||
field.pos)
|
||||
}
|
||||
}
|
||||
if sym.kind == .map {
|
||||
info := sym.map_info()
|
||||
key_sym := c.table.get_type_symbol(info.key_type)
|
||||
value_sym := c.table.get_type_symbol(info.value_type)
|
||||
if key_sym.kind == .placeholder {
|
||||
c.error('unknown type `$key_sym.source_name`', field.pos)
|
||||
}
|
||||
if value_sym.kind == .placeholder {
|
||||
c.error('unknown type `$value_sym.source_name`', field.pos)
|
||||
}
|
||||
}
|
||||
if field.has_default_expr {
|
||||
c.expected_type = field.typ
|
||||
field_expr_type := c.expr(field.default_expr)
|
||||
|
@ -3365,6 +3376,14 @@ pub fn (mut c Checker) map_init(mut node ast.MapInit) table.Type {
|
|||
// `x ;= map[string]string` - set in parser
|
||||
if node.typ != 0 {
|
||||
info := c.table.get_type_symbol(node.typ).map_info()
|
||||
key_sym := c.table.get_type_symbol(info.key_type)
|
||||
value_sym := c.table.get_type_symbol(info.value_type)
|
||||
if key_sym.kind == .placeholder {
|
||||
c.error('unknown type `$key_sym.source_name`', node.pos)
|
||||
}
|
||||
if value_sym.kind == .placeholder {
|
||||
c.error('unknown type `$value_sym.source_name`', node.pos)
|
||||
}
|
||||
node.key_type = info.key_type
|
||||
node.value_type = info.value_type
|
||||
return node.typ
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
vlib/v/checker/tests/map_unknown_value.vv:2:5: error: unknown type `DoesNotExist`
|
||||
1 | struct App {
|
||||
2 | my_map map[string]DoesNotExist
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
3 | }
|
|
@ -0,0 +1,3 @@
|
|||
struct App {
|
||||
my_map map[string]DoesNotExist
|
||||
}
|
Loading…
Reference in New Issue