mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
autofree: handle tmp vars in for loops
This commit is contained in:
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
Block a user