diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 8a3213882c..0a7917fa5e 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -2971,7 +2971,7 @@ fn transCreateNodeAssign( const node = try transCreateNodeVarDecl(rp.c, false, true, tmp); node.eq_token = try appendToken(rp.c, .Equal, "="); - var rhs_node = try transExpr(rp, scope, rhs, .used, .r_value); + var rhs_node = try transExpr(rp, &block_scope.base, rhs, .used, .r_value); if (isBoolRes(rhs_node)) { const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt"); try builtin_node.params.push(rhs_node); @@ -2982,12 +2982,12 @@ fn transCreateNodeAssign( node.semicolon_token = try appendToken(rp.c, .Semicolon, ";"); try block_scope.block_node.statements.push(&node.base); - const lhs_node = try transExpr(rp, scope, lhs, .used, .l_value); + const lhs_node = try transExpr(rp, &block_scope.base, lhs, .used, .l_value); const eq_token = try appendToken(rp.c, .Equal, "="); const ident = try transCreateNodeIdentifier(rp.c, tmp); _ = try appendToken(rp.c, .Semicolon, ";"); - const assign = try transCreateNodeInfixOp(rp, scope, lhs_node, .Assign, eq_token, ident, .used, false); + const assign = try transCreateNodeInfixOp(rp, &block_scope.base, lhs_node, .Assign, eq_token, ident, .used, false); try block_scope.block_node.statements.push(assign); const break_node = try transCreateNodeBreak(rp.c, block_scope.label); diff --git a/test/translate_c.zig b/test/translate_c.zig index 617a45ec2c..728bfd9869 100644 --- a/test/translate_c.zig +++ b/test/translate_c.zig @@ -2241,4 +2241,26 @@ pub fn addCases(cases: *tests.TranslateCContext) void { \\ return if (b > a) b else a; \\} }); + + // TODO: detect to use different block labels here + cases.add("nested assignment", + \\int foo(int *p, int x) { + \\ return *p++ = x; + \\} + , &[_][]const u8{ + \\pub export fn foo(arg_p: [*c]c_int, arg_x: c_int) c_int { + \\ var p = arg_p; + \\ var x = arg_x; + \\ return blk: { + \\ const tmp = x; + \\ (blk: { + \\ const ref = &p; + \\ const tmp_1 = ref.*; + \\ ref.* += 1; + \\ break :blk tmp_1; + \\ }).?.* = tmp; + \\ break :blk tmp; + \\ }; + \\} + }); }