authorgravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-10 23:06:54-07:00
committergravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-06-10 23:06:54-07:00
log0f545e5a2b664d340fe33fe0a8fbc44956485e18
treed101d647b181a7565e4f1e84be3a052e0b8adfc8
parent84e479d94f9998331bdd73665274684cf3d0ad48
signature Commit is signed but in an unrecognized format.

transReturnStmt


4 files changed, 40 insertions(+), 0 deletions(-)

src-self-hosted/clang.zig+2
......@@ -958,3 +958,5 @@ pub const ZigClangAPValue_ValueKind = extern enum {
958958
959959pub extern fn ZigClangIntegerLiteral_EvaluateAsInt(*const ZigClangIntegerLiteral, *ZigClangExprEvalResult, *const ZigClangASTContext) bool;
960960pub extern fn ZigClangIntegerLiteral_getBeginLoc(*const ZigClangIntegerLiteral) ZigClangSourceLocation;
961
962pub extern fn ZigClangReturnStmt_getRetValue(*const ZigClangReturnStmt) ?*const ZigClangExpr;
src-self-hosted/translate_c.zig+31
......@@ -334,6 +334,7 @@ fn transStmt(
334334 .DeclRefExprClass => return transDeclRefExpr(rp, scope, @ptrCast(*const ZigClangDeclRefExpr, stmt), lrvalue),
335335 .ImplicitCastExprClass => return transImplicitCastExpr(rp, scope, @ptrCast(*const ZigClangImplicitCastExpr, stmt), result_used),
336336 .IntegerLiteralClass => return transIntegerLiteral(rp, scope, @ptrCast(*const ZigClangIntegerLiteral, stmt), result_used),
337 .ReturnStmtClass => return transReturnStmt(rp, scope, @ptrCast(*const ZigClangReturnStmt, stmt)),
337338 else => {
338339 return revertAndWarn(
339340 rp,
......@@ -555,6 +556,24 @@ fn transIntegerLiteral(
555556 return maybeSuppressResult(rp, scope, result_used, res);
556557}
557558
559fn transReturnStmt(
560 rp: RestorePoint,
561 scope: *Scope,
562 expr: *const ZigClangReturnStmt,
563) !TransResult {
564 const node = try transCreateNodeReturnExpr(rp.c);
565 if (ZigClangReturnStmt_getRetValue(expr)) |val_expr| {
566 const ret_node = node.cast(ast.Node.ControlFlowExpression).?;
567 ret_node.rhs = (try transExpr(rp, scope, val_expr, .used, .r_value)).node;
568 }
569 _ = try appendToken(rp.c, .Semicolon, ";");
570 return TransResult{
571 .node = node,
572 .child_scope = scope,
573 .node_scope = scope,
574 };
575}
576
558577fn transCCast(
559578 rp: RestorePoint,
560579 scope: *Scope,
......@@ -848,6 +867,18 @@ fn transCreateNodeAPInt(c: *Context, int: ?*const ZigClangAPSInt) !*ast.Node {
848867 return &node.base;
849868}
850869
870fn transCreateNodeReturnExpr(c: *Context) !*ast.Node {
871 const ltoken = try appendToken(c, .Keyword_return, "return");
872 const node = try c.a().create(ast.Node.ControlFlowExpression);
873 node.* = ast.Node.ControlFlowExpression{
874 .base = ast.Node{ .id = .ControlFlowExpression },
875 .ltoken = ltoken,
876 .kind = .Return,
877 .rhs = null,
878 };
879 return &node.base;
880}
881
851882const RestorePoint = struct {
852883 c: *Context,
853884 token_index: ast.TokenIndex,
src/zig_clang.cpp+5
......@@ -2017,3 +2017,8 @@ struct ZigClangSourceLocation ZigClangIntegerLiteral_getBeginLoc(const struct Zi
20172017 auto casted = reinterpret_cast<const clang::IntegerLiteral *>(self);
20182018 return bitcast(casted->getBeginLoc());
20192019}
2020
2021const struct ZigClangExpr *ZigClangReturnStmt_getRetValue(const struct ZigClangReturnStmt *self) {
2022 auto casted = reinterpret_cast<const clang::ReturnStmt *>(self);
2023 return reinterpret_cast<const struct ZigClangExpr *>(casted->getRetValue());
2024}
src/zig_clang.h+2
......@@ -919,4 +919,6 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangCStyleCastExpr_getType(const struct
919919ZIG_EXTERN_C bool ZigClangIntegerLiteral_EvaluateAsInt(const struct ZigClangIntegerLiteral *, struct ZigClangExprEvalResult *, const struct ZigClangASTContext *);
920920ZIG_EXTERN_C struct ZigClangSourceLocation ZigClangIntegerLiteral_getBeginLoc(const struct ZigClangIntegerLiteral *);
921921
922ZIG_EXTERN_C const struct ZigClangExpr *ZigClangReturnStmt_getRetValue(const struct ZigClangReturnStmt *);
923
922924#endif