diff options
| author | Evan Haas <evan@lagerdata.com> | 2021-11-20 16:03:16 -0800 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-11-20 19:52:06 -0500 |
| commit | c6b4fe00660d00d0748dc01f660ed7ac24f54db0 (patch) | |
| tree | 0488f38760efe0c1f8de1955e825de949dc2ecc7 /src | |
| parent | 4e5a88b28882eda156a46ecc7f70887a7bc0b49b (diff) | |
| download | zig-c6b4fe00660d00d0748dc01f660ed7ac24f54db0.tar.gz zig-c6b4fe00660d00d0748dc01f660ed7ac24f54db0.zip | |
translate-c: coerce boolean results to c_int when negated
Fixes #10175
Diffstat (limited to 'src')
| -rw-r--r-- | src/translate_c.zig | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/translate_c.zig b/src/translate_c.zig index 5358154e5d..b76bb59300 100644 --- a/src/translate_c.zig +++ b/src/translate_c.zig @@ -3648,7 +3648,13 @@ fn transUnaryOperator(c: *Context, scope: *Scope, stmt: *const clang.UnaryOperat .Plus => return transExpr(c, scope, op_expr, used), .Minus => { if (!qualTypeHasWrappingOverflow(op_expr.getType())) { - return Tag.negate.create(c.arena, try transExpr(c, scope, op_expr, .used)); + const sub_expr_node = try transExpr(c, scope, op_expr, .used); + const to_negate = if (isBoolRes(sub_expr_node)) blk: { + const ty_node = try Tag.type.create(c.arena, "c_int"); + const int_node = try Tag.bool_to_int.create(c.arena, sub_expr_node); + break :blk try Tag.as.create(c.arena, .{ .lhs = ty_node, .rhs = int_node }); + } else sub_expr_node; + return Tag.negate.create(c.arena, to_negate); } else if (cIsUnsignedInteger(op_expr.getType())) { // use -% x for unsigned integers return Tag.negate_wrap.create(c.arena, try transExpr(c, scope, op_expr, .used)); |
