authorgravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-05-27 18:18:27-07:00
committergravatar for codroid@gmail.comhryx <codroid@gmail.com> 2019-05-27 18:18:27-07:00
loge07888e54c251b6c493ea911cf65aa46eccba67d
tree16a5de9052c2f3df8b1e956fa52b291109b2bdcf
parent22299869baaa4e65c3dae48b292b1bd8bd4b1c58
signaturelock-open Commit is signed but in an unrecognized format.

expr: FunctionToPointerDecay & ArrayToPointerDecay for ImplicitCastExpr


1 files changed, 33 insertions(+), 1 deletions(-)

src-self-hosted/translate_c.zig+33-1
...@@ -457,14 +457,22 @@ fn transImplicitCastExpr(...@@ -457,14 +457,22 @@ fn transImplicitCastExpr(
457 expr: *const ZigClangImplicitCastExpr,457 expr: *const ZigClangImplicitCastExpr,
458) !TransResult {458) !TransResult {
459 const c = rp.c;459 const c = rp.c;
460 const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr);
460 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {461 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {
461 .BitCast => {462 .BitCast => {
462 const sub_expr = ZigClangImplicitCastExpr_getSubExpr(expr);
463 const node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value);463 const node = try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value);
464 const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr));464 const dest_type = getExprQualType(c, @ptrCast(*const ZigClangExpr, expr));
465 const src_type = getExprQualType(c, sub_expr);465 const src_type = getExprQualType(c, sub_expr);
466 return try transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, node.node);466 return try transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, node.node);
467 },467 },
468 .FunctionToPointerDecay, .ArrayToPointerDecay => {
469 return maybeSuppressResult(
470 rp,
471 scope,
472 .used,
473 try transExpr(rp, scope, @ptrCast(*const ZigClangExpr, sub_expr), .used, .r_value),
474 );
475 },
468 else => |kind| return revertAndWarn(476 else => |kind| return revertAndWarn(
469 rp,477 rp,
470 error.UnsupportedTranslation,478 error.UnsupportedTranslation,
...@@ -503,6 +511,30 @@ fn findBlockScope(inner: *Scope) *Scope.Block {...@@ -503,6 +511,30 @@ fn findBlockScope(inner: *Scope) *Scope.Block {
503 }511 }
504}512}
505513
514fn maybeSuppressResult(
515 rp: RestorePoint,
516 scope: *Scope,
517 used: ResultUsed,
518 result: TransResult,
519) !TransResult {
520 if (used == .used) return result;
521 const lhs = try appendIdentifier(rp.c, "_");
522 const op_token = try appendToken(rp.c, .Equal, "=");
523 const op_node = try rp.c.a().create(ast.Node.InfixOp);
524 op_node.* = ast.Node.InfixOp{
525 .base = ast.Node{ .id = .InfixOp },
526 .op_token = op_token,
527 .lhs = lhs,
528 .op = .Assign,
529 .rhs = result.node,
530 };
531 return TransResult{
532 .node = &op_node.base,
533 .child_scope = scope,
534 .node_scope = scope,
535 };
536}
537
506fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {538fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {
507 try c.tree.root_node.decls.push(decl_node);539 try c.tree.root_node.decls.push(decl_node);
508}540}