| ... | @@ -356,6 +356,7 @@ fn transBinaryOperator( | ... | @@ -356,6 +356,7 @@ fn transBinaryOperator( |
| 356 | result_used: ResultUsed, | 356 | result_used: ResultUsed, |
| 357 | ) TransError!TransResult { | 357 | ) TransError!TransResult { |
| 358 | const op = ZigClangBinaryOperator_getOpcode(stmt); | 358 | const op = ZigClangBinaryOperator_getOpcode(stmt); |
| | 359 | const qt = ZigClangBinaryOperator_getType(stmt); |
| 359 | switch (op) { | 360 | switch (op) { |
| 360 | .PtrMemD, .PtrMemI, .Cmp => return revertAndWarn( | 361 | .PtrMemD, .PtrMemI, .Cmp => return revertAndWarn( |
| 361 | rp, | 362 | rp, |
| ... | @@ -369,11 +370,31 @@ fn transBinaryOperator( | ... | @@ -369,11 +370,31 @@ fn transBinaryOperator( |
| 369 | .child_scope = scope, | 370 | .child_scope = scope, |
| 370 | .node_scope = scope, | 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 | .Mul, | 395 | .Mul, |
| 373 | .Div, | 396 | .Div, |
| 374 | .Rem, | 397 | .Rem, |
| 375 | .Sub, | | |
| 376 | .Add, | | |
| 377 | .Shl, | 398 | .Shl, |
| 378 | .Shr, | 399 | .Shr, |
| 379 | .LT, | 400 | .LT, |
| ... | @@ -660,7 +681,7 @@ fn transStringLiteral( | ... | @@ -660,7 +681,7 @@ fn transStringLiteral( |
| 660 | var len: usize = undefined; | 681 | var len: usize = undefined; |
| 661 | const cstr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len); | 682 | const cstr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len); |
| 662 | const zstr = try rp.c.str(cstr); | 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 | const node = try rp.c.a().create(ast.Node.StringLiteral); | 685 | const node = try rp.c.a().create(ast.Node.StringLiteral); |
| 665 | node.* = ast.Node.StringLiteral{ | 686 | node.* = ast.Node.StringLiteral{ |
| 666 | .base = ast.Node{ .id = .StringLiteral }, | 687 | .base = ast.Node{ .id = .StringLiteral }, |
| ... | @@ -792,6 +813,8 @@ fn maybeSuppressResult( | ... | @@ -792,6 +813,8 @@ fn maybeSuppressResult( |
| 792 | result: TransResult, | 813 | result: TransResult, |
| 793 | ) !TransResult { | 814 | ) !TransResult { |
| 794 | if (used == .used) return result; | 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 | const lhs = try appendIdentifier(rp.c, "_"); | 818 | const lhs = try appendIdentifier(rp.c, "_"); |
| 796 | const op_token = try appendToken(rp.c, .Equal, "="); | 819 | const op_token = try appendToken(rp.c, .Equal, "="); |
| 797 | const op_node = try rp.c.a().create(ast.Node.InfixOp); | 820 | const op_node = try rp.c.a().create(ast.Node.InfixOp); |
| ... | @@ -985,6 +1008,28 @@ fn transCreateNodePrefixOp( | ... | @@ -985,6 +1008,28 @@ fn transCreateNodePrefixOp( |
| 985 | return node; | 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 | fn transCreateNodePtrType( | 1033 | fn transCreateNodePtrType( |
| 989 | c: *Context, | 1034 | c: *Context, |
| 990 | is_const: bool, | 1035 | is_const: bool, |