pull/13728/head
			
			
		
		
							parent
							
								
									83762fa4a4
								
							
						
					
					
						commit
						27f9bc9ba0
					
				|  | @ -796,7 +796,7 @@ pub mut: | |||
| } | ||||
| 
 | ||||
| pub fn (i &Ident) var_info() IdentVar { | ||||
| 	match mut i.info { | ||||
| 	match i.info { | ||||
| 		IdentVar { | ||||
| 			return i.info | ||||
| 		} | ||||
|  |  | |||
|  | @ -1640,7 +1640,7 @@ pub fn (mut t Table) unwrap_generic_type(typ Type, generic_names []string, concr | |||
| 	mut nrt := '' | ||||
| 	mut c_nrt := '' | ||||
| 	ts := t.sym(typ) | ||||
| 	match mut ts.info { | ||||
| 	match ts.info { | ||||
| 		Array { | ||||
| 			mut elem_type := ts.info.elem_type | ||||
| 			mut elem_sym := t.sym(elem_type) | ||||
|  | @ -1744,7 +1744,7 @@ pub fn (mut t Table) unwrap_generic_type(typ Type, generic_names []string, concr | |||
| 		} | ||||
| 		else {} | ||||
| 	} | ||||
| 	match mut ts.info { | ||||
| 	match ts.info { | ||||
| 		Struct { | ||||
| 			mut info := ts.info | ||||
| 			info.is_generic = false | ||||
|  |  | |||
|  | @ -71,18 +71,18 @@ pub fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { | |||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	for i, left in node.left { | ||||
| 		if left is ast.CallExpr { | ||||
| 	for i, mut left in node.left { | ||||
| 		if mut left is ast.CallExpr { | ||||
| 			// ban `foo() = 10`
 | ||||
| 			c.error('cannot call function `${left.name}()` on the left side of an assignment', | ||||
| 				left.pos) | ||||
| 		} else if left is ast.PrefixExpr { | ||||
| 		} else if mut left is ast.PrefixExpr { | ||||
| 			// ban `*foo() = 10`
 | ||||
| 			if left.right is ast.CallExpr && left.op == .mul { | ||||
| 				c.error('cannot dereference a function call on the left side of an assignment, use a temporary variable', | ||||
| 					left.pos) | ||||
| 			} | ||||
| 		} else if left is ast.IndexExpr { | ||||
| 		} else if mut left is ast.IndexExpr { | ||||
| 			if left.index is ast.RangeExpr { | ||||
| 				c.error('cannot reassign using range expression on the left side of an assignment', | ||||
| 					left.pos) | ||||
|  | @ -99,8 +99,8 @@ pub fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { | |||
| 		} | ||||
| 		if node.right_types.len < node.left.len { // first type or multi return types added above
 | ||||
| 			old_inside_ref_lit := c.inside_ref_lit | ||||
| 			if left is ast.Ident { | ||||
| 				if left.info is ast.IdentVar { | ||||
| 			if mut left is ast.Ident { | ||||
| 				if mut left.info is ast.IdentVar { | ||||
| 					c.inside_ref_lit = c.inside_ref_lit || left.info.share == .shared_t | ||||
| 				} | ||||
| 			} | ||||
|  |  | |||
|  | @ -821,7 +821,7 @@ pub fn (mut c Checker) infer_fn_generic_types(func ast.Fn, mut node ast.CallExpr | |||
| 				} else if arg_sym.kind in [.struct_, .interface_, .sum_type] { | ||||
| 					mut generic_types := []ast.Type{} | ||||
| 					mut concrete_types := []ast.Type{} | ||||
| 					match mut arg_sym.info { | ||||
| 					match arg_sym.info { | ||||
| 						ast.Struct, ast.Interface, ast.SumType { | ||||
| 							generic_types = arg_sym.info.generic_types | ||||
| 							concrete_types = arg_sym.info.concrete_types | ||||
|  |  | |||
|  | @ -528,7 +528,7 @@ pub fn (mut c Checker) expand_iface_embeds(idecl &ast.InterfaceDecl, level int, | |||
| } | ||||
| 
 | ||||
| fn (mut c Checker) check_div_mod_by_zero(expr ast.Expr, op_kind token.Kind) { | ||||
| 	match mut expr { | ||||
| 	match expr { | ||||
| 		ast.FloatLiteral { | ||||
| 			if expr.val.f64() == 0.0 { | ||||
| 				oper := if op_kind == .div { 'division' } else { 'modulo' } | ||||
|  | @ -1084,10 +1084,11 @@ pub fn (mut c Checker) infix_expr(mut node ast.InfixExpr) ast.Type { | |||
| 
 | ||||
| // returns name and position of variable that needs write lock
 | ||||
| // also sets `is_changed` to true (TODO update the name to reflect this?)
 | ||||
| fn (mut c Checker) fail_if_immutable(expr ast.Expr) (string, token.Pos) { | ||||
| fn (mut c Checker) fail_if_immutable(expr_ ast.Expr) (string, token.Pos) { | ||||
| 	mut to_lock := '' // name of variable that needs lock
 | ||||
| 	mut pos := token.Pos{} // and its position
 | ||||
| 	mut explicit_lock_needed := false | ||||
| 	mut expr := unsafe { expr_ } | ||||
| 	match mut expr { | ||||
| 		ast.CastExpr { | ||||
| 			// TODO
 | ||||
|  | @ -1878,7 +1879,8 @@ fn (mut c Checker) check_loop_label(label string, pos token.Pos) { | |||
| 	c.loop_label = label | ||||
| } | ||||
| 
 | ||||
| fn (mut c Checker) stmt(node ast.Stmt) { | ||||
| fn (mut c Checker) stmt(node_ ast.Stmt) { | ||||
| 	mut node := unsafe { node_ } | ||||
| 	$if trace_checker ? { | ||||
| 		ntype := typeof(node).replace('v.ast.', '') | ||||
| 		eprintln('checking: ${c.file.path:-30} | pos: ${node.pos.line_str():-39} | node: $ntype | $node') | ||||
|  | @ -2178,7 +2180,7 @@ fn (mut c Checker) asm_stmt(mut stmt ast.AsmStmt) { | |||
| } | ||||
| 
 | ||||
| fn (mut c Checker) asm_arg(arg ast.AsmArg, stmt ast.AsmStmt, aliases []string) { | ||||
| 	match mut arg { | ||||
| 	match arg { | ||||
| 		ast.AsmAlias {} | ||||
| 		ast.AsmAddressing { | ||||
| 			if arg.scale !in [-1, 1, 2, 4, 8] { | ||||
|  | @ -2449,12 +2451,13 @@ pub fn (mut c Checker) unwrap_generic(typ ast.Type) ast.Type { | |||
| } | ||||
| 
 | ||||
| // TODO node must be mut
 | ||||
| pub fn (mut c Checker) expr(node ast.Expr) ast.Type { | ||||
| pub fn (mut c Checker) expr(node_ ast.Expr) ast.Type { | ||||
| 	c.expr_level++ | ||||
| 	defer { | ||||
| 		c.expr_level-- | ||||
| 	} | ||||
| 
 | ||||
| 	mut node := unsafe { node_ } | ||||
| 	if c.expr_level > checker.expr_level_cutoff_limit { | ||||
| 		c.error('checker: too many expr levels: $c.expr_level ', node.pos()) | ||||
| 		return ast.void_type | ||||
|  | @ -3090,7 +3093,7 @@ pub fn (mut c Checker) ident(mut node ast.Ident) ast.Type { | |||
| 		if node.tok_kind == .assign && node.is_mut { | ||||
| 			c.error('`mut` not allowed with `=` (use `:=` to declare a variable)', node.pos) | ||||
| 		} | ||||
| 		if obj := node.scope.find(node.name) { | ||||
| 		if mut obj := node.scope.find(node.name) { | ||||
| 			match mut obj { | ||||
| 				ast.GlobalField { | ||||
| 					node.kind = .global | ||||
|  | @ -3173,7 +3176,7 @@ pub fn (mut c Checker) ident(mut node ast.Ident) ast.Type { | |||
| 		else if !name.contains('.') && node.mod != 'builtin' { | ||||
| 			name = '${node.mod}.$node.name' | ||||
| 		} | ||||
| 		if obj := c.file.global_scope.find(name) { | ||||
| 		if mut obj := c.file.global_scope.find(name) { | ||||
| 			match mut obj { | ||||
| 				ast.ConstField { | ||||
| 					if !(obj.is_pub || obj.mod == c.mod || c.pref.is_test) { | ||||
|  |  | |||
|  | @ -23,6 +23,10 @@ pub fn (mut c Checker) match_expr(mut node ast.MatchExpr) ast.Type { | |||
| 	// we setting this here rather than at the end of the method
 | ||||
| 	// since it is used in c.match_exprs() it saves checking twice
 | ||||
| 	node.cond_type = ast.mktyp(cond_type) | ||||
| 	if (node.cond is ast.Ident && (node.cond as ast.Ident).is_mut) | ||||
| 		|| (node.cond is ast.SelectorExpr && (node.cond as ast.SelectorExpr).is_mut) { | ||||
| 		c.fail_if_immutable(node.cond) | ||||
| 	} | ||||
| 	c.ensure_type_exists(node.cond_type, node.pos) or { return ast.void_type } | ||||
| 	c.check_expr_opt_call(node.cond, cond_type) | ||||
| 	cond_type_sym := c.table.sym(cond_type) | ||||
|  | @ -307,7 +311,7 @@ fn (mut c Checker) match_exprs(mut node ast.MatchExpr, cond_type_sym ast.TypeSym | |||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| 		match mut cond_type_sym.info { | ||||
| 		match cond_type_sym.info { | ||||
| 			ast.SumType { | ||||
| 				for v in cond_type_sym.info.variants { | ||||
| 					v_str := c.table.type_to_str(v) | ||||
|  |  | |||
|  | @ -0,0 +1,7 @@ | |||
| vlib/v/checker/tests/match_mut_with_immutable_var_err.vv:5:12: error: `i` is immutable, declare it with `mut` to make it mutable | ||||
|     3 | fn main() { | ||||
|     4 |     i := Int(0) | ||||
|     5 |     match mut i { | ||||
|       |               ^ | ||||
|     6 |         int { i = 1 } | ||||
|     7 |         byte { i = 2 } | ||||
|  | @ -0,0 +1,10 @@ | |||
| type Int = byte | int | ||||
| 
 | ||||
| fn main() { | ||||
| 	i := Int(0) | ||||
| 	match mut i { | ||||
| 		int { i = 1 } | ||||
| 		byte { i = 2 } | ||||
| 	} | ||||
| 	println(i) | ||||
| } | ||||
|  | @ -505,7 +505,8 @@ fn stmt_is_single_line(stmt ast.Stmt) bool { | |||
| 
 | ||||
| //=== General Expr-related methods and helpers ===//
 | ||||
| 
 | ||||
| pub fn (mut f Fmt) expr(node ast.Expr) { | ||||
| pub fn (mut f Fmt) expr(node_ ast.Expr) { | ||||
| 	mut node := unsafe { node_ } | ||||
| 	if f.is_debug { | ||||
| 		eprintln('expr: ${node.pos():-42} | node: ${node.type_name():-20} | $node.str()') | ||||
| 	} | ||||
|  |  | |||
|  | @ -107,7 +107,7 @@ fn (mut g Gen) gen_assert_metainfo(node ast.AssertStmt) string { | |||
| 	g.writeln('\t${metaname}.fn_name = ${ctoslit(fn_name)};') | ||||
| 	metasrc := cnewlines(ctoslit(src)) | ||||
| 	g.writeln('\t${metaname}.src = $metasrc;') | ||||
| 	match mut node.expr { | ||||
| 	match node.expr { | ||||
| 		ast.InfixExpr { | ||||
| 			expr_op_str := ctoslit(node.expr.op.str()) | ||||
| 			expr_left_str := cnewlines(ctoslit(node.expr.left.str())) | ||||
|  |  | |||
|  | @ -178,7 +178,7 @@ fn (mut g Gen) final_gen_str(typ StrType) { | |||
| 		g.gen_str_for_option(typ.typ, styp, str_fn_name) | ||||
| 		return | ||||
| 	} | ||||
| 	match mut sym.info { | ||||
| 	match sym.info { | ||||
| 		ast.Alias { | ||||
| 			if sym.info.is_import { | ||||
| 				g.gen_str_default(sym, styp, str_fn_name) | ||||
|  |  | |||
|  | @ -1122,7 +1122,7 @@ fn (mut g Gen) cc_type(typ ast.Type, is_prefix_struct bool) string { | |||
| 	sym := g.table.sym(g.unwrap_generic(typ)) | ||||
| 	mut styp := sym.cname | ||||
| 	// TODO: this needs to be removed; cgen shouldn't resolve generic types (job of checker)
 | ||||
| 	match mut sym.info { | ||||
| 	match sym.info { | ||||
| 		ast.Struct, ast.Interface, ast.SumType { | ||||
| 			if sym.info.is_generic { | ||||
| 				mut sgtyps := '_T' | ||||
|  | @ -2733,7 +2733,7 @@ fn (mut g Gen) map_fn_ptrs(key_typ ast.TypeSymbol) (string, string, string, stri | |||
| 	return hash_fn, key_eq_fn, clone_fn, free_fn | ||||
| } | ||||
| 
 | ||||
| fn (mut g Gen) expr(node ast.Expr) { | ||||
| fn (mut g Gen) expr(node_ ast.Expr) { | ||||
| 	// println('cgen expr() line_nr=$node.pos.line_nr')
 | ||||
| 	old_discard_or_result := g.discard_or_result | ||||
| 	old_is_void_expr_stmt := g.is_void_expr_stmt | ||||
|  | @ -2744,6 +2744,7 @@ fn (mut g Gen) expr(node ast.Expr) { | |||
| 		g.discard_or_result = false | ||||
| 	} | ||||
| 	// Note: please keep the type names in the match here in alphabetical order:
 | ||||
| 	mut node := unsafe { node_ } | ||||
| 	match mut node { | ||||
| 		ast.ComptimeType { | ||||
| 			g.error('g.expr(): Unhandled ComptimeType', node.pos) | ||||
|  | @ -4550,7 +4551,7 @@ fn (mut g Gen) write_types(symbols []&ast.TypeSymbol) { | |||
| 		} | ||||
| 		// sym := g.table.sym(typ)
 | ||||
| 		mut name := sym.cname | ||||
| 		match mut sym.info { | ||||
| 		match sym.info { | ||||
| 			ast.Struct { | ||||
| 				if sym.info.is_generic { | ||||
| 					continue | ||||
|  | @ -4724,7 +4725,7 @@ fn (g &Gen) sort_structs(typesa []&ast.TypeSymbol) []&ast.TypeSymbol { | |||
| 		} | ||||
| 		// create list of deps
 | ||||
| 		mut field_deps := []string{} | ||||
| 		match mut sym.info { | ||||
| 		match sym.info { | ||||
| 			ast.ArrayFixed { | ||||
| 				dep := g.table.sym(sym.info.elem_type).name | ||||
| 				if dep in type_names { | ||||
|  | @ -5576,7 +5577,7 @@ static inline __shared__$interface_name ${shared_fn_name}(__shared__$cctype* x) | |||
| 				mut name := method.name | ||||
| 				if inter_info.parent_type.has_flag(.generic) { | ||||
| 					parent_sym := g.table.sym(inter_info.parent_type) | ||||
| 					match mut parent_sym.info { | ||||
| 					match parent_sym.info { | ||||
| 						ast.Struct, ast.Interface, ast.SumType { | ||||
| 							name = g.generic_fn_name(parent_sym.info.concrete_types, method.name, | ||||
| 								false) | ||||
|  |  | |||
|  | @ -1443,7 +1443,7 @@ fn (mut g Gen) autofree_call_pregen(node ast.CallExpr) { | |||
| 			// We do not need to declare this variable again, so just generate `t = ...`
 | ||||
| 			// instead of `string t = ...`, and we need to mark this variable as unused,
 | ||||
| 			// so that it's freed after the call. (Used tmp arg vars are not freed to avoid double frees).
 | ||||
| 			if x := scope.find(t) { | ||||
| 			if mut x := scope.find(t) { | ||||
| 				match mut x { | ||||
| 					ast.Var { x.is_used = false } | ||||
| 					else {} | ||||
|  | @ -1491,8 +1491,8 @@ fn (mut g Gen) autofree_call_postgen(node_pos int) { | |||
| 	} | ||||
| 	// g.doing_autofree_tmp = true
 | ||||
| 	// g.write('/* postgen */')
 | ||||
| 	scope := g.file.scope.innermost(node_pos) | ||||
| 	for _, obj in scope.objects { | ||||
| 	mut scope := g.file.scope.innermost(node_pos) | ||||
| 	for _, mut obj in scope.objects { | ||||
| 		match mut obj { | ||||
| 			ast.Var { | ||||
| 				// if var.typ == 0 {
 | ||||
|  |  | |||
|  | @ -501,7 +501,7 @@ fn (mut g Gen) infix_expr_is_op(node ast.InfixExpr) { | |||
| 	if sym.kind == .interface_ { | ||||
| 		g.write('_typ $cmp_op ') | ||||
| 		// `_Animal_Dog_index`
 | ||||
| 		sub_type := match mut node.right { | ||||
| 		sub_type := match node.right { | ||||
| 			ast.TypeNode { node.right.typ } | ||||
| 			ast.None { g.table.type_idxs['None__'] } | ||||
| 			else { ast.Type(0) } | ||||
|  |  | |||
|  | @ -59,7 +59,7 @@ fn (mut g JsGen) final_gen_str(typ StrType) { | |||
| 		g.gen_str_for_option(typ.typ, styp, str_fn_name) | ||||
| 		return | ||||
| 	} | ||||
| 	match mut sym.info { | ||||
| 	match sym.info { | ||||
| 		ast.Alias { | ||||
| 			if sym.info.is_import { | ||||
| 				g.gen_str_default(sym, styp, str_fn_name) | ||||
|  |  | |||
|  | @ -206,7 +206,7 @@ fn (mut g JsGen) final_gen_copy(typ StrType) { | |||
| 		} | ||||
| 		else {} | ||||
| 	} | ||||
| 	match mut sym.info { | ||||
| 	match sym.info { | ||||
| 		ast.Alias { | ||||
| 			g.gen_copy_for_alias(sym.info, styp, copy_fn_name) | ||||
| 		} | ||||
|  |  | |||
|  | @ -641,8 +641,9 @@ fn (mut g JsGen) gen_alias_type_decl(node ast.AliasTypeDecl) { | |||
| 	g.writeln('function ${name}(val) { return val;  }') | ||||
| } | ||||
| 
 | ||||
| fn (mut g JsGen) stmt_no_semi(node ast.Stmt) { | ||||
| fn (mut g JsGen) stmt_no_semi(node_ ast.Stmt) { | ||||
| 	g.stmt_start_pos = g.out.len | ||||
| 	mut node := unsafe { node_ } | ||||
| 	match mut node { | ||||
| 		ast.EmptyStmt {} | ||||
| 		ast.AsmStmt { | ||||
|  | @ -744,8 +745,9 @@ fn (mut g JsGen) stmt_no_semi(node ast.Stmt) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn (mut g JsGen) stmt(node ast.Stmt) { | ||||
| fn (mut g JsGen) stmt(node_ ast.Stmt) { | ||||
| 	g.stmt_start_pos = g.out.len | ||||
| 	mut node := unsafe { node_ } | ||||
| 	match mut node { | ||||
| 		ast.EmptyStmt {} | ||||
| 		ast.AsmStmt { | ||||
|  | @ -853,8 +855,9 @@ fn (mut g JsGen) stmt(node ast.Stmt) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn (mut g JsGen) expr(node ast.Expr) { | ||||
| fn (mut g JsGen) expr(node_ ast.Expr) { | ||||
| 	// Note: please keep the type names in the match here in alphabetical order:
 | ||||
| 	mut node := unsafe { node_ } | ||||
| 	match mut node { | ||||
| 		ast.ComptimeType { | ||||
| 			verror('not yet implemented') | ||||
|  | @ -1128,7 +1131,7 @@ fn (mut g JsGen) gen_assert_metainfo(node ast.AssertStmt) string { | |||
| 	metasrc := src | ||||
| 	g.writeln('${metaname}.src = "$metasrc"') | ||||
| 
 | ||||
| 	match mut node.expr { | ||||
| 	match node.expr { | ||||
| 		ast.InfixExpr { | ||||
| 			expr_op_str := node.expr.op.str() | ||||
| 			expr_left_str := node.expr.left.str() | ||||
|  | @ -1594,7 +1597,7 @@ fn (mut g JsGen) gen_expr_stmt_no_semi(it ast.ExprStmt) { | |||
| fn (mut g JsGen) cc_type(typ ast.Type, is_prefix_struct bool) string { | ||||
| 	sym := g.table.sym(g.unwrap_generic(typ)) | ||||
| 	mut styp := sym.cname.replace('>', '').replace('<', '') | ||||
| 	match mut sym.info { | ||||
| 	match sym.info { | ||||
| 		ast.Struct, ast.Interface, ast.SumType { | ||||
| 			if sym.info.is_generic { | ||||
| 				mut sgtyps := '_T' | ||||
|  |  | |||
|  | @ -1209,13 +1209,13 @@ fn (mut g Gen) infix_expr(node ast.InfixExpr) { | |||
| 	if node.left is ast.InfixExpr { | ||||
| 		g.n_error('only simple expressions are supported right now (not more than 2 operands)') | ||||
| 	} | ||||
| 	match mut node.left { | ||||
| 	match node.left { | ||||
| 		ast.Ident { | ||||
| 			g.mov_var_to_reg(.eax, g.get_var_offset(node.left.name)) | ||||
| 		} | ||||
| 		else {} | ||||
| 	} | ||||
| 	if mut node.right is ast.Ident { | ||||
| 	if node.right is ast.Ident { | ||||
| 		var_offset := g.get_var_offset(node.right.name) | ||||
| 		match node.op { | ||||
| 			.plus { g.add8_var(.eax, var_offset) } | ||||
|  | @ -1409,9 +1409,9 @@ fn (mut g Gen) cjmp_op(op token.Kind) int { | |||
| } | ||||
| 
 | ||||
| fn (mut g Gen) condition(infix_expr ast.InfixExpr, neg bool) int { | ||||
| 	match mut infix_expr.left { | ||||
| 	match infix_expr.left { | ||||
| 		ast.IntegerLiteral { | ||||
| 			match mut infix_expr.right { | ||||
| 			match infix_expr.right { | ||||
| 				ast.IntegerLiteral { | ||||
| 					// 3 < 4
 | ||||
| 					a0 := infix_expr.left.val.int() | ||||
|  | @ -1435,7 +1435,7 @@ fn (mut g Gen) condition(infix_expr ast.InfixExpr, neg bool) int { | |||
| 			} | ||||
| 		} | ||||
| 		ast.Ident { | ||||
| 			match mut infix_expr.right { | ||||
| 			match infix_expr.right { | ||||
| 				ast.IntegerLiteral { | ||||
| 					// var < 4
 | ||||
| 					lit := infix_expr.right as ast.IntegerLiteral | ||||
|  | @ -1515,7 +1515,7 @@ fn (mut g Gen) for_stmt(node ast.ForStmt) { | |||
| 	infix_expr := node.cond as ast.InfixExpr | ||||
| 	mut jump_addr := 0 // location of `jne *00 00 00 00*`
 | ||||
| 	start := g.pos() | ||||
| 	match mut infix_expr.left { | ||||
| 	match infix_expr.left { | ||||
| 		ast.Ident { | ||||
| 			match infix_expr.right { | ||||
| 				ast.Ident { | ||||
|  |  | |||
|  | @ -486,7 +486,7 @@ fn (mut g Gen) gen_forc_stmt(node ast.ForCStmt) { | |||
| 		match cond { | ||||
| 			ast.InfixExpr { | ||||
| 				// g.infix_expr(node.cond)
 | ||||
| 				match mut cond.left { | ||||
| 				match cond.left { | ||||
| 					ast.Ident { | ||||
| 						lit := cond.right as ast.IntegerLiteral | ||||
| 						g.cmp_var(cond.left.name, lit.val.int()) | ||||
|  |  | |||
|  | @ -96,7 +96,8 @@ pub fn (mut w Walker) mark_markused_globals() { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| pub fn (mut w Walker) stmt(node ast.Stmt) { | ||||
| pub fn (mut w Walker) stmt(node_ ast.Stmt) { | ||||
| 	mut node := unsafe { node_ } | ||||
| 	match mut node { | ||||
| 		ast.EmptyStmt {} | ||||
| 		ast.AsmStmt { | ||||
|  | @ -215,7 +216,8 @@ fn (mut w Walker) exprs(exprs []ast.Expr) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn (mut w Walker) expr(node ast.Expr) { | ||||
| fn (mut w Walker) expr(node_ ast.Expr) { | ||||
| 	mut node := unsafe { node_ } | ||||
| 	match mut node { | ||||
| 		ast.EmptyExpr { | ||||
| 			// TODO make sure this doesn't happen
 | ||||
|  |  | |||
|  | @ -175,7 +175,8 @@ fn (mut p Parser) partial_assign_stmt(left []ast.Expr, left_comments []ast.Comme | |||
| 	mut has_cross_var := false | ||||
| 	mut is_static := false | ||||
| 	mut is_volatile := false | ||||
| 	for i, lx in left { | ||||
| 	for i, lx_ in left { | ||||
| 		mut lx := unsafe { lx_ } | ||||
| 		match mut lx { | ||||
| 			ast.Ident { | ||||
| 				if op == .decl_assign { | ||||
|  |  | |||
|  | @ -3750,7 +3750,7 @@ fn (mut p Parser) rewind_scanner_to_current_token_in_new_mode() { | |||
| 
 | ||||
| // returns true if `varname` is known
 | ||||
| pub fn (mut p Parser) mark_var_as_used(varname string) bool { | ||||
| 	if obj := p.scope.find(varname) { | ||||
| 	if mut obj := p.scope.find(varname) { | ||||
| 		match mut obj { | ||||
| 			ast.Var { | ||||
| 				obj.is_used = true | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ fn test_sumtype_assign() { | |||
| 		text: 'baz' | ||||
| 	} | ||||
| 	mut results := []string{} | ||||
| 	for a in arr { | ||||
| 	for mut a in arr { | ||||
| 		match mut a { | ||||
| 			Bar, Baz { | ||||
| 				a.text = 'I am ' + a.text | ||||
|  |  | |||
|  | @ -401,7 +401,7 @@ pub fn (mut t Transformer) expr_stmt_match_expr(mut node ast.MatchExpr) ast.Expr | |||
| 		for mut expr in branch.exprs { | ||||
| 			expr = t.expr(mut expr) | ||||
| 
 | ||||
| 			match mut cond { | ||||
| 			match cond { | ||||
| 				ast.BoolLiteral { | ||||
| 					if expr is ast.BoolLiteral { | ||||
| 						if cond.val == (expr as ast.BoolLiteral).val { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue