autofree: fix `for` args
							parent
							
								
									b6ae81032f
								
							
						
					
					
						commit
						8eff8b0eff
					
				| 
						 | 
				
			
			@ -368,8 +368,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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2099,9 +2099,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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -104,6 +104,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`')
 | 
			
		||||
| 
						 | 
				
			
			@ -129,6 +130,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)
 | 
			
		||||
| 
						 | 
				
			
			@ -140,6 +142,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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -294,6 +294,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