autofree: fix `for` args

pull/7162/head
Alexander Medvednikov 2020-12-06 08:38:21 +01:00
parent b6ae81032f
commit 8eff8b0eff
4 changed files with 16 additions and 2 deletions

View File

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

View File

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

View File

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

View File

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