aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvan Haas <evan@lagerdata.com>2021-11-20 16:03:16 -0800
committerAndrew Kelley <andrew@ziglang.org>2021-11-20 19:52:06 -0500
commitc6b4fe00660d00d0748dc01f660ed7ac24f54db0 (patch)
tree0488f38760efe0c1f8de1955e825de949dc2ecc7 /src
parent4e5a88b28882eda156a46ecc7f70887a7bc0b49b (diff)
downloadzig-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.zig8
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));