@@ -214,21 +214,22 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
214214 field_type := g.unwrap (field.typ)
215215 field_name := c_name (field.name)
216216
217- left_arg := g.read_field (left_type, field_name, 'a' )
218- right_arg := g.read_field (left_type, field_name, 'b' )
217+ mut left_arg := g.read_field (left_type, field_name, 'a' )
218+ mut right_arg := g.read_field (left_type, field_name, 'b' )
219219
220220 if field.typ.has_flag (.option) {
221- fn_builder.write_string ('((${left_arg} .state == ${right_arg} .state && ${right_arg} .state == 2) || ' )
221+ fn_builder.write_string ('((${left_arg} .state == ${right_arg} .state && ${right_arg} .state == 2) || ( ${left_arg} .state != 2 && ${right_arg} .state != 2 && ( ' )
222222 }
223223 if field_type.sym.kind == .string {
224224 if field.typ.has_flag (.option) {
225- left_arg_opt := g.read_opt_field (left_type, field_name, 'a' , field.typ)
226- right_arg_opt := g.read_opt_field (left_type, field_name, 'b' , field.typ)
227- fn_builder.write_string ('(((${left_arg_opt} ).len == (${right_arg_opt} ).len && (${left_arg_opt} ).len == 0) || fast_string_eq(${left_arg_opt} , ${right_arg_opt} ))' )
228- } else if field.typ.is_ptr () {
229- fn_builder.write_string ('((${left_arg} ->len == ${right_arg} ->len && ${left_arg} ->len != 0) || fast_string_eq(*(${left_arg} ), *(${right_arg} )))' )
225+ left_arg = g.read_opt_field (left_type, field_name, 'a' , field.typ)
226+ right_arg = g.read_opt_field (left_type, field_name, 'b' , field.typ)
227+ }
228+
229+ if field.typ.is_ptr () {
230+ fn_builder.write_string ('(${left_arg} == ${right_arg} || (${left_arg} != 0 && ${right_arg} != 0 && ((${left_arg} )->len == (${right_arg} )->len && (${left_arg} )->len == 0) || fast_string_eq(*(${left_arg} ), *(${right_arg} ))))' )
230231 } else {
231- fn_builder.write_string ('((${left_arg} .len == ${right_arg} .len && ${left_arg} .len ! = 0) || fast_string_eq(${left_arg} , ${right_arg} ))' )
232+ fn_builder.write_string ('((${left_arg} .len == ${right_arg} .len && ${left_arg} .len = = 0) || fast_string_eq(${left_arg} , ${right_arg} ))' )
232233 }
233234 } else if field_type.sym.kind == .sum_type && ! field.typ.is_ptr () {
234235 eq_fn := g.gen_sumtype_equality_fn (field.typ)
@@ -260,7 +261,7 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
260261 fn_builder.write_string ('${eq_fn} _alias_eq(${left_arg} , ${right_arg} )' )
261262 }
262263 } else if field_type.sym.kind == .function && ! field.typ.has_flag (.option) {
263- fn_builder.write_string ('* ((voidptr*)(${left_arg} )) == * ((voidptr*)(${right_arg} ))' )
264+ fn_builder.write_string ('((voidptr*)(${left_arg} )) == ((voidptr*)(${right_arg} ))' )
264265 } else if field_type.sym.kind == .interface
265266 && (! field.typ.has_flag (.option) || ! field.typ.is_ptr ()) {
266267 ptr := if field.typ.is_ptr () { '*' .repeat (field.typ.nr_muls ()) } else { '' }
@@ -278,7 +279,7 @@ fn (mut g Gen) gen_struct_equality_fn(left_type ast.Type) string {
278279 fn_builder.write_string ('${left_arg} == ${right_arg} ' )
279280 }
280281 if field.typ.has_flag (.option) {
281- fn_builder.write_string (')' )
282+ fn_builder.write_string ('))) ' )
282283 }
283284 }
284285 } else {
0 commit comments