v.checker: fix return type checking being skipped for mutable method receivers (#12043)
parent
02e4aa0f0e
commit
86a5e72c74
|
@ -3758,10 +3758,6 @@ pub fn (mut c Checker) return_stmt(mut node ast.Return) {
|
||||||
if !c.check_types(got_typ, exp_type) {
|
if !c.check_types(got_typ, exp_type) {
|
||||||
got_typ_sym := c.table.get_type_symbol(got_typ)
|
got_typ_sym := c.table.get_type_symbol(got_typ)
|
||||||
mut exp_typ_sym := c.table.get_type_symbol(exp_type)
|
mut exp_typ_sym := c.table.get_type_symbol(exp_type)
|
||||||
pos := node.exprs[i].position()
|
|
||||||
if node.exprs[i].is_auto_deref_var() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if exp_typ_sym.kind == .interface_ {
|
if exp_typ_sym.kind == .interface_ {
|
||||||
if c.type_implements(got_typ, exp_type, node.pos) {
|
if c.type_implements(got_typ, exp_type, node.pos) {
|
||||||
if !got_typ.is_ptr() && !got_typ.is_pointer() && got_typ_sym.kind != .interface_
|
if !got_typ.is_ptr() && !got_typ.is_pointer() && got_typ_sym.kind != .interface_
|
||||||
|
@ -3771,6 +3767,7 @@ pub fn (mut c Checker) return_stmt(mut node ast.Return) {
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
pos := node.exprs[i].position()
|
||||||
c.error('cannot use `$got_typ_sym.name` as type `${c.table.type_to_str(exp_type)}` in return argument',
|
c.error('cannot use `$got_typ_sym.name` as type `${c.table.type_to_str(exp_type)}` in return argument',
|
||||||
pos)
|
pos)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
vlib/v/checker/tests/mut_receiver_wrong_return_type.vv:4:9: error: cannot use `Test` as type `?int` in return argument
|
||||||
|
2 |
|
||||||
|
3 | fn (mut test Test) test() ?int {
|
||||||
|
4 | return test
|
||||||
|
| ~~~~
|
||||||
|
5 | }
|
||||||
|
6 |
|
||||||
|
vlib/v/checker/tests/mut_receiver_wrong_return_type.vv:8:9: error: cannot use `Test` as type `int` in return argument
|
||||||
|
6 |
|
||||||
|
7 | fn (mut test Test) test2() int {
|
||||||
|
8 | return test
|
||||||
|
| ~~~~
|
||||||
|
9 | }
|
|
@ -0,0 +1,9 @@
|
||||||
|
struct Test {}
|
||||||
|
|
||||||
|
fn (mut test Test) test() ?int {
|
||||||
|
return test
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut test Test) test2() int {
|
||||||
|
return test
|
||||||
|
}
|
Loading…
Reference in New Issue