Skip to content

Commit ce26d5b

Browse files
authored
cgen: fix mutable receiver type calling mapping function causes C error (fix #14230) (#14696)
1 parent 778fe2c commit ce26d5b

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

vlib/v/gen/c/array.v

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,15 @@ fn (mut g Gen) gen_array_map(node ast.CallExpr) {
345345
}
346346
left_type := if node.left_type.has_flag(.shared_f) {
347347
node.left_type.clear_flag(.shared_f).deref()
348+
} else if node.left_type.is_ptr() {
349+
node.left_type.deref()
348350
} else {
349351
node.left_type
350352
}
351353
g.write('${g.typ(left_type)} ${tmp}_orig = ')
354+
if !node.left_type.has_flag(.shared_f) && node.left_type.is_ptr() {
355+
g.write('*')
356+
}
352357
g.expr(node.left)
353358
if node.left_type.has_flag(.shared_f) {
354359
g.write('->val')
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[1, 0, 0]
2+
[0, 1, 0]
3+
[0, 0, 1]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
fn (mut a [][]f32) str() string {
2+
return a.map(it.str()).join('\n')
3+
}
4+
5+
fn identity(n int) [][]f32 {
6+
mut res := [][]f32{len: n, init: []f32{len: n, init: 0.0}}
7+
for i in 0 .. n {
8+
res[i][i] = 1.0
9+
}
10+
11+
return res
12+
}
13+
14+
fn main() {
15+
a := identity(3)
16+
17+
println(a)
18+
}

0 commit comments

Comments
 (0)