| ... | ... | @@ -356,6 +356,7 @@ fn transBinaryOperator( |
| 356 | 356 | result_used: ResultUsed, |
| 357 | 357 | ) TransError!TransResult { |
| 358 | 358 | const op = ZigClangBinaryOperator_getOpcode(stmt); |
| 359 | const qt = ZigClangBinaryOperator_getType(stmt); |
| 359 | 360 | switch (op) { |
| 360 | 361 | .PtrMemD, .PtrMemI, .Cmp => return revertAndWarn( |
| 361 | 362 | rp, |
| ... | ... | @@ -369,11 +370,31 @@ fn transBinaryOperator( |
| 369 | 370 | .child_scope = scope, |
| 370 | 371 | .node_scope = scope, |
| 371 | 372 | }, |
| 373 | .Add => { |
| 374 | const node = if (cIsUnsignedInteger(qt)) |
| 375 | try transCreateNodeInfixOp(rp, scope, stmt, .AddWrap, .PlusPercent, "+%") |
| 376 | else |
| 377 | try transCreateNodeInfixOp(rp, scope, stmt, .Add, .Plus, "+"); |
| 378 | return maybeSuppressResult(rp, scope, result_used, TransResult{ |
| 379 | .node = &node.base, |
| 380 | .child_scope = scope, |
| 381 | .node_scope = scope, |
| 382 | }); |
| 383 | }, |
| 384 | .Sub => { |
| 385 | const node = if (cIsUnsignedInteger(qt)) |
| 386 | try transCreateNodeInfixOp(rp, scope, stmt, .SubWrap, .MinusPercent, "-%") |
| 387 | else |
| 388 | try transCreateNodeInfixOp(rp, scope, stmt, .Sub, .Minus, "-"); |
| 389 | return maybeSuppressResult(rp, scope, result_used, TransResult{ |
| 390 | .node = &node.base, |
| 391 | .child_scope = scope, |
| 392 | .node_scope = scope, |
| 393 | }); |
| 394 | }, |
| 372 | 395 | .Mul, |
| 373 | 396 | .Div, |
| 374 | 397 | .Rem, |
| 375 | | .Sub, |
| 376 | | .Add, |
| 377 | 398 | .Shl, |
| 378 | 399 | .Shr, |
| 379 | 400 | .LT, |
| ... | ... | @@ -660,7 +681,7 @@ fn transStringLiteral( |
| 660 | 681 | var len: usize = undefined; |
| 661 | 682 | const cstr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len); |
| 662 | 683 | const zstr = try rp.c.str(cstr); |
| 663 | | const token = try appendToken(rp.c, .StringLiteral, zstr); |
| 684 | const token = try appendTokenFmt(rp.c, .StringLiteral, "c\"{}\"", zstr); // TODO: escape string |
| 664 | 685 | const node = try rp.c.a().create(ast.Node.StringLiteral); |
| 665 | 686 | node.* = ast.Node.StringLiteral{ |
| 666 | 687 | .base = ast.Node{ .id = .StringLiteral }, |
| ... | ... | @@ -792,6 +813,8 @@ fn maybeSuppressResult( |
| 792 | 813 | result: TransResult, |
| 793 | 814 | ) !TransResult { |
| 794 | 815 | if (used == .used) return result; |
| 816 | // NOTE: This is backwards, but the semicolon must immediately follow the node. |
| 817 | _ = try appendToken(rp.c, .Semicolon, ";"); |
| 795 | 818 | const lhs = try appendIdentifier(rp.c, "_"); |
| 796 | 819 | const op_token = try appendToken(rp.c, .Equal, "="); |
| 797 | 820 | const op_node = try rp.c.a().create(ast.Node.InfixOp); |
| ... | ... | @@ -985,6 +1008,28 @@ fn transCreateNodePrefixOp( |
| 985 | 1008 | return node; |
| 986 | 1009 | } |
| 987 | 1010 | |
| 1011 | fn transCreateNodeInfixOp( |
| 1012 | rp: RestorePoint, |
| 1013 | scope: *Scope, |
| 1014 | stmt: *const ZigClangBinaryOperator, |
| 1015 | op: ast.Node.InfixOp.Op, |
| 1016 | op_tok_id: std.zig.Token.Id, |
| 1017 | bytes: []const u8, |
| 1018 | ) !*ast.Node.InfixOp { |
| 1019 | const lhs = try transExpr(rp, scope, ZigClangBinaryOperator_getLHS(stmt), .used, .l_value); |
| 1020 | const op_token = try appendToken(rp.c, op_tok_id, bytes); |
| 1021 | const rhs = try transExpr(rp, scope, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value); |
| 1022 | const node = try rp.c.a().create(ast.Node.InfixOp); |
| 1023 | node.* = ast.Node.InfixOp{ |
| 1024 | .base = ast.Node{ .id = .InfixOp }, |
| 1025 | .op_token = op_token, |
| 1026 | .lhs = lhs.node, |
| 1027 | .op = op, |
| 1028 | .rhs = rhs.node, |
| 1029 | }; |
| 1030 | return node; |
| 1031 | } |
| 1032 | |
| 988 | 1033 | fn transCreateNodePtrType( |
| 989 | 1034 | c: *Context, |
| 990 | 1035 | is_const: bool, |