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