| ... | ... | @@ -1273,7 +1273,7 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) |
| 1273 | 1273 | try transExprCoercing(rp, scope, expr, .used, .r_value) |
| 1274 | 1274 | else |
| 1275 | 1275 | try transCreateNodeUndefinedLiteral(c); |
| 1276 | | if (isBoolRes(init_node)) { |
| 1276 | if (!qualTypeIsBoolean(qual_type) and isBoolRes(init_node)) { |
| 1277 | 1277 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt"); |
| 1278 | 1278 | try builtin_node.params.push(init_node); |
| 1279 | 1279 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| ... | ... | @@ -1339,9 +1339,13 @@ fn transImplicitCastExpr( |
| 1339 | 1339 | return transCreateNodeInfixOp(rp, scope, &ptr_to_int.base, .BangEqual, op_token, rhs_node, result_used, false); |
| 1340 | 1340 | }, |
| 1341 | 1341 | .IntegralToBoolean => { |
| 1342 | | // val != 0 |
| 1343 | 1342 | const node = try transExpr(rp, scope, sub_expr, .used, .r_value); |
| 1344 | 1343 | |
| 1344 | // The expression is already a boolean one, return it as-is |
| 1345 | if (isBoolRes(node)) |
| 1346 | return node; |
| 1347 | |
| 1348 | // val != 0 |
| 1345 | 1349 | const op_token = try appendToken(rp.c, .BangEqual, "!="); |
| 1346 | 1350 | const rhs_node = try transCreateNodeInt(rp.c, 0); |
| 1347 | 1351 | return transCreateNodeInfixOp(rp, scope, node, .BangEqual, op_token, rhs_node, result_used, false); |
| ... | ... | @@ -1397,6 +1401,10 @@ fn transBoolExpr( |
| 1397 | 1401 | } |
| 1398 | 1402 | } |
| 1399 | 1403 | |
| 1404 | fn exprIsBooleanType(expr: *const ZigClangExpr) bool { |
| 1405 | return qualTypeIsBoolean(ZigClangExpr_getType(expr)); |
| 1406 | } |
| 1407 | |
| 1400 | 1408 | fn isBoolRes(res: *ast.Node) bool { |
| 1401 | 1409 | switch (res.id) { |
| 1402 | 1410 | .InfixOp => switch (@fieldParentPtr(ast.Node.InfixOp, "base", res).op) { |
| ... | ... | @@ -1726,6 +1734,14 @@ fn transCCast( |
| 1726 | 1734 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| 1727 | 1735 | return &builtin_node.base; |
| 1728 | 1736 | } |
| 1737 | if (ZigClangType_isBooleanType(qualTypeCanon(src_type)) and |
| 1738 | !ZigClangType_isBooleanType(qualTypeCanon(dst_type))) |
| 1739 | { |
| 1740 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt"); |
| 1741 | try builtin_node.params.push(expr); |
| 1742 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| 1743 | return &builtin_node.base; |
| 1744 | } |
| 1729 | 1745 | if (ZigClangQualType_getTypeClass(ZigClangQualType_getCanonicalType(dst_type)) == .Enum) { |
| 1730 | 1746 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@intToEnum"); |
| 1731 | 1747 | try builtin_node.params.push(try transQualType(rp, dst_type, loc)); |
| ... | ... | @@ -3040,6 +3056,10 @@ fn qualTypeIsPtr(qt: ZigClangQualType) bool { |
| 3040 | 3056 | return ZigClangType_getTypeClass(qualTypeCanon(qt)) == .Pointer; |
| 3041 | 3057 | } |
| 3042 | 3058 | |
| 3059 | fn qualTypeIsBoolean(qt: ZigClangQualType) bool { |
| 3060 | return ZigClangType_isBooleanType(qualTypeCanon(qt)); |
| 3061 | } |
| 3062 | |
| 3043 | 3063 | fn qualTypeIntBitWidth(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigClangSourceLocation) !u32 { |
| 3044 | 3064 | const ty = ZigClangQualType_getTypePtr(qt); |
| 3045 | 3065 | |
| ... | ... | @@ -3316,7 +3336,7 @@ fn transCreateNodeAssign( |
| 3316 | 3336 | const lhs_node = try transExpr(rp, scope, lhs, .used, .l_value); |
| 3317 | 3337 | const eq_token = try appendToken(rp.c, .Equal, "="); |
| 3318 | 3338 | var rhs_node = try transExprCoercing(rp, scope, rhs, .used, .r_value); |
| 3319 | | if (isBoolRes(rhs_node)) { |
| 3339 | if (!exprIsBooleanType(lhs) and isBoolRes(rhs_node)) { |
| 3320 | 3340 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt"); |
| 3321 | 3341 | try builtin_node.params.push(rhs_node); |
| 3322 | 3342 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| ... | ... | @@ -3341,7 +3361,7 @@ fn transCreateNodeAssign( |
| 3341 | 3361 | const node = try transCreateNodeVarDecl(rp.c, false, true, tmp); |
| 3342 | 3362 | node.eq_token = try appendToken(rp.c, .Equal, "="); |
| 3343 | 3363 | var rhs_node = try transExpr(rp, &block_scope.base, rhs, .used, .r_value); |
| 3344 | | if (isBoolRes(rhs_node)) { |
| 3364 | if (!exprIsBooleanType(lhs) and isBoolRes(rhs_node)) { |
| 3345 | 3365 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt"); |
| 3346 | 3366 | try builtin_node.params.push(rhs_node); |
| 3347 | 3367 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |