Skip to content

Commit

Permalink
cgen: fix assert for alias to fixed array (fix vlang#23149) (vlang#23161
Browse files Browse the repository at this point in the history
)
  • Loading branch information
felipensp authored Dec 14, 2024
1 parent 881fabf commit 9e71e32
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 0 deletions.
10 changes: 10 additions & 0 deletions vlib/v/ast/types.v
Original file line number Diff line number Diff line change
Expand Up @@ -1006,6 +1006,16 @@ pub fn (t &Struct) is_unresolved_generic() bool {
return t.generic_types.len > 0 && t.concrete_types.len == 0
}

pub fn (t &TypeSymbol) is_primitive_fixed_array() bool {
if t.info is ArrayFixed {
return global_table.final_sym(t.info.elem_type).is_primitive()
} else if t.info is Alias {
return global_table.final_sym(t.info.parent_type).is_primitive_fixed_array()
} else {
return false
}
}

pub fn (t &TypeSymbol) is_array_fixed() bool {
if t.info is ArrayFixed {
return true
Expand Down
5 changes: 5 additions & 0 deletions vlib/v/gen/c/auto_eq_methods.v
Original file line number Diff line number Diff line change
Expand Up @@ -437,6 +437,11 @@ fn (mut g Gen) gen_fixed_array_equality_fn(left_type ast.Type) string {

mut fn_builder := strings.new_builder(512)
fn_builder.writeln('inline bool ${ptr_styp}_arr_eq(${arg_styp} a, ${arg_styp} b) {')
if left_typ.sym.is_primitive_fixed_array() {
fn_builder.writeln('\tif (!memcmp(${left}, ${right}, sizeof(${arg_styp}))) {')
fn_builder.writeln('\t\treturn true;')
fn_builder.writeln('\t}')
}
fn_builder.writeln('\tfor (int i = 0; i < ${size}; ++i) {')
// compare every pair of elements of the two fixed arrays
if elem.sym.kind == .string {
Expand Down
17 changes: 17 additions & 0 deletions vlib/v/gen/c/infix.v
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,17 @@ fn (mut g Gen) infix_expr_eq_op(node ast.InfixExpr) {
if left.typ.is_ptr() {
g.write('*'.repeat(left.typ.nr_muls()))
}
if node.left is ast.StructInit && left.unaliased_sym.is_primitive_fixed_array() {
s := g.styp(left.unaliased)
g.write('(${s})')
}
g.expr(node.left)
g.write(', ')
if node.right is ast.StructInit
&& right.unaliased_sym.is_primitive_fixed_array() {
s := g.styp(right.unaliased)
g.write('(${s})')
}
if right.typ.is_ptr() {
g.write('*'.repeat(right.typ.nr_muls()))
}
Expand Down Expand Up @@ -266,6 +275,10 @@ fn (mut g Gen) infix_expr_eq_op(node ast.InfixExpr) {
s := g.styp(left.unaliased)
g.write('(${s})')
}
} else if node.left is ast.StructInit
&& left.unaliased_sym.is_primitive_fixed_array() {
s := g.styp(left.unaliased)
g.write('(${s})')
}
g.expr(node.left)
g.write(', ')
Expand All @@ -274,6 +287,10 @@ fn (mut g Gen) infix_expr_eq_op(node ast.InfixExpr) {
s := g.styp(right.unaliased)
g.write('(${s})')
}
} else if node.right is ast.StructInit
&& right.unaliased_sym.is_primitive_fixed_array() {
s := g.styp(right.unaliased)
g.write('(${s})')
}
g.expr(node.right)
g.write(')')
Expand Down
4 changes: 4 additions & 0 deletions vlib/v/gen/c/str.v
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,10 @@ fn (mut g Gen) gen_expr_to_string(expr ast.Expr, etype ast.Type) {
if temp_var_needed {
g.write(tmp_var)
} else {
if expr is ast.StructInit && g.table.final_sym(expr.typ).is_primitive_fixed_array() {
s := g.styp(expr.typ)
g.write('(${s})')
}
g.expr_with_cast(expr, typ, typ)
}
} else if typ.has_flag(.option) {
Expand Down
18 changes: 18 additions & 0 deletions vlib/v/tests/assert_alias_array_test.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
type Arr = [4]u8
type Arr2 = []u8
type ArrStr = [4]string

fn test_main() {
a := Arr{}
b := Arr{}

assert a == b
assert Arr{} == Arr{}
assert Arr{} == [4]u8{}
assert Arr{} == [u8(0), 0, 0, 0]!

assert Arr2{} == Arr2{}
assert Arr2{} == []u8{}

assert ArrStr{} == ArrStr{}
}

0 comments on commit 9e71e32

Please sign in to comment.