mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
parser: fix channel pop with or expression: ch := <-self.item or { return none }
(#17392)
This commit is contained in:
parent
248e9538ca
commit
acd903484d
@ -711,11 +711,14 @@ fn (mut p Parser) prefix_expr() ast.Expr {
|
|||||||
mut or_pos := p.tok.pos()
|
mut or_pos := p.tok.pos()
|
||||||
// allow `x := <-ch or {...}` to handle closed channel
|
// allow `x := <-ch or {...}` to handle closed channel
|
||||||
if op == .arrow {
|
if op == .arrow {
|
||||||
if p.tok.kind == .key_orelse {
|
if mut right is ast.SelectorExpr {
|
||||||
|
or_kind = right.or_block.kind
|
||||||
|
or_stmts = right.or_block.stmts.clone()
|
||||||
|
right.or_block = ast.OrExpr{}
|
||||||
|
} else if p.tok.kind == .key_orelse {
|
||||||
or_kind = .block
|
or_kind = .block
|
||||||
or_stmts, or_pos = p.or_block(.with_err_var)
|
or_stmts, or_pos = p.or_block(.with_err_var)
|
||||||
}
|
} else if p.tok.kind == .question {
|
||||||
if p.tok.kind == .question {
|
|
||||||
p.next()
|
p.next()
|
||||||
or_kind = .propagate_option
|
or_kind = .propagate_option
|
||||||
}
|
}
|
||||||
|
@ -45,3 +45,30 @@ fn test_chan_of_sumtype() {
|
|||||||
println(ret)
|
println(ret)
|
||||||
assert '${ret}' == 'As(Aa{})'
|
assert '${ret}' == 'As(Aa{})'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Iter[T] {
|
||||||
|
item chan T
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_iter[T](ch chan T) Iter[T] {
|
||||||
|
return Iter[T]{
|
||||||
|
item: ch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (self Iter[T]) next() ?T {
|
||||||
|
self.item.close()
|
||||||
|
ch := <-self.item or { return none }
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_channel_with_or_block() {
|
||||||
|
ch := chan int{}
|
||||||
|
iter := new_iter[int](ch)
|
||||||
|
ret := iter.next() or {
|
||||||
|
assert true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
println(ret)
|
||||||
|
assert false
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user