Skip to content

Commit a298fb8

Browse files
authored
cgen: fix codegen for option unwrapped var passed to generic option type (fix #23972) (#24096)
1 parent 44d3d59 commit a298fb8

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

vlib/v/gen/c/fn.v

+8-1
Original file line numberDiff line numberDiff line change
@@ -2614,7 +2614,7 @@ fn (mut g Gen) keep_alive_call_postgen(node ast.CallExpr, tmp_cnt_save int) {
26142614

26152615
@[inline]
26162616
fn (mut g Gen) ref_or_deref_arg(arg ast.CallArg, expected_type ast.Type, lang ast.Language, is_smartcast bool) {
2617-
arg_typ := if arg.ct_expr {
2617+
mut arg_typ := if arg.ct_expr {
26182618
g.unwrap_generic(g.type_resolver.get_type(arg.expr))
26192619
} else {
26202620
g.unwrap_generic(arg.typ)
@@ -2754,6 +2754,13 @@ fn (mut g Gen) ref_or_deref_arg(arg ast.CallArg, expected_type ast.Type, lang as
27542754
if (arg_sym.info is ast.Alias || exp_sym.info is ast.Alias) && expected_type != arg_typ {
27552755
g.expr_opt_with_alias(arg.expr, arg_typ, expected_type)
27562756
} else {
2757+
if arg.expr is ast.Ident {
2758+
if arg.expr.obj is ast.Var {
2759+
if arg.expr.obj.smartcasts.len > 0 {
2760+
arg_typ = arg.expr.obj.smartcasts.last()
2761+
}
2762+
}
2763+
}
27572764
g.expr_with_opt(arg.expr, arg_typ, expected_type)
27582765
}
27592766
return

vlib/v/gen/c/infix.v

+10-1
Original file line numberDiff line numberDiff line change
@@ -1030,14 +1030,23 @@ fn (mut g Gen) infix_expr_left_shift_op(node ast.InfixExpr) {
10301030
elem_sym := g.table.final_sym(array_info.elem_type)
10311031
elem_is_array_var := elem_sym.kind in [.array, .array_fixed] && node.right is ast.Ident
10321032
g.write('array_push${noscan}((array*)')
1033+
mut needs_addr := false
10331034
if !left.typ.is_ptr()
10341035
|| (node.left_type.has_flag(.shared_f) && !node.left_type.deref().is_ptr()) {
1035-
g.write('&')
1036+
if node.left is ast.CallExpr {
1037+
g.write('ADDR(${g.styp(node.left_type)}, ')
1038+
needs_addr = true
1039+
} else {
1040+
g.write('&')
1041+
}
10361042
}
10371043
g.expr(node.left)
10381044
if node.left_type.has_flag(.shared_f) {
10391045
g.write('->val')
10401046
}
1047+
if needs_addr {
1048+
g.write(')')
1049+
}
10411050
if elem_sym.kind == .function {
10421051
g.write(', _MOV((voidptr[]){ ')
10431052
} else if elem_is_array_var {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
fn test_main() {
2+
mut arr := ?[]int(none)
3+
if arr == none {
4+
arr = []int{}
5+
} else {
6+
ret := unwrap(arr)
7+
assert ret == arr
8+
}
9+
assert arr?.len == 0
10+
}
11+
12+
fn t(a ?int) {}
13+
14+
@[inline]
15+
pub fn unwrap[T](t ?T) T {
16+
return t or { panic('unexpected `none`') }
17+
}

0 commit comments

Comments
 (0)