Skip to content

Commit 08eef34

Browse files
authored
cgen: fix codegen for assign from unsafeexpr resulting fixed array (fix #22301) (#22309)
1 parent 31e71e9 commit 08eef34

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

vlib/v/gen/c/assign.v

+2-1
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,8 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
399399
&& (val in [ast.Ident, ast.IndexExpr, ast.CallExpr, ast.SelectorExpr, ast.DumpExpr, ast.InfixExpr]
400400
|| (val is ast.CastExpr && val.expr !is ast.ArrayInit)
401401
|| (val is ast.PrefixExpr && val.op == .arrow)
402-
|| (val is ast.UnsafeExpr && val.expr is ast.Ident)) && !g.pref.translated
402+
|| (val is ast.UnsafeExpr && val.expr in [ast.SelectorExpr, ast.Ident]))
403+
&& !g.pref.translated
403404
g.is_assign_lhs = true
404405
g.assign_op = node.op
405406

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
union Convertor {
2+
su8_array_p [20]u8
3+
sint_array_p [5]int
4+
}
5+
6+
fn test_main() {
7+
a := [1, 2, 3, 4, 5]!
8+
p := voidptr(unsafe { &Convertor(&a[0]) })
9+
c := unsafe { &Convertor(p).su8_array_p }
10+
dump(a)
11+
dump(p)
12+
dump(c)
13+
assert a == [1, 2, 3, 4, 5]!
14+
assert p != 0
15+
$if little_endian {
16+
assert c == [u8(1), 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0]!
17+
}
18+
$if big_endian {
19+
assert c == [u8(0), 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5]!
20+
}
21+
}

0 commit comments

Comments
 (0)