allow `lock` expression to return multiple objects (#8657)
parent
d37fb5641f
commit
f3c5f24c17
|
@ -2551,7 +2551,8 @@ pub fn (mut c Checker) assign_stmt(mut assign_stmt ast.AssignStmt) {
|
||||||
mut right_len := assign_stmt.right.len
|
mut right_len := assign_stmt.right.len
|
||||||
mut right_type0 := table.void_type
|
mut right_type0 := table.void_type
|
||||||
for right in assign_stmt.right {
|
for right in assign_stmt.right {
|
||||||
if right is ast.CallExpr || right is ast.IfExpr || right is ast.MatchExpr {
|
if right is ast.CallExpr || right is ast.IfExpr || right is ast.LockExpr
|
||||||
|
|| right is ast.MatchExpr {
|
||||||
right_type0 = c.expr(right)
|
right_type0 = c.expr(right)
|
||||||
assign_stmt.right_types = [
|
assign_stmt.right_types = [
|
||||||
c.check_expr_opt_call(right, right_type0),
|
c.check_expr_opt_call(right, right_type0),
|
||||||
|
|
|
@ -1742,6 +1742,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||||
right_expr := assign_stmt.right[0]
|
right_expr := assign_stmt.right[0]
|
||||||
match right_expr {
|
match right_expr {
|
||||||
ast.CallExpr { return_type = right_expr.return_type }
|
ast.CallExpr { return_type = right_expr.return_type }
|
||||||
|
ast.LockExpr { return_type = right_expr.typ }
|
||||||
ast.MatchExpr { return_type = right_expr.return_type }
|
ast.MatchExpr { return_type = right_expr.return_type }
|
||||||
ast.IfExpr { return_type = right_expr.typ }
|
ast.IfExpr { return_type = right_expr.typ }
|
||||||
else {}
|
else {}
|
||||||
|
|
|
@ -12,3 +12,32 @@ fn test_lock_expr() {
|
||||||
assert m == -57
|
assert m == -57
|
||||||
assert n == 173
|
assert n == 173
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Abc {
|
||||||
|
mut:
|
||||||
|
a f64
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_multi_objects() {
|
||||||
|
shared x := Abc{ a: 12.5 }
|
||||||
|
shared y := Abc{ a: -7.5 }
|
||||||
|
shared z := Abc{ a: 13.125 }
|
||||||
|
a, b, c := rlock z, x, y { y.a, z.a, x.a }
|
||||||
|
assert a == -7.5
|
||||||
|
assert b == 13.125
|
||||||
|
assert c == 12.5
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut st Abc) getvals(mut a Abc, mut b Abc) (f64, f64, f64) {
|
||||||
|
return a.a, st.a, b.a
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_mult_ret_method() {
|
||||||
|
shared x := Abc{ a: 12.5 }
|
||||||
|
shared y := Abc{ a: -7.5 }
|
||||||
|
shared z := Abc{ a: 13.125 }
|
||||||
|
a, b, c := lock z, x, y { z.getvals(mut x, mut y) }
|
||||||
|
assert a == 12.5
|
||||||
|
assert b == 13.125
|
||||||
|
assert c == -7.5
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue