autofree: handle tmp vars in for loops

pull/7152/head
Alexander Medvednikov 2020-12-05 20:11:28 +01:00
parent 80c48ebe81
commit 1d6c604664
4 changed files with 16 additions and 2 deletions

View File

@ -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

View File

@ -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 {

View File

@ -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

View File

@ -291,6 +291,11 @@ fn free_before_break() {
continue
}
}
x := ['1', '2', '3']
for n in x {
f := 'f'
println('$n => $f')
}
}
struct User {