Skip to content

Commit

Permalink
C backend: fix lowering comparison when array ptr meets ptr
Browse files Browse the repository at this point in the history
Pointer comparisons were triggering `-Wcompare-distinct-pointer-types`
before this fix, which adds `(void*)` casts if the lhs type and rhs type
do not match pointer sizeness.
  • Loading branch information
andrewrk committed Apr 25, 2023
1 parent 401b7f6 commit badad16
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/codegen/c.zig
Original file line number Diff line number Diff line change
Expand Up @@ -3825,8 +3825,8 @@ fn airCmpOp(
data: anytype,
operator: std.math.CompareOperator,
) !CValue {
const operand_ty = f.air.typeOf(data.lhs);
const scalar_ty = operand_ty.scalarType();
const lhs_ty = f.air.typeOf(data.lhs);
const scalar_ty = lhs_ty.scalarType();

const target = f.object.dg.module.getTarget();
const scalar_bits = scalar_ty.bitSize(target);
Expand All @@ -3847,17 +3847,21 @@ fn airCmpOp(
const rhs = try f.resolveInst(data.rhs);
try reap(f, inst, &.{ data.lhs, data.rhs });

const rhs_ty = f.air.typeOf(data.rhs);
const need_cast = lhs_ty.isSinglePointer() != rhs_ty.isSinglePointer();
const writer = f.object.writer();
const local = try f.allocLocal(inst, inst_ty);
const v = try Vectorize.start(f, inst, writer, operand_ty);
const v = try Vectorize.start(f, inst, writer, lhs_ty);
try f.writeCValue(writer, local, .Other);
try v.elem(f, writer);
try writer.writeAll(" = ");
if (need_cast) try writer.writeAll("(void*)");
try f.writeCValue(writer, lhs, .Other);
try v.elem(f, writer);
try writer.writeByte(' ');
try writer.writeAll(compareOperatorC(operator));
try writer.writeByte(' ');
if (need_cast) try writer.writeAll("(void*)");
try f.writeCValue(writer, rhs, .Other);
try v.elem(f, writer);
try writer.writeAll(";\n");
Expand Down

0 comments on commit badad16

Please sign in to comment.