Skip to content

Commit 2785105

Browse files
authored
cgen: fix missing cast if fixed array is surrounded in brackets (fix #25629) (#25741)
1 parent 3d7be5f commit 2785105

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

vlib/builtin/array_test.v

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,11 @@ fn test_fixed_array_literal_eq() {
806806

807807
assert [[1, 1]!, [2, 2]!] == [[1, 1]!, [2, 2]!]
808808
assert [[1, 1]!, [2, 2]!] != [[1, 2]!, [2, 3]!]
809+
810+
// vfmt off
811+
assert ([1, 2, 3]!) == [1, 2, 3]!
812+
assert (([1, 2, 3]!)) == [1, 2, 3]!
813+
// vfmt on
809814
}
810815

811816
fn test_sort() {

vlib/v/gen/c/assign.v

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,13 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
474474
is_fixed_array_init = val.is_fixed
475475
has_val = val.has_val
476476
}
477+
ast.ParExpr {
478+
if val.expr is ast.ArrayInit {
479+
array_init := val.expr as ast.ArrayInit
480+
is_fixed_array_init = array_init.is_fixed
481+
has_val = array_init.has_val
482+
}
483+
}
477484
ast.CallExpr {
478485
is_call = true
479486
if val.comptime_ret_val {
@@ -1026,6 +1033,19 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
10261033
} else {
10271034
g.array_init(val, cvar_name)
10281035
}
1036+
} else if val is ast.ParExpr && val.expr is ast.ArrayInit {
1037+
array_init := val.expr as ast.ArrayInit
1038+
cvar_name := c_name(ident.name)
1039+
if array_init.is_fixed && ident.name in g.defer_vars {
1040+
g.go_before_last_stmt()
1041+
g.empty_line = true
1042+
g.write('memcpy(${cvar_name}, ')
1043+
g.write('(${styp})')
1044+
g.array_init(array_init, cvar_name)
1045+
g.write(', sizeof(${styp}))')
1046+
} else {
1047+
g.array_init(array_init, cvar_name)
1048+
}
10291049
} else if val_type.has_flag(.shared_f) {
10301050
g.expr_with_cast(val, val_type, var_type)
10311051
} else if val in [ast.MatchExpr, ast.IfExpr]

vlib/v/gen/c/cgen.v

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3895,7 +3895,12 @@ fn (mut g Gen) expr(node_ ast.Expr) {
38953895
}
38963896
ast.ParExpr {
38973897
g.write('(')
3898-
g.expr(node.expr)
3898+
if node.expr is ast.ArrayInit && node.expr.is_fixed && !g.inside_assign {
3899+
array_init := node.expr as ast.ArrayInit
3900+
g.fixed_array_init_with_cast(array_init, array_init.typ)
3901+
} else {
3902+
g.expr(node.expr)
3903+
}
38993904
g.write(')')
39003905
}
39013906
ast.PostfixExpr {

0 commit comments

Comments
 (0)