checker: add an error for `x.method({})` calls, when method expects a struct
parent
9eac656e55
commit
fa995ca537
|
@ -7,6 +7,9 @@ import v.ast
|
|||
import v.token
|
||||
|
||||
pub fn (mut c Checker) check_expected_call_arg(got ast.Type, expected_ ast.Type, language ast.Language, arg ast.CallArg) ? {
|
||||
if got == 0 {
|
||||
return error('unexpected 0 type')
|
||||
}
|
||||
mut expected := expected_
|
||||
// variadic
|
||||
if expected.has_flag(.variadic) {
|
||||
|
|
|
@ -7605,8 +7605,14 @@ pub fn (mut c Checker) map_init(mut node ast.MapInit) ast.Type {
|
|||
node.value_type = info.value_type
|
||||
return node.typ
|
||||
} else {
|
||||
c.error('invalid empty map initilization syntax, use e.g. map[string]int{} instead',
|
||||
node.pos)
|
||||
if sym.kind == .struct_ {
|
||||
c.error('`{}` can not be used for initialising empty structs any more. Use `${c.table.type_to_str(c.expected_type)}{}` instead.',
|
||||
node.pos)
|
||||
} else {
|
||||
c.error('invalid empty map initialisation syntax, use e.g. map[string]int{} instead',
|
||||
node.pos)
|
||||
}
|
||||
return ast.void_type
|
||||
}
|
||||
}
|
||||
// `x := map[string]string` - set in parser
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
vlib/v/checker/tests/assign_to_typeless_variable_err.vv:2:10: error: invalid empty map initilization syntax, use e.g. map[string]int{} instead
|
||||
vlib/v/checker/tests/assign_to_typeless_variable_err.vv:2:10: error: invalid empty map initialisation syntax, use e.g. map[string]int{} instead
|
||||
1 | fn main() {
|
||||
2 | val := {}
|
||||
| ~~
|
||||
|
|
|
@ -1,6 +1,12 @@
|
|||
vlib/v/checker/tests/map_init_invalid_syntax.vv:2:7: error: invalid empty map initilization syntax, use e.g. map[string]int{} instead
|
||||
vlib/v/checker/tests/map_init_invalid_syntax.vv:2:7: error: invalid empty map initialisation syntax, use e.g. map[string]int{} instead
|
||||
1 | fn main() {
|
||||
2 | a := {}
|
||||
| ~~
|
||||
3 | println(a)
|
||||
4 | }
|
||||
4 | }
|
||||
vlib/v/checker/tests/map_init_invalid_syntax.vv:3:2: error: `println` can not print void expressions
|
||||
1 | fn main() {
|
||||
2 | a := {}
|
||||
3 | println(a)
|
||||
| ~~~~~~~~~~
|
||||
4 | }
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
vlib/v/checker/tests/method_call_with_empty_struct_init.vv:10:11: error: `{}` can not be used for initialising empty structs any more. Use `Abc{}` instead.
|
||||
8 | fn main() {
|
||||
9 | s := Abc{}
|
||||
10 | s.abc(0, {})
|
||||
| ~~
|
||||
11 | }
|
|
@ -0,0 +1,11 @@
|
|||
struct Abc {
|
||||
x int
|
||||
}
|
||||
|
||||
fn (s Abc) abc(x int, param Abc) {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
s := Abc{}
|
||||
s.abc(0, {})
|
||||
}
|
Loading…
Reference in New Issue