checker: check non-optional fn return or_block (#9227)
parent
0d2bb714bc
commit
a187a4abb3
|
@ -3693,6 +3693,15 @@ pub fn (mut c Checker) expr(node ast.Expr) table.Type {
|
|||
}
|
||||
ast.CallExpr {
|
||||
mut ret_type := c.call_expr(mut node)
|
||||
if !ret_type.has_flag(.optional) {
|
||||
if node.or_block.kind == .block {
|
||||
c.error('unexpected `or` block, the function `$node.name` does not return an optional',
|
||||
node.or_block.pos)
|
||||
} else if node.or_block.kind == .propagate {
|
||||
c.error('unexpected `?`, the function `$node.name` does not return an optional',
|
||||
node.or_block.pos)
|
||||
}
|
||||
}
|
||||
if ret_type.has_flag(.optional) && node.or_block.kind != .absent {
|
||||
ret_type = ret_type.clear_flag(.optional)
|
||||
}
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
vlib/v/checker/tests/fn_return_or_err.vv:6:17: error: unexpected `or` block, the function `pop` does not return an optional
|
||||
4 |
|
||||
5 | pub fn next(mut v []Typ) Typ {
|
||||
6 | return v.pop() or { Typ{} }
|
||||
| ~~~~~~~~~~~~
|
||||
7 | }
|
||||
8 |
|
|
@ -0,0 +1,13 @@
|
|||
module main
|
||||
|
||||
pub struct Typ {}
|
||||
|
||||
pub fn next(mut v []Typ) Typ {
|
||||
return v.pop() or { Typ{} }
|
||||
}
|
||||
|
||||
fn main() {
|
||||
mut v := [Typ{}]
|
||||
last := next(mut v)
|
||||
println('$last')
|
||||
}
|
Loading…
Reference in New Issue