From e07888e54c251b6c493ea911cf65aa46eccba67d Mon Sep 17 00:00:00 2001 From: hryx Date: Mon, 27 May 2019 18:18:27 -0700 Subject: [PATCH] expr: FunctionToPointerDecay & ArrayToPointerDecay for ImplicitCastExpr --- src-self-hosted/translate_c.zig | 34 ++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index e33013e1cb..2ccd4eca6d 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -457,14 +457,22 @@ fn transImplicitCastExpr( expr: *const ZigClangImplicitCastExpr, ) !TransResult { const c = rp.c; + const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr); switch (ZigClangImplicitCastExpr_getCastKind(expr)) { .BitCast => { - const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr); const node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value); const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr)); const src_type = getExprQualType(c, sub_expr); return try transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, node.node); }, + .FunctionToPointerDecay, .ArrayToPointerDecay => { + return maybeSuppressResult( + rp, + scope, + .used, + try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value), + ); + }, else => |kind| return revertAndWarn( rp, error.UnsupportedTranslation, @@ -503,6 +511,30 @@ fn findBlockScope(inner: *Scope) *Scope.Block { } } +fn maybeSuppressResult( + rp: RestorePoint, + scope: *Scope, + used: ResultUsed, + result: TransResult, +) !TransResult { + if (used == .used) return result; + const lhs = try appendIdentifier(rp.c, "_"); + const op_token = try appendToken(rp.c, .Equal, "="); + const op_node = try rp.c.a().create(ast.Node.InfixOp); + op_node.* = ast.Node.InfixOp{ + .base = ast.Node{ .id = .InfixOp }, + .op_token = op_token, + .lhs = lhs, + .op = .Assign, + .rhs = result.node, + }; + return TransResult{ + .node = &op_node.base, + .child_scope = scope, + .node_scope = scope, + }; +} + fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void { try c.tree.root_node.decls.push(decl_node); }