cgen: fix swap assign of prefix and postfix expr
							parent
							
								
									cecb7d29c7
								
							
						
					
					
						commit
						9cbd9db4e7
					
				| 
						 | 
					@ -1078,6 +1078,14 @@ fn (mut g Gen) gen_cross_tmp_variable(idents []ast.Ident, val ast.Expr) {
 | 
				
			||||||
			g.write(it.op.str())
 | 
								g.write(it.op.str())
 | 
				
			||||||
			g.gen_cross_tmp_variable(idents, it.right)
 | 
								g.gen_cross_tmp_variable(idents, it.right)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							ast.PrefixExpr {
 | 
				
			||||||
 | 
								g.write(it.op.str())
 | 
				
			||||||
 | 
								g.gen_cross_tmp_variable(idents, it.right)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ast.PostfixExpr {
 | 
				
			||||||
 | 
								g.gen_cross_tmp_variable(idents, it.expr)
 | 
				
			||||||
 | 
								g.write(it.op.str())
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
			g.expr(val)
 | 
								g.expr(val)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,25 +35,18 @@ fn (mut p Parser) check_cross_variables(idents []ast.Ident, expr ast.Expr) bool
 | 
				
			||||||
	match expr {
 | 
						match expr {
 | 
				
			||||||
		ast.Ident {
 | 
							ast.Ident {
 | 
				
			||||||
			for ident in idents {
 | 
								for ident in idents {
 | 
				
			||||||
				if ident.name == it.name {
 | 
									if ident.name == it.name { return true }
 | 
				
			||||||
					return true
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		ast.InfixExpr {
 | 
							ast.InfixExpr {
 | 
				
			||||||
			if p.check_cross_variables(idents, it.left) {
 | 
								if p.check_cross_variables(idents, it.left) { return true }
 | 
				
			||||||
				return true
 | 
								if p.check_cross_variables(idents, it.right) { return true }
 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			if p.check_cross_variables(idents, it.right) {
 | 
					 | 
				
			||||||
				return true
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		ast.StringInterLiteral {
 | 
					 | 
				
			||||||
			for expr_ in it.exprs {
 | 
					 | 
				
			||||||
				if p.check_cross_variables(idents, expr_) {
 | 
					 | 
				
			||||||
					return true
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							ast.PrefixExpr {
 | 
				
			||||||
 | 
								if p.check_cross_variables(idents, it.right) { return true }
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							ast.PostfixExpr {
 | 
				
			||||||
 | 
								if p.check_cross_variables(idents, it.expr) { return true }
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else {}
 | 
							else {}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,3 +34,33 @@ fn test_multiple_assign_infix_expr() {
 | 
				
			||||||
	assert b == 22
 | 
						assert b == 22
 | 
				
			||||||
	assert c == 22
 | 
						assert c == 22
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_multiple_assign_prefix_expr() {
 | 
				
			||||||
 | 
						mut a := 11
 | 
				
			||||||
 | 
						mut b := 22
 | 
				
			||||||
 | 
						mut c := 33
 | 
				
			||||||
 | 
						a, b, c = -b, -c, -a
 | 
				
			||||||
 | 
						assert a == -22
 | 
				
			||||||
 | 
						assert b == -33
 | 
				
			||||||
 | 
						assert c == -11
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_multiple_assign_postfix_expr() {
 | 
				
			||||||
 | 
						mut a := 11
 | 
				
			||||||
 | 
						mut b := 22
 | 
				
			||||||
 | 
						mut c := 33
 | 
				
			||||||
 | 
						a, b, c = b++, c++, a--
 | 
				
			||||||
 | 
						assert a == 22
 | 
				
			||||||
 | 
						assert b == 33
 | 
				
			||||||
 | 
						assert c == 11
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_multiple_assign_complex_expr() {
 | 
				
			||||||
 | 
						mut a := 11
 | 
				
			||||||
 | 
						mut b := 22
 | 
				
			||||||
 | 
						mut c := 33
 | 
				
			||||||
 | 
						a, b, c = -b + 1, -c * 2, a++
 | 
				
			||||||
 | 
						assert a == -21
 | 
				
			||||||
 | 
						assert b == -66
 | 
				
			||||||
 | 
						assert c == 11
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue