| ... | ... | @@ -2213,32 +2213,32 @@ fn transUnaryExprOrTypeTraitExpr( |
| 2213 | 2213 | return maybeSuppressResult(rp, scope, result_used, &builtin_node.base); |
| 2214 | 2214 | } |
| 2215 | 2215 | |
| 2216 | | fn qualTypeHaswrappingOverflow(qt: ZigClangQualType) bool { |
| 2217 | | if (cIsSignedInteger(qt) or cIsFloating(qt)) { |
| 2218 | | // float and signed integer overflow is undefined behavior. |
| 2219 | | return false; |
| 2220 | | } else { |
| 2216 | fn qualTypeHasWrappingOverflow(qt: ZigClangQualType) bool { |
| 2217 | if (cIsUnsignedInteger(qt)) { |
| 2221 | 2218 | // unsigned integer overflow wraps around. |
| 2222 | 2219 | return true; |
| 2220 | } else { |
| 2221 | // float, signed integer, and pointer overflow is undefined behavior. |
| 2222 | return false; |
| 2223 | 2223 | } |
| 2224 | 2224 | } |
| 2225 | 2225 | |
| 2226 | 2226 | fn transUnaryOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangUnaryOperator, used: ResultUsed) TransError!*ast.Node { |
| 2227 | 2227 | const op_expr = ZigClangUnaryOperator_getSubExpr(stmt); |
| 2228 | 2228 | switch (ZigClangUnaryOperator_getOpcode(stmt)) { |
| 2229 | | .PostInc => if (qualTypeHaswrappingOverflow(ZigClangUnaryOperator_getType(stmt))) |
| 2229 | .PostInc => if (qualTypeHasWrappingOverflow(ZigClangUnaryOperator_getType(stmt))) |
| 2230 | 2230 | return transCreatePostCrement(rp, scope, stmt, .AssignAddWrap, .PlusPercentEqual, "+%=", used) |
| 2231 | 2231 | else |
| 2232 | 2232 | return transCreatePostCrement(rp, scope, stmt, .AssignAdd, .PlusEqual, "+=", used), |
| 2233 | | .PostDec => if (qualTypeHaswrappingOverflow(ZigClangUnaryOperator_getType(stmt))) |
| 2233 | .PostDec => if (qualTypeHasWrappingOverflow(ZigClangUnaryOperator_getType(stmt))) |
| 2234 | 2234 | return transCreatePostCrement(rp, scope, stmt, .AssignSubWrap, .MinusPercentEqual, "-%=", used) |
| 2235 | 2235 | else |
| 2236 | 2236 | return transCreatePostCrement(rp, scope, stmt, .AssignSub, .MinusEqual, "-=", used), |
| 2237 | | .PreInc => if (qualTypeHaswrappingOverflow(ZigClangUnaryOperator_getType(stmt))) |
| 2237 | .PreInc => if (qualTypeHasWrappingOverflow(ZigClangUnaryOperator_getType(stmt))) |
| 2238 | 2238 | return transCreatePreCrement(rp, scope, stmt, .AssignAddWrap, .PlusPercentEqual, "+%=", used) |
| 2239 | 2239 | else |
| 2240 | 2240 | return transCreatePreCrement(rp, scope, stmt, .AssignAdd, .PlusEqual, "+=", used), |
| 2241 | | .PreDec => if (qualTypeHaswrappingOverflow(ZigClangUnaryOperator_getType(stmt))) |
| 2241 | .PreDec => if (qualTypeHasWrappingOverflow(ZigClangUnaryOperator_getType(stmt))) |
| 2242 | 2242 | return transCreatePreCrement(rp, scope, stmt, .AssignSubWrap, .MinusPercentEqual, "-%=", used) |
| 2243 | 2243 | else |
| 2244 | 2244 | return transCreatePreCrement(rp, scope, stmt, .AssignSub, .MinusEqual, "-=", used), |
| ... | ... | @@ -2258,7 +2258,7 @@ fn transUnaryOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangUnar |
| 2258 | 2258 | }, |
| 2259 | 2259 | .Plus => return transExpr(rp, scope, op_expr, used, .r_value), |
| 2260 | 2260 | .Minus => { |
| 2261 | | if (!qualTypeHaswrappingOverflow(ZigClangExpr_getType(op_expr))) { |
| 2261 | if (!qualTypeHasWrappingOverflow(ZigClangExpr_getType(op_expr))) { |
| 2262 | 2262 | const op_node = try transCreateNodePrefixOp(rp.c, .Negation, .Minus, "-"); |
| 2263 | 2263 | op_node.rhs = try transExpr(rp, scope, op_expr, .used, .r_value); |
| 2264 | 2264 | return &op_node.base; |
| ... | ... | @@ -2426,15 +2426,15 @@ fn transCreatePostCrement( |
| 2426 | 2426 | |
| 2427 | 2427 | fn transCompoundAssignOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundAssignOperator, used: ResultUsed) TransError!*ast.Node { |
| 2428 | 2428 | switch (ZigClangCompoundAssignOperator_getOpcode(stmt)) { |
| 2429 | | .MulAssign => if (qualTypeHaswrappingOverflow(ZigClangCompoundAssignOperator_getType(stmt))) |
| 2429 | .MulAssign => if (qualTypeHasWrappingOverflow(ZigClangCompoundAssignOperator_getType(stmt))) |
| 2430 | 2430 | return transCreateCompoundAssign(rp, scope, stmt, .AssignMulWrap, .AsteriskPercentEqual, "*%=", .MulWrap, .AsteriskPercent, "*%", used) |
| 2431 | 2431 | else |
| 2432 | 2432 | return transCreateCompoundAssign(rp, scope, stmt, .AssignMul, .AsteriskEqual, "*=", .Mul, .Asterisk, "*", used), |
| 2433 | | .AddAssign => if (qualTypeHaswrappingOverflow(ZigClangCompoundAssignOperator_getType(stmt))) |
| 2433 | .AddAssign => if (qualTypeHasWrappingOverflow(ZigClangCompoundAssignOperator_getType(stmt))) |
| 2434 | 2434 | return transCreateCompoundAssign(rp, scope, stmt, .AssignAddWrap, .PlusPercentEqual, "+%=", .AddWrap, .PlusPercent, "+%", used) |
| 2435 | 2435 | else |
| 2436 | 2436 | return transCreateCompoundAssign(rp, scope, stmt, .AssignAdd, .PlusEqual, "+=", .Add, .Plus, "+", used), |
| 2437 | | .SubAssign => if (qualTypeHaswrappingOverflow(ZigClangCompoundAssignOperator_getType(stmt))) |
| 2437 | .SubAssign => if (qualTypeHasWrappingOverflow(ZigClangCompoundAssignOperator_getType(stmt))) |
| 2438 | 2438 | return transCreateCompoundAssign(rp, scope, stmt, .AssignSubWrap, .MinusPercentEqual, "-%=", .SubWrap, .MinusPercent, "-%", used) |
| 2439 | 2439 | else |
| 2440 | 2440 | return transCreateCompoundAssign(rp, scope, stmt, .AssignSub, .MinusPercentEqual, "-=", .Sub, .Minus, "-", used), |