Skip to content

Commit fe5609d

Browse files
authored
cgen: fix generation of a missing return in return if cond { x } else { return missing } (fix #22838) (#22839)
1 parent 55d6920 commit fe5609d

4 files changed

Lines changed: 34 additions & 0 deletions

File tree

vlib/v/gen/c/cgen.v

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,6 +1958,8 @@ fn (mut g Gen) stmts_with_tmp_var(stmts []ast.Stmt, tmp_var string) bool {
19581958
}
19591959
}
19601960
}
1961+
} else if stmt is ast.Return {
1962+
g.stmt(stmt)
19611963
}
19621964
} else {
19631965
g.set_current_pos_as_last_stmt_pos()
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
VV_LOCAL_SYMBOL _result_string main__empty(string s) {
2+
_result_string _t2; /* if prepend */
3+
if ((s).len != 0) {
4+
_result_ok(&(string[]) { s }, (_result*)(&_t2), sizeof(string));
5+
} else {
6+
return (_result_string){ .is_error=true, .err=_v_error(_SLIT("empty")), .data={EMPTY_STRUCT_INITIALIZATION} };
7+
}
8+
_result_string _t1 = _t2;
9+
return _t1;
10+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
expected error empty
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
fn empty(s string) !string {
2+
return if s != '' {
3+
s
4+
} else {
5+
return error('empty')
6+
}
7+
}
8+
9+
fn main() {
10+
str_1 := empty('something') or {
11+
assert false, 'something is not empty!'
12+
return
13+
}
14+
assert str_1 == 'something'
15+
16+
str_2 := empty('') or {
17+
println('expected error ${err}')
18+
return
19+
}
20+
assert false, 'invalid accepted ${str_2}'
21+
}

0 commit comments

Comments
 (0)