all: fix mutability after if-smartcast (#6129)
							parent
							
								
									36c98b3e5d
								
							
						
					
					
						commit
						b5c1ea44dc
					
				|  | @ -2550,7 +2550,7 @@ pub fn (mut c Checker) ident(mut ident ast.Ident) table.Type { | |||
| 		return info.typ | ||||
| 	} else if ident.kind == .unresolved { | ||||
| 		// first use
 | ||||
| 		start_scope := c.file.scope.innermost(ident.pos.pos) | ||||
| 		start_scope := c.file.scope.innermost(ident.pos.pos + 1) | ||||
| 		if obj1 := start_scope.find(ident.name) { | ||||
| 			match mut obj1 as obj { | ||||
| 				ast.GlobalDecl { | ||||
|  | @ -2985,8 +2985,11 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) table.Type { | |||
| 					left_sym := c.table.get_type_symbol(infix.left_type) | ||||
| 					if left_sym.kind == .sum_type && branch.left_as_name.len > 0 { | ||||
| 						mut is_mut := false | ||||
| 						if infix.left is ast.Ident { | ||||
| 							is_mut = (infix.left as ast.Ident).is_mut | ||||
| 						mut scope := c.file.scope.innermost(branch.body_pos.pos) | ||||
| 						if infix.left is ast.Ident as infix_left { | ||||
| 							if var := scope.find_var(infix_left.name) { | ||||
| 								is_mut = var.is_mut | ||||
| 							} | ||||
| 						} else if infix.left is ast.SelectorExpr { | ||||
| 							selector := infix.left as ast.SelectorExpr | ||||
| 							field := c.table.struct_find_field(left_sym, selector.field_name) or { | ||||
|  | @ -2994,7 +2997,6 @@ pub fn (mut c Checker) if_expr(mut node ast.IfExpr) table.Type { | |||
| 							} | ||||
| 							is_mut = field.is_mut | ||||
| 						} | ||||
| 						mut scope := c.file.scope.innermost(branch.body_pos.pos) | ||||
| 						scope.register(branch.left_as_name, ast.Var{ | ||||
| 							name: branch.left_as_name | ||||
| 							typ: right_expr.typ.to_ptr() | ||||
|  |  | |||
|  | @ -1826,6 +1826,11 @@ fn (mut g Gen) expr(node ast.Expr) { | |||
| 				g.write(')') | ||||
| 			} else if sym.kind == .sum_type { | ||||
| 				g.expr_with_cast(node.expr, node.expr_type, node.typ) | ||||
| 			} else if sym.kind == .struct_ && !node.typ.is_ptr() && !(sym.info as table.Struct).is_typedef { | ||||
| 				styp := g.typ(node.typ) | ||||
| 				g.write('*(($styp *)(&') | ||||
| 				g.expr(node.expr) | ||||
| 				g.write('))') | ||||
| 			} else { | ||||
| 				// styp := g.table.Type_to_str(it.typ)
 | ||||
| 				styp := g.typ(node.typ) | ||||
|  |  | |||
|  | @ -118,7 +118,7 @@ fn (mut p Parser) if_expr() ast.IfExpr { | |||
| 			cond: cond | ||||
| 			stmts: stmts | ||||
| 			pos: start_pos.extend(end_pos) | ||||
| 			body_pos: body_pos.extend(p.tok.position()) | ||||
| 			body_pos: body_pos.extend(p.prev_tok.position()) | ||||
| 			comments: comments | ||||
| 			left_as_name: left_as_name | ||||
| 		} | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ fn test_mutable_with_struct() { | |||
| 	mut x := Test{Abc{'test'}} | ||||
| 	if x.abc is Abc as test { | ||||
| 		mut ttt := test | ||||
| 		assert u64(ttt) == u64(ttt)         | ||||
| 		assert u64(ttt) == u64(ttt) | ||||
| 		ttt.val = 'test' | ||||
| 		assert ttt.val == 'test' | ||||
| 	} | ||||
|  | @ -63,3 +63,26 @@ fn test_as_cast_with_struct() { | |||
| 		assert test.val == 'test' | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| struct CellStr { str string } | ||||
| struct CellInt { itg i64 } | ||||
| struct CellFloat { flt f64 } | ||||
| type Cell = CellStr | CellInt | CellFloat | ||||
| fn test_mutability() { | ||||
| 	my_str := 'the quick brown fox jumps over the lazy dog.' | ||||
| 	my_itg := -1234567890 | ||||
| 	my_flt := 3.14159265358979323846 | ||||
| 	my_u32 := u32(4294967296) | ||||
| 	cell_str := CellStr{ str: my_str } | ||||
| 	cell_itg := CellInt{ itg: my_itg } | ||||
| 	cell_flt := CellFloat{ flt: my_flt } | ||||
| 	mut cell := Cell{} | ||||
| 	cell = cell_str | ||||
| 	if cell is CellStr { | ||||
| 		println('$cell.str') | ||||
| 	} | ||||
| 	cell = cell_itg | ||||
| 	if cell is CellInt { | ||||
| 		println('$cell.itg') | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue