checker: check optional interface type mismatch (#10617)
parent
d2f19ac494
commit
1e896c7020
|
@ -304,6 +304,15 @@ pub fn (mut c Checker) check_types(got ast.Type, expected ast.Type) bool {
|
||||||
if expected == ast.charptr_type && got == ast.char_type.to_ptr() {
|
if expected == ast.charptr_type && got == ast.char_type.to_ptr() {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
if expected.has_flag(.optional) {
|
||||||
|
sym := c.table.get_type_symbol(got)
|
||||||
|
if (sym.kind == .interface_ && sym.name == 'IError')
|
||||||
|
|| got in [ast.none_type, ast.error_type] {
|
||||||
|
return true
|
||||||
|
} else if !c.check_basic(got, expected.clear_flag(.optional)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
if !c.check_basic(got, expected) { // TODO: this should go away...
|
if !c.check_basic(got, expected) { // TODO: this should go away...
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -6170,7 +6170,6 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
|
||||||
node.is_expr = true
|
node.is_expr = true
|
||||||
node.typ = c.expected_type
|
node.typ = c.expected_type
|
||||||
}
|
}
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
if c.expected_type.has_flag(.generic) {
|
if c.expected_type.has_flag(.generic) {
|
||||||
if node.typ == ast.void_type {
|
if node.typ == ast.void_type {
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
vlib/v/checker/tests/optional_interface_mismatch.vv:11:9: error: mismatched types `?MObject` and `string`
|
||||||
|
9 |
|
||||||
|
10 | fn give_string(line string) ?MObject {
|
||||||
|
11 | return if true { 'string' } else { 'string' }
|
||||||
|
| ~~
|
||||||
|
12 | }
|
|
@ -0,0 +1,12 @@
|
||||||
|
fn main() {
|
||||||
|
le_string := give_string('string') or { return }
|
||||||
|
le_string.unimplemented()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface MObject {
|
||||||
|
unimplemented() string
|
||||||
|
}
|
||||||
|
|
||||||
|
fn give_string(line string) ?MObject {
|
||||||
|
return if true { 'string' } else { 'string' }
|
||||||
|
}
|
Loading…
Reference in New Issue