| ... | @@ -633,6 +633,7 @@ fn transStmt( | ... | @@ -633,6 +633,7 @@ fn transStmt( |
| 633 | .BreakStmtClass => return transBreak(rp, scope), | 633 | .BreakStmtClass => return transBreak(rp, scope), |
| 634 | .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)), | 634 | .ForStmtClass => return transForLoop(rp, scope, @ptrCast(*const ZigClangForStmt, stmt)), |
| 635 | .FloatingLiteralClass => return transFloatingLiteral(rp, scope, @ptrCast(*const ZigClangFloatingLiteral, stmt), result_used), | 635 | .FloatingLiteralClass => return transFloatingLiteral(rp, scope, @ptrCast(*const ZigClangFloatingLiteral, stmt), result_used), |
| | 636 | .ConditionalOperatorClass => return transConditionalOperator(rp, scope, @ptrCast(*const ZigClangConditionalOperator, stmt), result_used), |
| 636 | else => { | 637 | else => { |
| 637 | return revertAndWarn( | 638 | return revertAndWarn( |
| 638 | rp, | 639 | rp, |
| ... | @@ -1239,11 +1240,11 @@ fn transIfStmt( | ... | @@ -1239,11 +1240,11 @@ fn transIfStmt( |
| 1239 | if_node.condition = try transBoolExpr(rp, &cond_scope.base, @ptrCast(*const ZigClangExpr, ZigClangIfStmt_getCond(stmt)), .used, .r_value, false); | 1240 | if_node.condition = try transBoolExpr(rp, &cond_scope.base, @ptrCast(*const ZigClangExpr, ZigClangIfStmt_getCond(stmt)), .used, .r_value, false); |
| 1240 | _ = try appendToken(rp.c, .RParen, ")"); | 1241 | _ = try appendToken(rp.c, .RParen, ")"); |
| 1241 | | 1242 | |
| 1242 | if_node.body = try transStmt(rp, scope, ZigClangIfStmt_getThen(stmt), .used, .r_value); | 1243 | if_node.body = try transStmt(rp, scope, ZigClangIfStmt_getThen(stmt), .unused, .r_value); |
| 1243 | | 1244 | |
| 1244 | if (ZigClangIfStmt_getElse(stmt)) |expr| { | 1245 | if (ZigClangIfStmt_getElse(stmt)) |expr| { |
| 1245 | if_node.@"else" = try transCreateNodeElse(rp.c); | 1246 | if_node.@"else" = try transCreateNodeElse(rp.c); |
| 1246 | if_node.@"else".?.body = try transStmt(rp, scope, expr, .used, .r_value); | 1247 | if_node.@"else".?.body = try transStmt(rp, scope, expr, .unused, .r_value); |
| 1247 | } | 1248 | } |
| 1248 | _ = try appendToken(rp.c, .Semicolon, ";"); | 1249 | _ = try appendToken(rp.c, .Semicolon, ";"); |
| 1249 | return &if_node.base; | 1250 | return &if_node.base; |
| ... | @@ -1429,6 +1430,43 @@ fn transFloatingLiteral(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangFl | ... | @@ -1429,6 +1430,43 @@ fn transFloatingLiteral(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangFl |
| 1429 | return maybeSuppressResult(rp, scope, used, &node.base); | 1430 | return maybeSuppressResult(rp, scope, used, &node.base); |
| 1430 | } | 1431 | } |
| 1431 | | 1432 | |
| | 1433 | fn transConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangConditionalOperator, used: ResultUsed) TransError!*ast.Node { |
| | 1434 | const gropued = scope.id == .Condition; |
| | 1435 | const lparen = if (gropued) try appendToken(rp.c, .LParen, "(") else undefined; |
| | 1436 | const if_node = try transCreateNodeIf(rp.c); |
| | 1437 | var cond_scope = Scope.Condition{ |
| | 1438 | .base = .{ |
| | 1439 | .parent = scope, |
| | 1440 | .id = .Condition, |
| | 1441 | }, |
| | 1442 | }; |
| | 1443 | |
| | 1444 | const cond_expr = ZigClangConditionalOperator_getCond(stmt); |
| | 1445 | const true_expr = ZigClangConditionalOperator_getTrueExpr(stmt); |
| | 1446 | const false_expr = ZigClangConditionalOperator_getFalseExpr(stmt); |
| | 1447 | |
| | 1448 | if_node.condition = try transBoolExpr(rp, &cond_scope.base, cond_expr, .used, .r_value, false); |
| | 1449 | _ = try appendToken(rp.c, .RParen, ")"); |
| | 1450 | |
| | 1451 | if_node.body = try transExpr(rp, scope, true_expr, .used, .r_value); |
| | 1452 | |
| | 1453 | if_node.@"else" = try transCreateNodeElse(rp.c); |
| | 1454 | if_node.@"else".?.body = try transExpr(rp, scope, false_expr, .used, .r_value); |
| | 1455 | |
| | 1456 | if (gropued) { |
| | 1457 | const rparen = try appendToken(rp.c, .RParen, ")"); |
| | 1458 | const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression); |
| | 1459 | grouped_expr.* = .{ |
| | 1460 | .lparen = lparen, |
| | 1461 | .expr = &if_node.base, |
| | 1462 | .rparen = rparen, |
| | 1463 | }; |
| | 1464 | return maybeSuppressResult(rp, scope, used, &grouped_expr.base); |
| | 1465 | } else { |
| | 1466 | return maybeSuppressResult(rp, scope, used, &if_node.base); |
| | 1467 | } |
| | 1468 | } |
| | 1469 | |
| 1432 | fn maybeSuppressResult( | 1470 | fn maybeSuppressResult( |
| 1433 | rp: RestorePoint, | 1471 | rp: RestorePoint, |
| 1434 | scope: *Scope, | 1472 | scope: *Scope, |