autofree: fix `for` args
							parent
							
								
									b6ae81032f
								
							
						
					
					
						commit
						8eff8b0eff
					
				| 
						 | 
					@ -368,8 +368,9 @@ pub mut:
 | 
				
			||||||
	pos             token.Position
 | 
						pos             token.Position
 | 
				
			||||||
	is_used         bool
 | 
						is_used         bool
 | 
				
			||||||
	is_changed      bool // to detect mutable vars that are never changed
 | 
						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)
 | 
						// (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
 | 
						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
 | 
										continue
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if obj.is_or {
 | 
									if obj.is_or {
 | 
				
			||||||
					g.writeln('// skipping `or{}` var "$obj.name"')
 | 
					 | 
				
			||||||
					// Skip vars inited with the `or {}`, since they are generated
 | 
										// Skip vars inited with the `or {}`, since they are generated
 | 
				
			||||||
					// after the or block in C.
 | 
										// 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
 | 
										continue
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				// if var.typ == 0 {
 | 
									// if var.typ == 0 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -104,6 +104,7 @@ fn (mut p Parser) for_stmt() ast.Stmt {
 | 
				
			||||||
				name: key_var_name
 | 
									name: key_var_name
 | 
				
			||||||
				typ: table.int_type
 | 
									typ: table.int_type
 | 
				
			||||||
				pos: key_var_pos
 | 
									pos: key_var_pos
 | 
				
			||||||
 | 
									is_tmp: true
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
		} else if p.scope.known_var(val_var_name) {
 | 
							} else if p.scope.known_var(val_var_name) {
 | 
				
			||||||
			p.error('redefinition of value iteration variable `$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
 | 
									name: val_var_name
 | 
				
			||||||
				typ: table.int_type
 | 
									typ: table.int_type
 | 
				
			||||||
				pos: val_var_pos
 | 
									pos: val_var_pos
 | 
				
			||||||
 | 
									is_tmp: true
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
			if key_var_name.len > 0 {
 | 
								if key_var_name.len > 0 {
 | 
				
			||||||
				p.error_with_pos('cannot declare index variable with range `for`', key_var_pos)
 | 
									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
 | 
									name: val_var_name
 | 
				
			||||||
				pos: val_var_pos
 | 
									pos: val_var_pos
 | 
				
			||||||
				is_mut: val_is_mut
 | 
									is_mut: val_is_mut
 | 
				
			||||||
 | 
									is_tmp: true
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		p.inside_for = false
 | 
							p.inside_for = false
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -294,6 +294,11 @@ fn free_before_break() {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						x := ['1', '2', '3']
 | 
				
			||||||
 | 
						for n in x {
 | 
				
			||||||
 | 
							f := 'f'
 | 
				
			||||||
 | 
							println('$n => $f')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct User {
 | 
					struct User {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue