Skip to content

Commit 38ac4e6

Browse files
committed
orm: cgen bug fix (fixes #25847)
1 parent ad9d912 commit 38ac4e6

3 files changed

Lines changed: 57 additions & 3 deletions

File tree

‎vlib/orm/orm_func.v‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,9 @@ pub fn (qb_ &QueryBuilder[T]) set(assign string, values ...Primitive) !&QueryBui
363363
fields << field
364364
}
365365
qb.data.fields << fields
366-
qb.data.data << values
366+
for v in values {
367+
qb.data.data << v
368+
}
367369
return qb
368370
}
369371

‎vlib/v/gen/c/infix.v‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,8 +1055,8 @@ fn (mut g Gen) infix_expr_left_shift_op(node ast.InfixExpr) {
10551055
if (right.unaliased_sym.kind == .array
10561056
|| (right.unaliased_sym.kind == .struct && right.unaliased_sym.name == 'array'))
10571057
&& left.sym.nr_dims() == right.sym.nr_dims() && array_info.elem_type != right.typ
1058-
&& !elem_is_option && !(right.sym.kind == .alias
1059-
&& g.table.sumtype_has_variant(array_info.elem_type, node.right_type, false)) {
1058+
&& !elem_is_option
1059+
&& !g.table.sumtype_has_variant(array_info.elem_type, node.right_type, false) {
10601060
// push an array => PUSH_MANY, but not if pushing an array to 2d array (`[][]int << []int`)
10611061
g.write('_PUSH_MANY${noscan}(')
10621062
mut expected_push_many_atype := left.typ
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// vtest flance: -d MOREINFO
2+
// Test for issue #25847: C error with sumtype arrays
3+
// Bug: When pushing an array to []SumType where SumType has []SumType as a variant,
4+
// the compiler incorrectly used PUSH_MANY instead of pushing as a single element.
5+
6+
type Prim = int | string | []Prim
7+
8+
fn test_push_array_literal_to_sumtype_array() {
9+
mut args := []Prim{}
10+
// Push an array literal as a single element (it should become a Prim variant)
11+
args << [Prim(1), Prim(2)]
12+
assert args.len == 1
13+
14+
inner := args[0] as []Prim
15+
assert inner.len == 2
16+
assert (inner[0] as int) == 1
17+
assert (inner[1] as int) == 2
18+
}
19+
20+
fn test_push_array_variable_to_sumtype_array() {
21+
mut args := []Prim{}
22+
// Push an array variable as a single Prim element
23+
nested := []Prim{len: 2, init: Prim(index)}
24+
args << nested
25+
assert args.len == 1
26+
27+
inner := args[0] as []Prim
28+
assert inner.len == 2
29+
}
30+
31+
fn test_push_single_elements_still_works() {
32+
mut args := []Prim{}
33+
// Push single elements (not arrays)
34+
args << 42
35+
args << 'hello'
36+
args << 123
37+
assert args.len == 3
38+
39+
assert (args[0] as int) == 42
40+
assert (args[1] as string) == 'hello'
41+
assert (args[2] as int) == 123
42+
}
43+
44+
fn test_empty_sumtype_array_init() {
45+
mut args := []Prim{}
46+
assert args.len == 0
47+
48+
for i in 0 .. 3 {
49+
args << i
50+
}
51+
assert args.len == 3
52+
}

0 commit comments

Comments
 (0)