checker: skip checking for invalid fn return type (#8703)
parent
40066a5daa
commit
db609a0784
|
@ -5777,42 +5777,45 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) {
|
|||
}
|
||||
}
|
||||
}
|
||||
return_sym := c.table.get_type_symbol(node.return_type)
|
||||
if node.language == .v && return_sym.kind in [.placeholder, .int_literal, .float_literal]
|
||||
&& return_sym.language == .v {
|
||||
c.error('unknown type `$return_sym.name`', node.pos)
|
||||
}
|
||||
if node.language == .v && node.is_method && node.name == 'str' {
|
||||
if node.return_type != table.string_type {
|
||||
c.error('.str() methods should return `string`', node.pos)
|
||||
if node.return_type != table.Type(0) {
|
||||
return_sym := c.table.get_type_symbol(node.return_type)
|
||||
if node.language == .v && return_sym.kind in [.placeholder, .int_literal, .float_literal]
|
||||
&& return_sym.language == .v {
|
||||
c.error('unknown type `$return_sym.name`', node.pos)
|
||||
}
|
||||
if node.params.len != 1 {
|
||||
c.error('.str() methods should have 0 arguments', node.pos)
|
||||
if node.language == .v && node.is_method && node.name == 'str' {
|
||||
if node.return_type != table.string_type {
|
||||
c.error('.str() methods should return `string`', node.pos)
|
||||
}
|
||||
if node.params.len != 1 {
|
||||
c.error('.str() methods should have 0 arguments', node.pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
if node.language == .v && node.is_method && node.name in ['+', '-', '*', '%', '/', '<', '=='] {
|
||||
if node.params.len != 2 {
|
||||
c.error('operator methods should have exactly 1 argument', node.pos)
|
||||
} else {
|
||||
receiver_sym := c.table.get_type_symbol(node.receiver.typ)
|
||||
param_sym := c.table.get_type_symbol(node.params[1].typ)
|
||||
if param_sym.kind !in [.struct_, .alias] || receiver_sym.kind !in [.struct_, .alias] {
|
||||
c.error('operator methods are only allowed for struct and type alias',
|
||||
node.pos)
|
||||
if node.language == .v && node.is_method
|
||||
&& node.name in ['+', '-', '*', '%', '/', '<', '=='] {
|
||||
if node.params.len != 2 {
|
||||
c.error('operator methods should have exactly 1 argument', node.pos)
|
||||
} else {
|
||||
parent_sym := c.table.get_final_type_symbol(node.receiver.typ)
|
||||
if node.rec_mut {
|
||||
c.error('receiver cannot be `mut` for operator overloading', node.receiver_pos)
|
||||
} else if node.params[1].is_mut {
|
||||
c.error('argument cannot be `mut` for operator overloading', node.pos)
|
||||
} else if node.receiver.typ != node.params[1].typ {
|
||||
c.error('expected `$receiver_sym.name` not `$param_sym.name` - both operands must be the same type for operator overloading',
|
||||
node.params[1].type_pos)
|
||||
} else if node.name in ['<', '=='] && node.return_type != table.bool_type {
|
||||
c.error('operator comparison methods should return `bool`', node.pos)
|
||||
} else if parent_sym.is_primitive() {
|
||||
c.error('cannot define operator methods on type alias for `$parent_sym.name`',
|
||||
receiver_sym := c.table.get_type_symbol(node.receiver.typ)
|
||||
param_sym := c.table.get_type_symbol(node.params[1].typ)
|
||||
if param_sym.kind !in [.struct_, .alias] || receiver_sym.kind !in [.struct_, .alias] {
|
||||
c.error('operator methods are only allowed for struct and type alias',
|
||||
node.pos)
|
||||
} else {
|
||||
parent_sym := c.table.get_final_type_symbol(node.receiver.typ)
|
||||
if node.rec_mut {
|
||||
c.error('receiver cannot be `mut` for operator overloading', node.receiver_pos)
|
||||
} else if node.params[1].is_mut {
|
||||
c.error('argument cannot be `mut` for operator overloading', node.pos)
|
||||
} else if node.receiver.typ != node.params[1].typ {
|
||||
c.error('expected `$receiver_sym.name` not `$param_sym.name` - both operands must be the same type for operator overloading',
|
||||
node.params[1].type_pos)
|
||||
} else if node.name in ['<', '=='] && node.return_type != table.bool_type {
|
||||
c.error('operator comparison methods should return `bool`', node.pos)
|
||||
} else if parent_sym.is_primitive() {
|
||||
c.error('cannot define operator methods on type alias for `$parent_sym.name`',
|
||||
node.pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue