1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

checker: var opt & temp [] & non array init error & bug notes

This commit is contained in:
joe-conigliaro 2020-04-04 22:32:16 +11:00
parent d1f653f9bd
commit b4e5e36d4a
No known key found for this signature in database
GPG Key ID: C12F7136C08206F1

View File

@ -508,6 +508,16 @@ pub fn (c mut Checker) array_init(array_init mut ast.ArrayInit) table.Type {
// a = [] // a = []
if array_init.exprs.len == 0 { if array_init.exprs.len == 0 {
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 {
// c.error('array_init: cannot use `[]` with non array.')
c.error('array_init: cannot use `[]` with non array. (maybe: `[]Type` instead of `[]`)', array_init.pos)
return table.void_type
}
// TODO: seperate errors once bug is fixed with `x := if expr { ... } else { ... }`
// if c.expected_type == table.void_type {
// c.error('array_init: use `[]Type` instead of `[]`', array_init.pos)
// return table.void_type
// }
array_info := type_sym.array_info() array_info := type_sym.array_info()
array_init.elem_type = array_info.elem_type array_init.elem_type = array_info.elem_type
return c.expected_type return c.expected_type
@ -865,10 +875,12 @@ pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type {
// first use // first use
else if ident.kind == .unresolved { else if ident.kind == .unresolved {
start_scope := c.file.scope.innermost(ident.pos.pos) start_scope := c.file.scope.innermost(ident.pos.pos)
if var := start_scope.find_var(ident.name) { if obj := start_scope.find(ident.name) {
mut typ := var.typ match obj {
ast.Var {
mut typ := it.typ
if typ == 0 { if typ == 0 {
typ = c.expr(var.expr) typ = c.expr(it.expr)
} }
is_optional := table.type_is(typ, .optional) is_optional := table.type_is(typ, .optional)
ident.kind = .variable ident.kind = .variable
@ -876,12 +888,16 @@ pub fn (c mut Checker) ident(ident mut ast.Ident) table.Type {
typ: typ typ: typ
is_optional: is_optional is_optional: is_optional
} }
it.typ = typ
// unwrap optional (`println(x)`) // unwrap optional (`println(x)`)
if is_optional { if is_optional {
return table.type_set(typ, .unset) return table.type_set(typ, .unset)
} }
return typ return typ
} }
else {}
}
}
// prepend mod to look for fn call or const // prepend mod to look for fn call or const
mut name := ident.name mut name := ident.name
if !name.contains('.') && !(ident.mod in ['builtin', 'main']) { if !name.contains('.') && !(ident.mod in ['builtin', 'main']) {