Commit 7b62d5dfd8

Andrew Kelley <andrew@ziglang.org>
2020-01-01 03:01:49
translate-c: propagate scope properly in nested assignment
1 parent 42945a2
Changed files (2)
src-self-hosted
test
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);
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;
+        \\    };
+        \\}
+    });
 }