diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index fc3e0b4710..5d5718903d 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -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 diff --git a/vlib/v/checker/tests/map_unknown_value.out b/vlib/v/checker/tests/map_unknown_value.out new file mode 100644 index 0000000000..d22c678af3 --- /dev/null +++ b/vlib/v/checker/tests/map_unknown_value.out @@ -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 | } diff --git a/vlib/v/checker/tests/map_unknown_value.vv b/vlib/v/checker/tests/map_unknown_value.vv new file mode 100644 index 0000000000..90cb87ded5 --- /dev/null +++ b/vlib/v/checker/tests/map_unknown_value.vv @@ -0,0 +1,3 @@ +struct App { + my_map map[string]DoesNotExist +}