Skip to content

Commit e48e28d

Browse files
authored
cgen: fix premature variable release by autofree (#20731)
1 parent 4b46461 commit e48e28d

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

vlib/v/gen/c/cgen.v

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2970,7 +2970,9 @@ fn (mut g Gen) autofree_scope_vars2(scope &ast.Scope, start_pos int, end_pos int
29702970
// continue
29712971
// }
29722972
// if v.pos.pos > end_pos {
2973-
if obj.pos.pos > end_pos || (obj.pos.pos < start_pos && obj.pos.line_nr == line_nr) {
2973+
if obj.pos.pos > end_pos
2974+
|| (obj.pos.pos < start_pos && obj.pos.line_nr == line_nr)
2975+
|| (end_pos < scope.end_pos && obj.expr is ast.IfExpr) {
29742976
// Do not free vars that were declared after this scope
29752977
continue
29762978
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
fn main() {
2+
out := if temp := f('') {
3+
temp
4+
} else if temp := f('something') {
5+
temp
6+
} else {
7+
return
8+
}
9+
10+
assert out[0] == 104
11+
assert out[1] == 105
12+
}
13+
14+
fn f(s string) ?[]u8 {
15+
if s == '' {
16+
return none
17+
}
18+
return [u8(104), 105]
19+
}

0 commit comments

Comments
 (0)