Commit e07888e54c

hryx <codroid@gmail.com>
2019-05-28 03:18:27
expr: FunctionToPointerDecay & ArrayToPointerDecay for ImplicitCastExpr
1 parent 2229986
Changed files (1)
src-self-hosted
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);
 }