authorgravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-23 17:17:21-07:00
committergravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-23 17:17:21-07:00
logf845994839697315aba7c4d4ce80d04d0d7b8ab0
tree96d8905bd4b3e9e9de577b66dec201ed3e8b5f52
parent69b90e0681bb42980eeb8364e50686a1f9702eb5
signaturelock-open Commit is signed but in an unrecognized format.

transBinaryOperator: Add, Sub


4 files changed, 55 insertions(+), 3 deletions(-)

src-self-hosted/clang.zig+1
......@@ -965,6 +965,7 @@ pub extern fn ZigClangBinaryOperator_getOpcode(*const ZigClangBinaryOperator) Zi
965965pub extern fn ZigClangBinaryOperator_getBeginLoc(*const ZigClangBinaryOperator) ZigClangSourceLocation;
966966pub extern fn ZigClangBinaryOperator_getLHS(*const ZigClangBinaryOperator) *const ZigClangExpr;
967967pub extern fn ZigClangBinaryOperator_getRHS(*const ZigClangBinaryOperator) *const ZigClangExpr;
968pub extern fn ZigClangBinaryOperator_getType(*const ZigClangBinaryOperator) ZigClangQualType;
968969
969970pub extern fn ZigClangStringLiteral_getKind(*const ZigClangStringLiteral) ZigClangStringLiteral_StringKind;
970971pub extern fn ZigClangStringLiteral_getString_bytes_begin_size(*const ZigClangStringLiteral, *usize) [*c]const u8;
src-self-hosted/translate_c.zig+48-3
......@@ -356,6 +356,7 @@ fn transBinaryOperator(
356356 result_used: ResultUsed,
357357) TransError!TransResult {
358358 const op = ZigClangBinaryOperator_getOpcode(stmt);
359 const qt = ZigClangBinaryOperator_getType(stmt);
359360 switch (op) {
360361 .PtrMemD, .PtrMemI, .Cmp => return revertAndWarn(
361362 rp,
......@@ -369,11 +370,31 @@ fn transBinaryOperator(
369370 .child_scope = scope,
370371 .node_scope = scope,
371372 },
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 },
372395 .Mul,
373396 .Div,
374397 .Rem,
375 .Sub,
376 .Add,
377398 .Shl,
378399 .Shr,
379400 .LT,
......@@ -660,7 +681,7 @@ fn transStringLiteral(
660681 var len: usize = undefined;
661682 const cstr = ZigClangStringLiteral_getString_bytes_begin_size(stmt, &len);
662683 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
664685 const node = try rp.c.a().create(ast.Node.StringLiteral);
665686 node.* = ast.Node.StringLiteral{
666687 .base = ast.Node{ .id = .StringLiteral },
......@@ -792,6 +813,8 @@ fn maybeSuppressResult(
792813 result: TransResult,
793814) !TransResult {
794815 if (used == .used) return result;
816 // NOTE: This is backwards, but the semicolon must immediately follow the node.
817 _ = try appendToken(rp.c, .Semicolon, ";");
795818 const lhs = try appendIdentifier(rp.c, "_");
796819 const op_token = try appendToken(rp.c, .Equal, "=");
797820 const op_node = try rp.c.a().create(ast.Node.InfixOp);
......@@ -985,6 +1008,28 @@ fn transCreateNodePrefixOp(
9851008 return node;
9861009}
9871010
1011fn 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
9881033fn transCreateNodePtrType(
9891034 c: *Context,
9901035 is_const: bool,
src/zig_clang.cpp+5
......@@ -2042,3 +2042,8 @@ const struct ZigClangExpr *ZigClangBinaryOperator_getRHS(const struct ZigClangBi
20422042 auto casted = reinterpret_cast<const clang::BinaryOperator *>(self);
20432043 return reinterpret_cast<const struct ZigClangExpr *>(casted->getRHS());
20442044}
2045
2046struct ZigClangQualType ZigClangBinaryOperator_getType(const struct ZigClangBinaryOperator *self) {
2047 auto casted = reinterpret_cast<const clang::BinaryOperator *>(self);
2048 return bitcast(casted->getType());
2049}
src/zig_clang.h+1
......@@ -925,5 +925,6 @@ ZIG_EXTERN_C enum ZigClangBO ZigClangBinaryOperator_getOpcode(const struct ZigCl
925925ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangBinaryOperator_getBeginLoc(const struct ZigClangBinaryOperator *);
926926ZIG_EXTERN_C const struct ZigClangExpr *ZigClangBinaryOperator_getLHS(const struct ZigClangBinaryOperator *);
927927ZIG_EXTERN_C const struct ZigClangExpr *ZigClangBinaryOperator_getRHS(const struct ZigClangBinaryOperator *);
928ZIG_EXTERN_C struct ZigClangQualType ZigClangBinaryOperator_getType(const struct ZigClangBinaryOperator *);
928929
929930#endif