| ... | @@ -3648,7 +3648,13 @@ fn transUnaryOperator(c: *Context, scope: *Scope, stmt: *const clang.UnaryOperat | ... | @@ -3648,7 +3648,13 @@ fn transUnaryOperator(c: *Context, scope: *Scope, stmt: *const clang.UnaryOperat |
| 3648 | .Plus => return transExpr(c, scope, op_expr, used), | 3648 | .Plus => return transExpr(c, scope, op_expr, used), |
| 3649 | .Minus => { | 3649 | .Minus => { |
| 3650 | if (!qualTypeHasWrappingOverflow(op_expr.getType())) { | 3650 | if (!qualTypeHasWrappingOverflow(op_expr.getType())) { |
| 3651 | return Tag.negate.create(c.arena, try transExpr(c, scope, op_expr, .used)); | 3651 | const sub_expr_node = try transExpr(c, scope, op_expr, .used); |
| | 3652 | const to_negate = if (isBoolRes(sub_expr_node)) blk: { |
| | 3653 | const ty_node = try Tag.type.create(c.arena, "c_int"); |
| | 3654 | const int_node = try Tag.bool_to_int.create(c.arena, sub_expr_node); |
| | 3655 | break :blk try Tag.as.create(c.arena, .{ .lhs = ty_node, .rhs = int_node }); |
| | 3656 | } else sub_expr_node; |
| | 3657 | return Tag.negate.create(c.arena, to_negate); |
| 3652 | } else if (cIsUnsignedInteger(op_expr.getType())) { | 3658 | } else if (cIsUnsignedInteger(op_expr.getType())) { |
| 3653 | // use -% x for unsigned integers | 3659 | // use -% x for unsigned integers |
| 3654 | return Tag.negate_wrap.create(c.arena, try transExpr(c, scope, op_expr, .used)); | 3660 | return Tag.negate_wrap.create(c.arena, try transExpr(c, scope, op_expr, .used)); |