authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-31 21:01:49-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-31 21:01:49-05:00
log7b62d5dfd872de8719cc05c2486f77b261e863e9
tree3ac5172b6172da6d5620de0192cd45d8aa6f170c
parent42945a269ad5d746eed1acb20696723d18ec8653
signature Commit is signed but in an unrecognized format.

translate-c: propagate scope properly in nested assignment


2 files changed, 25 insertions(+), 3 deletions(-)

src-self-hosted/translate_c.zig+3-3
...@@ -2971,7 +2971,7 @@ fn transCreateNodeAssign(...@@ -2971,7 +2971,7 @@ fn transCreateNodeAssign(
29712971
2972 const node = try transCreateNodeVarDecl(rp.c, false, true, tmp);2972 const node = try transCreateNodeVarDecl(rp.c, false, true, tmp);
2973 node.eq_token = try appendToken(rp.c, .Equal, "=");2973 node.eq_token = try appendToken(rp.c, .Equal, "=");
2974 var rhs_node = try transExpr(rp, scope, rhs, .used, .r_value);2974 var rhs_node = try transExpr(rp, &block_scope.base, rhs, .used, .r_value);
2975 if (isBoolRes(rhs_node)) {2975 if (isBoolRes(rhs_node)) {
2976 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt");2976 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@boolToInt");
2977 try builtin_node.params.push(rhs_node);2977 try builtin_node.params.push(rhs_node);
...@@ -2982,12 +2982,12 @@ fn transCreateNodeAssign(...@@ -2982,12 +2982,12 @@ fn transCreateNodeAssign(
2982 node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");2982 node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");
2983 try block_scope.block_node.statements.push(&node.base);2983 try block_scope.block_node.statements.push(&node.base);
29842984
2985 const lhs_node = try transExpr(rp, scope, lhs, .used, .l_value);2985 const lhs_node = try transExpr(rp, &block_scope.base, lhs, .used, .l_value);
2986 const eq_token = try appendToken(rp.c, .Equal, "=");2986 const eq_token = try appendToken(rp.c, .Equal, "=");
2987 const ident = try transCreateNodeIdentifier(rp.c, tmp);2987 const ident = try transCreateNodeIdentifier(rp.c, tmp);
2988 _ = try appendToken(rp.c, .Semicolon, ";");2988 _ = try appendToken(rp.c, .Semicolon, ";");
29892989
2990 const assign = try transCreateNodeInfixOp(rp, scope, lhs_node, .Assign, eq_token, ident, .used, false);2990 const assign = try transCreateNodeInfixOp(rp, &block_scope.base, lhs_node, .Assign, eq_token, ident, .used, false);
2991 try block_scope.block_node.statements.push(assign);2991 try block_scope.block_node.statements.push(assign);
29922992
2993 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);2993 const break_node = try transCreateNodeBreak(rp.c, block_scope.label);
test/translate_c.zig+22
...@@ -2241,4 +2241,26 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -2241,4 +2241,26 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
2241 \\ return if (b > a) b else a;2241 \\ return if (b > a) b else a;
2242 \\}2242 \\}
2243 });2243 });
2244
2245 // TODO: detect to use different block labels here
2246 cases.add("nested assignment",
2247 \\int foo(int *p, int x) {
2248 \\ return *p++ = x;
2249 \\}
2250 , &[_][]const u8{
2251 \\pub export fn foo(arg_p: [*c]c_int, arg_x: c_int) c_int {
2252 \\ var p = arg_p;
2253 \\ var x = arg_x;
2254 \\ return blk: {
2255 \\ const tmp = x;
2256 \\ (blk: {
2257 \\ const ref = &p;
2258 \\ const tmp_1 = ref.*;
2259 \\ ref.* += 1;
2260 \\ break :blk tmp_1;
2261 \\ }).?.* = tmp;
2262 \\ break :blk tmp;
2263 \\ };
2264 \\}
2265 });
2244}2266}