autofree: handle tmp vars in for loops
							parent
							
								
									80c48ebe81
								
							
						
					
					
						commit
						1d6c604664
					
				|  | @ -369,8 +369,9 @@ pub mut: | |||
| 	pos             token.Position | ||||
| 	is_used         bool | ||||
| 	is_changed      bool // to detect mutable vars that are never changed
 | ||||
| 	is_or           bool // `x := foo() or { ... }`
 | ||||
| 	// (for setting the position after the or block for autofree)
 | ||||
| 	is_or           bool // `x := foo() or { ... }`
 | ||||
| 	is_tmp          bool // for tmp for loop vars, so that autofree can skip them
 | ||||
| } | ||||
| 
 | ||||
| // used for smartcasting only
 | ||||
|  |  | |||
|  | @ -2100,9 +2100,14 @@ fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int | |||
| 					continue | ||||
| 				} | ||||
| 				if obj.is_or { | ||||
| 					g.writeln('// skipping `or{}` var "$obj.name"') | ||||
| 					// Skip vars inited with the `or {}`, since they are generated
 | ||||
| 					// after the or block in C.
 | ||||
| 					g.writeln('// skipping `or{}` var "$obj.name"') | ||||
| 					continue | ||||
| 				} | ||||
| 				if obj.is_tmp { | ||||
| 					// Skip for loop vars
 | ||||
| 					g.writeln('// skipping tmp var "$obj.name"') | ||||
| 					continue | ||||
| 				} | ||||
| 				// if var.typ == 0 {
 | ||||
|  |  | |||
|  | @ -105,6 +105,7 @@ fn (mut p Parser) for_stmt() ast.Stmt { | |||
| 				name: key_var_name | ||||
| 				typ: table.int_type | ||||
| 				pos: key_var_pos | ||||
| 				is_tmp: true | ||||
| 			}) | ||||
| 		} else if p.scope.known_var(val_var_name) { | ||||
| 			p.error('redefinition of value iteration variable `$val_var_name`') | ||||
|  | @ -130,6 +131,7 @@ fn (mut p Parser) for_stmt() ast.Stmt { | |||
| 				name: val_var_name | ||||
| 				typ: table.int_type | ||||
| 				pos: val_var_pos | ||||
| 				is_tmp: true | ||||
| 			}) | ||||
| 			if key_var_name.len > 0 { | ||||
| 				p.error_with_pos('cannot declare index variable with range `for`', key_var_pos) | ||||
|  | @ -141,6 +143,7 @@ fn (mut p Parser) for_stmt() ast.Stmt { | |||
| 				name: val_var_name | ||||
| 				pos: val_var_pos | ||||
| 				is_mut: val_is_mut | ||||
| 				is_tmp: true | ||||
| 			}) | ||||
| 		} | ||||
| 		p.inside_for = false | ||||
|  |  | |||
|  | @ -291,6 +291,11 @@ fn free_before_break() { | |||
| 			continue | ||||
| 		} | ||||
| 	} | ||||
| 	x := ['1', '2', '3'] | ||||
| 	for n in x { | ||||
| 		f := 'f' | ||||
| 		println('$n => $f') | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| struct User { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue